diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f0bd414ebd7371d402b5d3f54089e92dedab52c8..7f5d334766005bbf321848137ac2f023646948d5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -81,6 +81,7 @@ jobs: - name: Run Playwright tests run: | cd lynxkite-app/web + npm run build npm run test - uses: actions/upload-artifact@v4 diff --git a/Dockerfile b/Dockerfile index 953fd64a05f143211a2e247b850b72a06f943759..e87fa83062e248cbd0e30cda40abf8a9a219b0e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,12 +5,16 @@ USER node ENV HOME=/home/node PATH=/home/node/.local/bin:$PATH WORKDIR $HOME/app COPY --chown=node . $HOME/app -RUN uv venv && uv pip install \ +ENV GIT_SSH_COMMAND="ssh -i /run/secrets/LYNXSCRIBE_DEPLOY_KEY -o StrictHostKeyChecking=no" +RUN --mount=type=secret,id=LYNXSCRIBE_DEPLOY_KEY,mode=0444,required=true \ + uv venv && uv pip install \ -e lynxkite-core \ -e lynxkite-app \ -e lynxkite-graph-analytics \ -e lynxkite-bio \ - -e lynxkite-pillow-example + -e lynxkite-lynxscribe \ + -e lynxkite-pillow-example \ + chromadb openai WORKDIR $HOME/app/examples ENV PORT=7860 CMD ["uv", "run", "lynxkite"] diff --git a/biome.json b/biome.json index 36e6d4044fca6a8dcd976ddece803d3333463c67..8241ee4754cb6ed78c419474919d49a7a67ffd15 100644 --- a/biome.json +++ b/biome.json @@ -1,6 +1,10 @@ { + "files": { + "ignore": ["**/*.lynxkite.json"] + }, "formatter": { "ignore": ["**/node_modules/**", "**/dist/**"], + "lineWidth": 100, "indentStyle": "space" }, "linter": { @@ -20,6 +24,7 @@ "useKeyWithClickEvents": "off", "useValidAnchor": "off", "useButtonType": "off", + "noAutofocus": "off", "noNoninteractiveTabindex": "off" } } diff --git a/examples/AIMO b/examples/AIMO.lynxkite.json similarity index 100% rename from examples/AIMO rename to examples/AIMO.lynxkite.json diff --git a/examples/Airlines demo b/examples/Airlines demo.lynxkite.json similarity index 100% rename from examples/Airlines demo rename to examples/Airlines demo.lynxkite.json diff --git a/examples/Bio demo b/examples/Bio demo.lynxkite.json similarity index 100% rename from examples/Bio demo rename to examples/Bio demo.lynxkite.json diff --git a/examples/BioNeMo demo b/examples/BioNeMo demo.lynxkite.json similarity index 100% rename from examples/BioNeMo demo rename to examples/BioNeMo demo.lynxkite.json diff --git a/examples/Generative drug screening.lynxkite.json b/examples/Generative drug screening.lynxkite.json new file mode 100644 index 0000000000000000000000000000000000000000..334df4018f2d176f38626c974b4645dea19aafac --- /dev/null +++ b/examples/Generative drug screening.lynxkite.json @@ -0,0 +1,873 @@ +{ + "edges": [ + { + "id": "Import file 2 Query GenMol 1", + "source": "Import file 2", + "sourceHandle": "output", + "target": "Query GenMol 1", + "targetHandle": "bundle" + }, + { + "id": "Import file 1 MSA-search 1", + "source": "Import file 1", + "sourceHandle": "output", + "target": "MSA-search 1", + "targetHandle": "bundle" + }, + { + "id": "Query GenMol 1 Query DiffDock 1", + "source": "Query GenMol 1", + "sourceHandle": "output", + "target": "Query DiffDock 1", + "targetHandle": "ligands" + }, + { + "id": "Query DiffDock 1 View molecules 1", + "source": "Query DiffDock 1", + "sourceHandle": "output", + "target": "View molecules 1", + "targetHandle": "bundle" + }, + { + "id": "MSA-search 1 Query OpenFold2 1", + "source": "MSA-search 1", + "sourceHandle": "output", + "target": "Query OpenFold2 1", + "targetHandle": "bundle" + }, + { + "id": "Query OpenFold2 1 View molecules 3", + "source": "Query OpenFold2 1", + "sourceHandle": "output", + "target": "View molecules 3", + "targetHandle": "bundle" + }, + { + "id": "Query OpenFold2 1 Query DiffDock 1", + "source": "Query OpenFold2 1", + "sourceHandle": "output", + "target": "Query DiffDock 1", + "targetHandle": "proteins" + } + ], + "env": "LynxKite Graph Analytics", + "nodes": [ + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Import file", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "file_format": { + "default": "csv", + "groups": { + "csv": [ + { + "default": "", + "name": "columns", + "type": { + "type": "" + } + }, + { + "default": "", + "name": "separator", + "type": { + "type": "" + } + } + ], + "excel": [ + { + "default": "Sheet1", + "name": "sheet_name", + "type": { + "type": "" + } + } + ], + "json": [], + "parquet": [] + }, + "name": "file_format", + "selector": { + "default": "csv", + "name": "file_format", + "type": { + "enum": [ + "csv", + "parquet", + "json", + "excel" + ] + } + }, + "type": "group" + }, + "file_path": { + "default": null, + "name": "file_path", + "type": { + "type": "" + } + }, + "table_name": { + "default": null, + "name": "table_name", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "columns": "", + "file_format": "csv", + "file_path": "uploads/protein.csv", + "separator": "", + "table_name": "" + }, + "status": "done", + "title": "Import file" + }, + "dragHandle": ".bg-primary", + "height": 487.0, + "id": "Import file 1", + "position": { + "x": -755.0582906538923, + "y": 543.770372030674 + }, + "type": "basic", + "width": 439.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": {}, + "name": "Import file", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "file_format": { + "default": "csv", + "groups": { + "csv": [ + { + "default": "", + "name": "columns", + "type": { + "type": "" + } + }, + { + "default": "", + "name": "separator", + "type": { + "type": "" + } + } + ], + "excel": [ + { + "default": "Sheet1", + "name": "sheet_name", + "type": { + "type": "" + } + } + ], + "json": [], + "parquet": [] + }, + "name": "file_format", + "selector": { + "default": "csv", + "name": "file_format", + "type": { + "enum": [ + "csv", + "parquet", + "json", + "excel" + ] + } + }, + "type": "group" + }, + "file_path": { + "default": null, + "name": "file_path", + "type": { + "type": "" + } + }, + "table_name": { + "default": null, + "name": "table_name", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "columns": "", + "file_format": "csv", + "file_path": "uploads/molecules.csv", + "separator": "", + "table_name": null + }, + "status": "done", + "title": "Import file" + }, + "dragHandle": ".bg-primary", + "height": 436.0, + "id": "Import file 2", + "position": { + "x": 62.887657256500006, + "y": 1380.6697994924546 + }, + "type": "basic", + "width": 311.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Query GenMol", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "molecule_column": { + "default": null, + "name": "molecule_column", + "type": { + "type": "" + } + }, + "molecule_table": { + "default": null, + "name": "molecule_table", + "type": { + "type": "" + } + }, + "noise": { + "default": 0.2, + "name": "noise", + "type": { + "type": "" + } + }, + "num_molecules": { + "default": 5.0, + "name": "num_molecules", + "type": { + "type": "" + } + }, + "scoring": { + "default": "QED", + "name": "scoring", + "type": { + "type": "" + } + }, + "step_size": { + "default": 4.0, + "name": "step_size", + "type": { + "type": "" + } + }, + "temperature": { + "default": 1.0, + "name": "temperature", + "type": { + "type": "" + } + } + }, + "position": { + "x": 594.0, + "y": 633.0 + }, + "type": "basic" + }, + "params": { + "molecule_column": null, + "molecule_table": null, + "noise": 0.2, + "num_molecules": 5.0, + "scoring": "QED", + "step_size": 4.0, + "temperature": 1.0 + }, + "status": "done", + "title": "Query GenMol" + }, + "dragHandle": ".bg-primary", + "height": 601.0, + "id": "Query GenMol 1", + "position": { + "x": 663.3333333333335, + "y": 1283.3333333333335 + }, + "type": "basic", + "width": 358.0 + }, + { + "data": { + "collapsed": null, + "display": null, + "error": null, + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "MSA-search", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "databases": { + "default": "[\"Uniref30_2302\", \"colabfold_envdb_202108\", \"PDB70_220313\"]", + "name": "databases", + "type": { + "type": "" + } + }, + "e_value": { + "default": 0.0001, + "name": "e_value", + "type": { + "type": "" + } + }, + "iterations": { + "default": 1.0, + "name": "iterations", + "type": { + "type": "" + } + }, + "output_alignment_formats": { + "default": [ + "fasta", + "a3m" + ], + "name": "output_alignment_formats", + "type": { + "type": "list[lynxkite_bio.nims.AlignmentFormats]" + } + }, + "protein_column": { + "default": null, + "name": "protein_column", + "type": { + "type": "" + } + }, + "protein_table": { + "default": null, + "name": "protein_table", + "type": { + "type": "" + } + }, + "search_type": { + "default": "ALPHAFOLD2", + "name": "search_type", + "type": { + "enum": [ + "ALPHAFOLD2", + "ESM2" + ] + } + } + }, + "position": { + "x": 576.0, + "y": 228.0 + }, + "type": "basic" + }, + "params": { + "databases": "[\"Uniref30_2302\", \"colabfold_envdb_202108\", \"PDB70_220313\"]", + "e_value": 0.0001, + "iterations": 1.0, + "output_alignment_formats": [ + "fasta", + "a3m" + ], + "protein_column": null, + "protein_table": null, + "search_type": "ALPHAFOLD2" + }, + "status": "done", + "title": "MSA-search" + }, + "dragHandle": ".bg-primary", + "height": 550.0, + "id": "MSA-search 1", + "position": { + "x": -45.0, + "y": 570.0 + }, + "type": "basic", + "width": 531.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "ligands": { + "name": "ligands", + "position": "left", + "type": { + "type": "" + } + }, + "proteins": { + "name": "proteins", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Query DiffDock", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "ligand_column": { + "default": null, + "name": "ligand_column", + "type": { + "type": "" + } + }, + "ligand_table": { + "default": null, + "name": "ligand_table", + "type": { + "type": "" + } + }, + "num_poses": { + "default": 10.0, + "name": "num_poses", + "type": { + "type": "" + } + }, + "num_steps": { + "default": 18.0, + "name": "num_steps", + "type": { + "type": "" + } + }, + "protein_column": { + "default": null, + "name": "protein_column", + "type": { + "type": "" + } + }, + "protein_table": { + "default": null, + "name": "protein_table", + "type": { + "type": "" + } + }, + "time_divisions": { + "default": 20.0, + "name": "time_divisions", + "type": { + "type": "" + } + } + }, + "position": { + "x": 852.0, + "y": 432.0 + }, + "type": "basic" + }, + "params": { + "ligand_column": null, + "ligand_table": null, + "num_poses": 10.0, + "num_steps": 18.0, + "protein_column": null, + "protein_table": null, + "time_divisions": 20.0 + }, + "status": "done", + "title": "Query DiffDock" + }, + "dragHandle": ".bg-primary", + "height": 635.0, + "id": "Query DiffDock 1", + "position": { + "x": 1543.010053920781, + "y": 1167.386382170133 + }, + "type": "basic", + "width": 408.0 + }, + { + "data": { + "display": { + "series": [ + { + "data": [ + { + "name": "Hydrogen", + "value": 2 + }, + { + "name": "Sulfur", + "value": 1 + }, + { + "name": "Oxygen", + "value": 4 + } + ], + "itemStyle": { + "borderColor": "#fff", + "borderRadius": 10, + "borderWidth": 2 + }, + "radius": [ + "40%", + "70%" + ], + "type": "pie" + } + ] + }, + "error": null, + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View molecules", + "outputs": {}, + "params": { + "color": { + "default": "spectrum", + "name": "color", + "type": { + "type": "" + } + }, + "molecule_column": { + "default": null, + "name": "molecule_column", + "type": { + "type": "" + } + }, + "molecule_table": { + "default": null, + "name": "molecule_table", + "type": { + "type": "" + } + } + }, + "position": { + "x": 1009.0, + "y": 124.0 + }, + "type": "visualization" + }, + "params": { + "color": "spectrum", + "molecule_column": null, + "molecule_table": null + }, + "status": "done", + "title": "View molecules" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "View molecules 3", + "position": { + "x": 1545.0, + "y": 585.0 + }, + "type": "visualization", + "width": 200.0 + }, + { + "data": { + "display": { + "series": [ + { + "data": [ + { + "name": "Hydrogen", + "value": 2 + }, + { + "name": "Sulfur", + "value": 1 + }, + { + "name": "Oxygen", + "value": 4 + } + ], + "itemStyle": { + "borderColor": "#fff", + "borderRadius": 10, + "borderWidth": 2 + }, + "radius": [ + "40%", + "70%" + ], + "type": "pie" + } + ] + }, + "error": null, + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View molecules", + "outputs": {}, + "params": { + "color": { + "default": "spectrum", + "name": "color", + "type": { + "type": "" + } + }, + "molecule_column": { + "default": null, + "name": "molecule_column", + "type": { + "type": "" + } + }, + "molecule_table": { + "default": null, + "name": "molecule_table", + "type": { + "type": "" + } + } + }, + "position": { + "x": 859.0, + "y": 225.0 + }, + "type": "visualization" + }, + "params": { + "color": "spectrum", + "molecule_column": null, + "molecule_table": null + }, + "status": "done", + "title": "View molecules" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "View molecules 1", + "position": { + "x": 2230.0, + "y": 1598.3333333333333 + }, + "type": "visualization", + "width": 200.0 + }, + { + "data": { + "display": null, + "error": null, + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Query OpenFold2", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "alignment_column": { + "default": null, + "name": "alignment_column", + "type": { + "type": "" + } + }, + "alignment_table": { + "default": null, + "name": "alignment_table", + "type": { + "type": "" + } + }, + "databases": { + "default": "[\"Uniref30_2302\", \"colabfold_envdb_202108\", \"PDB70_220313\"]", + "name": "databases", + "type": { + "type": "" + } + }, + "protein_column": { + "default": null, + "name": "protein_column", + "type": { + "type": "" + } + }, + "protein_table": { + "default": null, + "name": "protein_table", + "type": { + "type": "" + } + }, + "relaxed_prediction": { + "default": false, + "name": "relaxed_prediction", + "type": { + "type": "" + } + }, + "use_templates": { + "default": false, + "name": "use_templates", + "type": { + "type": "" + } + } + }, + "position": { + "x": 628.0, + "y": 184.0 + }, + "type": "basic" + }, + "params": { + "alignment_column": null, + "alignment_table": null, + "databases": "[\"Uniref30_2302\", \"colabfold_envdb_202108\", \"PDB70_220313\"]", + "protein_column": null, + "protein_table": null, + "relaxed_prediction": false, + "use_templates": false + }, + "status": "done", + "title": "Query OpenFold2" + }, + "dragHandle": ".bg-primary", + "height": 653.0, + "id": "Query OpenFold2 1", + "position": { + "x": 750.0, + "y": 480.0 + }, + "type": "basic", + "width": 523.0 + } + ] +} diff --git a/examples/Graph RAG b/examples/Graph RAG.lynxkite.json similarity index 99% rename from examples/Graph RAG rename to examples/Graph RAG.lynxkite.json index 8000de71c1cfe5e9747260cbf45eb0f73e3adc54..a1cf2cae21ea18eca232181ea9f9d2fa836e3524 100644 --- a/examples/Graph RAG +++ b/examples/Graph RAG.lynxkite.json @@ -510,8 +510,7 @@ "title": "Ask LLM", "params": { "max_tokens": 100.0, - "accepted_regex": "", - "model": "SultanR/SmolTulu-1.7b-Instruct" + "accepted_regex": "" }, "display": null, "error": null, @@ -541,13 +540,6 @@ "type": { "type": "" } - }, - "model": { - "type": { - "type": "" - }, - "default": null, - "name": "model" } }, "outputs": { diff --git a/examples/Image processing b/examples/Image processing.lynxkite.json similarity index 100% rename from examples/Image processing rename to examples/Image processing.lynxkite.json diff --git a/examples/LynxScribe RAG Chatbot.lynxkite.json b/examples/LynxScribe RAG Chatbot.lynxkite.json deleted file mode 100644 index bc9abb9cda8f58f14c593d1047c063f2e3557819..0000000000000000000000000000000000000000 --- a/examples/LynxScribe RAG Chatbot.lynxkite.json +++ /dev/null @@ -1,800 +0,0 @@ -{ - "edges": [ - { - "id": "xy-edge__Truncate history 1output-Chat processor 1processor", - "source": "Truncate history 1", - "sourceHandle": "output", - "target": "Chat processor 1", - "targetHandle": "processor" - }, - { - "id": "xy-edge__Mask 1output-Chat processor 1processor", - "source": "Mask 1", - "sourceHandle": "output", - "target": "Chat processor 1", - "targetHandle": "processor" - }, - { - "id": "xy-edge__Mask 2output-Chat processor 1processor", - "source": "Mask 2", - "sourceHandle": "output", - "target": "Chat processor 1", - "targetHandle": "processor" - }, - { - "id": "xy-edge__Input chat 1output-Test Chat API 2message", - "source": "Input chat 1", - "sourceHandle": "output", - "target": "Test Chat API 2", - "targetHandle": "message" - }, - { - "id": "xy-edge__Test Chat API 2output-View 1input", - "source": "Test Chat API 2", - "sourceHandle": "output", - "target": "View 1", - "targetHandle": "input" - }, - { - "id": "LynxScribe RAG Graph Chatbot Backend 1 Test Chat API 2", - "source": "LynxScribe RAG Graph Chatbot Backend 1", - "sourceHandle": "output", - "target": "Test Chat API 2", - "targetHandle": "chat_api" - }, - { - "id": "Chat processor 1 LynxScribe RAG Graph Chatbot Backend 1", - "source": "Chat processor 1", - "sourceHandle": "output", - "target": "LynxScribe RAG Graph Chatbot Backend 1", - "targetHandle": "chat_processor" - }, - { - "id": "Cloud-sourced File Listing 1 LynxScribe Text RAG Loader 1", - "source": "Cloud-sourced File Listing 1", - "sourceHandle": "output", - "target": "LynxScribe Text RAG Loader 1", - "targetHandle": "file_urls" - }, - { - "id": "LynxScribe Text RAG Loader 1 LynxScribe RAG Graph Chatbot Builder 1", - "source": "LynxScribe Text RAG Loader 1", - "sourceHandle": "output", - "target": "LynxScribe RAG Graph Chatbot Builder 1", - "targetHandle": "rag_graph" - }, - { - "id": "LynxScribe RAG Graph Chatbot Builder 1 LynxScribe RAG Graph Chatbot Backend 1", - "source": "LynxScribe RAG Graph Chatbot Builder 1", - "sourceHandle": "output", - "target": "LynxScribe RAG Graph Chatbot Backend 1", - "targetHandle": "knowledge_base" - } - ], - "env": "LynxScribe", - "nodes": [ - { - "data": { - "__execution_delay": 0.0, - "collapsed": null, - "display": null, - "error": null, - "meta": { - "inputs": {}, - "name": "Input chat", - "outputs": { - "output": { - "name": "output", - "position": "right", - "type": { - "type": "None" - } - } - }, - "params": { - "chat": { - "default": null, - "name": "chat", - "type": { - "type": "" - } - } - }, - "type": "basic" - }, - "params": { - "chat": "Wgo is Gabor?" - }, - "status": "done", - "title": "Input chat" - }, - "dragHandle": ".bg-primary", - "height": 186.0, - "id": "Input chat 1", - "parentId": null, - "position": { - "x": -2606.8829929570456, - "y": -648.2654341415332 - }, - "type": "basic", - "width": 259.0 - }, - { - "data": { - "display": { - "dataframes": { - "df": { - "columns": ["answer"], - "data": [ - [ - "Lynx Analytics has two notable professionals named G\u00e1bor. Could you please specify which G\u00e1bor you are inquiring about?\n\n- **G\u00e1bor Benedek**: Chief Innovation Officer & Co-founder at Lynx Analytics. He specializes in economic and business simulations, social network analysis, data mining, and predictive analytics. He has an academic background as a former Associate Professor at Corvinus University of Budapest and has founded several data-related companies.\n\n- **G\u00e1bor Kriv\u00e1chy**: Country Manager at Lynx Analytics in Hungary. He is an experienced technology executive with a background in system implementation, integration, and project management, particularly in SAP implementations.\n\nLet me know which G\u00e1bor's details you would like to learn more about!" - ] - ] - } - } - }, - "error": null, - "meta": { - "inputs": { - "input": { - "name": "input", - "position": "left", - "type": { - "type": "" - } - } - }, - "name": "View", - "outputs": {}, - "params": {}, - "type": "table_view" - }, - "params": {}, - "status": "done", - "title": "View" - }, - "dragHandle": ".bg-primary", - "height": 950.0, - "id": "View 1", - "parentId": null, - "position": { - "x": -754.9225960536905, - "y": -643.161064357758 - }, - "type": "table_view", - "width": 1256.0 - }, - { - "data": { - "display": null, - "error": null, - "meta": { - "inputs": {}, - "name": "Truncate history", - "outputs": { - "output": { - "name": "output", - "position": "top", - "type": { - "type": "None" - } - } - }, - "params": { - "max_tokens": { - "default": 10000.0, - "name": "max_tokens", - "type": { - "type": "" - } - } - }, - "type": "basic" - }, - "params": { - "max_tokens": 10000.0 - }, - "status": "done", - "title": "Truncate history" - }, - "dragHandle": ".bg-primary", - "height": 200.0, - "id": "Truncate history 1", - "parentId": null, - "position": { - "x": -1536.508533731351, - "y": 728.1204075546109 - }, - "type": "basic", - "width": 200.0 - }, - { - "data": { - "__execution_delay": null, - "collapsed": false, - "display": null, - "error": null, - "meta": { - "inputs": { - "processor": { - "name": "processor", - "position": "bottom", - "type": { - "type": "" - } - } - }, - "name": "Chat processor", - "outputs": { - "output": { - "name": "output", - "position": "top", - "type": { - "type": "None" - } - } - }, - "params": {}, - "type": "basic" - }, - "params": {}, - "status": "done", - "title": "Chat processor" - }, - "dragHandle": ".bg-primary", - "height": 89.0, - "id": "Chat processor 1", - "parentId": null, - "position": { - "x": -1527.1027075359414, - "y": 605.2129408898476 - }, - "type": "basic", - "width": 416.0 - }, - { - "data": { - "__execution_delay": 0.0, - "collapsed": null, - "display": null, - "error": null, - "meta": { - "inputs": {}, - "name": "Mask", - "outputs": { - "output": { - "name": "output", - "position": "top", - "type": { - "type": "None" - } - } - }, - "params": { - "exceptions": { - "default": "", - "name": "exceptions", - "type": { - "type": "" - } - }, - "mask_pattern": { - "default": "", - "name": "mask_pattern", - "type": { - "type": "" - } - }, - "name": { - "default": "", - "name": "name", - "type": { - "type": "" - } - }, - "regex": { - "default": "", - "name": "regex", - "type": { - "type": "" - } - } - }, - "type": "basic" - }, - "params": { - "exceptions": "info@lynxanalytics.com,marketing@lynxanalytics.com,hr@lynxanalytics.com,lynxkite@lynxkite.com", - "mask_pattern": "masked_email_address_{}", - "name": "email", - "regex": "([a-z0-9!#$%&'*+\\/=?^_`{|.}~-]+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)" - }, - "status": "done", - "title": "Mask" - }, - "dragHandle": ".bg-primary", - "height": 358.0, - "id": "Mask 1", - "parentId": null, - "position": { - "x": -1309.5065330408577, - "y": 731.6791509394458 - }, - "type": "basic", - "width": 313.0 - }, - { - "data": { - "__execution_delay": 0.0, - "collapsed": null, - "display": null, - "error": null, - "meta": { - "inputs": {}, - "name": "Mask", - "outputs": { - "output": { - "name": "output", - "position": "top", - "type": { - "type": "None" - } - } - }, - "params": { - "exceptions": { - "default": "", - "name": "exceptions", - "type": { - "type": "" - } - }, - "mask_pattern": { - "default": "", - "name": "mask_pattern", - "type": { - "type": "" - } - }, - "name": { - "default": "", - "name": "name", - "type": { - "type": "" - } - }, - "regex": { - "default": "", - "name": "regex", - "type": { - "type": "" - } - } - }, - "type": "basic" - }, - "params": { - "exceptions": "", - "mask_pattern": "masked_credit_card_number_{}", - "name": "credit_card", - "regex": "((?:(?:\\\\d{4}[- ]?){3}\\\\d{4}|\\\\d{15,16}))(?![\\\\d])" - }, - "status": "done", - "title": "Mask" - }, - "dragHandle": ".bg-primary", - "height": 358.0, - "id": "Mask 2", - "parentId": null, - "position": { - "x": -983.2612912523697, - "y": 731.5859900002104 - }, - "type": "basic", - "width": 315.0 - }, - { - "data": { - "__execution_delay": 0.0, - "collapsed": false, - "display": null, - "error": null, - "meta": { - "inputs": { - "chat_api": { - "name": "chat_api", - "position": "bottom", - "type": { - "type": "" - } - }, - "message": { - "name": "message", - "position": "left", - "type": { - "type": "" - } - } - }, - "name": "Test Chat API", - "outputs": { - "output": { - "name": "output", - "position": "right", - "type": { - "type": "None" - } - } - }, - "params": { - "show_details": { - "default": false, - "name": "show_details", - "type": { - "type": "" - } - } - }, - "type": "basic" - }, - "params": {}, - "status": "done", - "title": "Test Chat API" - }, - "dragHandle": ".bg-primary", - "height": 201.0, - "id": "Test Chat API 2", - "parentId": null, - "position": { - "x": -2024.044443214723, - "y": -654.8412606520155 - }, - "type": "basic", - "width": 906.0 - }, - { - "data": { - "__execution_delay": 0.0, - "collapsed": null, - "display": null, - "error": null, - "meta": { - "inputs": { - "chat_processor": { - "name": "chat_processor", - "position": "bottom", - "type": { - "type": "" - } - }, - "knowledge_base": { - "name": "knowledge_base", - "position": "bottom", - "type": { - "type": "" - } - } - }, - "name": "LynxScribe RAG Graph Chatbot Backend", - "outputs": { - "output": { - "name": "output", - "position": "top", - "type": { - "type": "None" - } - } - }, - "params": { - "llm_interface": { - "default": "openai", - "name": "llm_interface", - "type": { - "type": "" - } - }, - "llm_model_name": { - "default": "gpt-4o", - "name": "llm_model_name", - "type": { - "type": "" - } - }, - "negative_answer": { - "default": "I'm sorry, but the data I've been trained on does not contain any information related to your question.", - "name": "negative_answer", - "type": { - "type": "" - } - }, - "retriever_limits_by_type": { - "default": "{}", - "name": "retriever_limits_by_type", - "type": { - "type": "" - } - }, - "retriever_max_iterations": { - "default": 3.0, - "name": "retriever_max_iterations", - "type": { - "type": "" - } - }, - "retriever_overall_chunk_limit": { - "default": 20.0, - "name": "retriever_overall_chunk_limit", - "type": { - "type": "" - } - }, - "retriever_overall_token_limit": { - "default": 3000.0, - "name": "retriever_overall_token_limit", - "type": { - "type": "" - } - }, - "retriever_strict_limits": { - "default": true, - "name": "retriever_strict_limits", - "type": { - "type": "" - } - } - }, - "position": { - "x": 543.0, - "y": 256.0 - }, - "type": "basic" - }, - "params": { - "llm_interface": "openai", - "llm_model_name": "gpt-4o", - "negative_answer": "I'm sorry, but the data I've been trained on does not contain any information related to your question.", - "retriever_limits_by_type": "{\"information\": [1, 5], \"summary\": [0, 2], \"template_qna\": [1, 3], \"QnA question\": [0, 0]}", - "retriever_max_iterations": 3.0, - "retriever_overall_chunk_limit": "20", - "retriever_overall_token_limit": 3000.0, - "retriever_strict_limits": true - }, - "status": "done", - "title": "LynxScribe RAG Graph Chatbot Backend" - }, - "dragHandle": ".bg-primary", - "height": 556.0, - "id": "LynxScribe RAG Graph Chatbot Backend 1", - "position": { - "x": -2020.0, - "y": -188.33333333333334 - }, - "type": "basic", - "width": 903.0 - }, - { - "data": { - "__execution_delay": 0.0, - "collapsed": null, - "display": null, - "error": null, - "meta": { - "inputs": { - "file_urls": { - "name": "file_urls", - "position": "left", - "type": { - "type": "" - } - } - }, - "name": "LynxScribe Text RAG Loader", - "outputs": { - "output": { - "name": "output", - "position": "right", - "type": { - "type": "None" - } - } - }, - "params": { - "input_type": { - "default": "v1", - "name": "input_type", - "type": { - "enum": ["V1", "V2"] - } - }, - "text_embedder_interface": { - "default": "openai", - "name": "text_embedder_interface", - "type": { - "type": "" - } - }, - "text_embedder_model_name_or_path": { - "default": "text-embedding-3-large", - "name": "text_embedder_model_name_or_path", - "type": { - "type": "" - } - }, - "vdb_collection_name": { - "default": "lynx", - "name": "vdb_collection_name", - "type": { - "type": "" - } - }, - "vdb_num_dimensions": { - "default": 3072.0, - "name": "vdb_num_dimensions", - "type": { - "type": "" - } - }, - "vdb_provider_name": { - "default": "faiss", - "name": "vdb_provider_name", - "type": { - "type": "" - } - } - }, - "position": { - "x": 870.0, - "y": 926.0 - }, - "type": "basic" - }, - "params": { - "input_type": "V1", - "text_embedder_interface": "openai", - "text_embedder_model_name_or_path": "text-embedding-ada-002", - "vdb_collection_name": "lynx", - "vdb_num_dimensions": "1536", - "vdb_provider_name": "faiss" - }, - "status": "done", - "title": "LynxScribe Text RAG Loader" - }, - "dragHandle": ".bg-primary", - "height": 520.0, - "id": "LynxScribe Text RAG Loader 1", - "position": { - "x": -2980.4063452955706, - "y": 787.1039827859594 - }, - "type": "basic", - "width": 318.0 - }, - { - "data": { - "__execution_delay": 0.0, - "collapsed": null, - "display": null, - "error": null, - "meta": { - "inputs": {}, - "name": "Cloud-sourced File Listing", - "outputs": { - "output": { - "name": "output", - "position": "right", - "type": { - "type": "None" - } - } - }, - "params": { - "accepted_file_types": { - "default": ".jpg, .jpeg, .png", - "name": "accepted_file_types", - "type": { - "type": "" - } - }, - "cloud_provider": { - "default": "gcp", - "name": "cloud_provider", - "type": { - "enum": ["GCP", "AWS", "AZURE"] - } - }, - "folder_URL": { - "default": "https://storage.googleapis.com/lynxkite_public_data/lynxscribe-images/image-rag-test", - "name": "folder_URL", - "type": { - "type": "" - } - } - }, - "position": { - "x": 451.0, - "y": 505.0 - }, - "type": "basic" - }, - "params": { - "accepted_file_types": ".pickle", - "cloud_provider": "GCP", - "folder_URL": "https://storage.googleapis.com/lynxkite_public_data/lynxscribe-knowledge-graphs/lynx-chatbot" - }, - "status": "done", - "title": "Cloud-sourced File Listing" - }, - "dragHandle": ".bg-primary", - "height": 324.0, - "id": "Cloud-sourced File Listing 1", - "position": { - "x": -3827.1644268005352, - "y": 883.7859821532916 - }, - "type": "basic", - "width": 613.0 - }, - { - "data": { - "display": null, - "error": null, - "meta": { - "inputs": { - "rag_graph": { - "name": "rag_graph", - "position": "left", - "type": { - "type": "" - } - } - }, - "name": "LynxScribe RAG Graph Chatbot Builder", - "outputs": { - "output": { - "name": "output", - "position": "top", - "type": { - "type": "None" - } - } - }, - "params": { - "node_types": { - "default": "intent_cluster", - "name": "node_types", - "type": { - "type": "" - } - }, - "scenario_file": { - "default": "uploads/lynx_chatbot_scenario_selector.yaml", - "name": "scenario_file", - "type": { - "type": "" - } - } - }, - "position": { - "x": 1314.0, - "y": 1003.0 - }, - "type": "basic" - }, - "params": { - "node_types": "intent_cluster", - "scenario_file": "uploads/lynx_chatbot_scenario_selector.yaml" - }, - "status": "done", - "title": "LynxScribe RAG Graph Chatbot Builder" - }, - "dragHandle": ".bg-primary", - "height": 238.0, - "id": "LynxScribe RAG Graph Chatbot Builder 1", - "position": { - "x": -2453.755433834285, - "y": 927.5600547745715 - }, - "type": "basic", - "width": 448.0 - } - ] -} diff --git a/examples/Model definition.lynxkite.json b/examples/Model definition.lynxkite.json new file mode 100644 index 0000000000000000000000000000000000000000..ef099ec27271d663ba774b3e32508df610ae08ed --- /dev/null +++ b/examples/Model definition.lynxkite.json @@ -0,0 +1,614 @@ +{ + "edges": [ + { + "id": "MSE loss 2 Optimizer 2", + "source": "MSE loss 2", + "sourceHandle": "output", + "target": "Optimizer 2", + "targetHandle": "loss" + }, + { + "id": "Activation 1 Repeat 1", + "source": "Activation 1", + "sourceHandle": "output", + "target": "Repeat 1", + "targetHandle": "input" + }, + { + "id": "Linear 1 Activation 1", + "source": "Linear 1", + "sourceHandle": "output", + "target": "Activation 1", + "targetHandle": "x" + }, + { + "id": "Repeat 1 Linear 1", + "source": "Repeat 1", + "sourceHandle": "output", + "target": "Linear 1", + "targetHandle": "x" + }, + { + "id": "Input: tensor 1 Linear 1", + "source": "Input: tensor 1", + "sourceHandle": "output", + "target": "Linear 1", + "targetHandle": "x" + }, + { + "id": "Constant vector 1 Add 1", + "source": "Constant vector 1", + "sourceHandle": "output", + "target": "Add 1", + "targetHandle": "b" + }, + { + "id": "Input: tensor 3 Add 1", + "source": "Input: tensor 3", + "sourceHandle": "output", + "target": "Add 1", + "targetHandle": "a" + }, + { + "id": "Add 1 MSE loss 2", + "source": "Add 1", + "sourceHandle": "output", + "target": "MSE loss 2", + "targetHandle": "y" + }, + { + "id": "Activation 1 Output 1", + "source": "Activation 1", + "sourceHandle": "output", + "target": "Output 1", + "targetHandle": "x" + }, + { + "id": "Output 1 MSE loss 2", + "source": "Output 1", + "sourceHandle": "x", + "target": "MSE loss 2", + "targetHandle": "x" + } + ], + "env": "PyTorch model", + "nodes": [ + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": 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" + ] + } + } + }, + "type": "basic" + }, + "params": { + "lr": "0.1", + "type": "SGD" + }, + "status": "planned", + "title": "Optimizer" + }, + "dragHandle": ".bg-primary", + "height": 250.0, + "id": "Optimizer 2", + "position": { + "x": 359.75221367487865, + "y": -1560.7604266065723 + }, + "type": "basic", + "width": 232.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "" + } + } + }, + "name": "Activation", + "outputs": { + "output": { + "name": "output", + "position": "top", + "type": { + "type": "None" + } + } + }, + "params": { + "type": { + "default": "ReLU", + "name": "type", + "type": { + "enum": [ + "ReLU", + "Leaky_ReLU", + "Tanh", + "Mish" + ] + } + } + }, + "type": "basic" + }, + "params": { + "type": "Leaky_ReLU" + }, + "status": "planned", + "title": "Activation" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Activation 1", + "position": { + "x": 99.77615018185415, + "y": -249.43925929074078 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": {}, + "name": "Input: tensor", + "outputs": { + "output": { + "name": "output", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "name": { + "default": null, + "name": "name", + "type": { + "type": "None" + } + } + }, + "type": "basic" + }, + "params": { + "name": "Y" + }, + "status": "planned", + "title": "Input: tensor" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: tensor 3", + "position": { + "x": 485.8840220312055, + "y": -268.0485936515193 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "" + } + }, + "y": { + "name": "y", + "position": "bottom", + "type": { + "type": "" + } + } + }, + "name": "MSE loss", + "outputs": { + "output": { + "name": "output", + "position": "top", + "type": { + "type": "None" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "MSE loss" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "MSE loss 2", + "position": { + "x": 384.54674698852955, + "y": -1184.4701545316577 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": { + "input": { + "name": "input", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "name": "Repeat", + "outputs": { + "output": { + "name": "output", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "params": { + "same_weights": { + "default": false, + "name": "same_weights", + "type": { + "type": "" + } + }, + "times": { + "default": 1.0, + "name": "times", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "same_weights": false, + "times": "2" + }, + "status": "planned", + "title": "Repeat" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Repeat 1", + "position": { + "x": -210.0, + "y": -135.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "" + } + } + }, + "name": "Linear", + "outputs": { + "output": { + "name": "output", + "position": "top", + "type": { + "type": "None" + } + } + }, + "params": { + "output_dim": { + "default": 1024.0, + "name": "output_dim", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "output_dim": "4" + }, + "status": "planned", + "title": "Linear" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Linear 1", + "position": { + "x": 98.54861342271252, + "y": 14.121603973834155 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": {}, + "name": "Input: tensor", + "outputs": { + "output": { + "name": "output", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "name": { + "default": null, + "name": "name", + "type": { + "type": "None" + } + } + }, + "type": "basic" + }, + "params": { + "name": "X" + }, + "status": "planned", + "title": "Input: tensor" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Input: tensor 1", + "position": { + "x": 108.75735538875443, + "y": 331.53404347930933 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": {}, + "name": "Constant vector", + "outputs": { + "output": { + "name": "output", + "position": "top", + "type": { + "type": "None" + } + } + }, + "params": { + "size": { + "default": 1.0, + "name": "size", + "type": { + "type": "" + } + }, + "value": { + "default": 0.0, + "name": "value", + "type": { + "type": "" + } + } + }, + "type": "basic" + }, + "params": { + "size": "1", + "value": "1" + }, + "status": "planned", + "title": "Constant vector" + }, + "dragHandle": ".bg-primary", + "height": 258.0, + "id": "Constant vector 1", + "position": { + "x": 886.708922897265, + "y": -298.4394167425953 + }, + "type": "basic", + "width": 238.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": { + "a": { + "name": "a", + "position": "bottom", + "type": { + "type": "" + } + }, + "b": { + "name": "b", + "position": "bottom", + "type": { + "type": "" + } + } + }, + "name": "Add", + "outputs": { + "output": { + "name": "output", + "position": "top", + "type": { + "type": "None" + } + } + }, + "params": {}, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Add" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Add 1", + "position": { + "x": 722.1292469875319, + "y": -762.6853551968964 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": true, + "display": null, + "error": null, + "input_metadata": null, + "meta": { + "inputs": { + "x": { + "name": "x", + "position": "bottom", + "type": { + "type": "tensor" + } + } + }, + "name": "Output", + "outputs": { + "x": { + "name": "x", + "position": "top", + "type": { + "type": "tensor" + } + } + }, + "params": { + "name": { + "default": null, + "name": "name", + "type": { + "type": "None" + } + } + }, + "type": "basic" + }, + "params": {}, + "status": "planned", + "title": "Output" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Output 1", + "position": { + "x": 185.15239170944702, + "y": -733.1526319565451 + }, + "type": "basic", + "width": 200.0 + } + ] +} diff --git a/examples/Model use.lynxkite.json b/examples/Model use.lynxkite.json new file mode 100644 index 0000000000000000000000000000000000000000..811d815ff0b22744375cfeff898fd6cbcbc2b077 --- /dev/null +++ b/examples/Model use.lynxkite.json @@ -0,0 +1,3297 @@ +{ + "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": "Train model 2 View loss 1", + "source": "Train model 2", + "sourceHandle": "output", + "target": "View loss 1", + "targetHandle": "bundle" + }, + { + "id": "Model inference 1 View tables 1", + "source": "Model inference 1", + "sourceHandle": "output", + "target": "View tables 1", + "targetHandle": "bundle" + }, + { + "id": "Model inference 1 View vectors 1", + "source": "Model inference 1", + "sourceHandle": "output", + "target": "View vectors 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" + }, + "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" + }, + "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": { + "__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" + }, + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "index", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "index", + "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__tensor_1_output" + ], + "loss_inputs": [ + "Output_1_x", + "Input__tensor_3_output" + ], + "outputs": [ + "Output_1_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": "501", + "input_mapping": "{\"map\":{\"Input__tensor_1_output\":{\"df\":\"df_train\",\"column\":\"x\"},\"Input__tensor_3_output\":{\"df\":\"df_train\",\"column\":\"y\"}}}", + "model_name": "model" + }, + "status": "done", + "title": "Train model" + }, + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "index", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "index", + "x", + "y" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__tensor_1_output" + ], + "loss_inputs": [ + "Input__tensor_3_output", + "Output_1_x" + ], + "outputs": [ + "Output_1_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": "151", + "input_mapping": "{\"map\":{\"Input__tensor_1_output\":{\"df\":\"df_train\",\"column\":\"x\"},\"Input__tensor_3_output\":{\"df\":\"df_train\",\"column\":\"y\"}}}", + "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": [ + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "x", + "y" + ] + }, + "training": { + "columns": [ + "training_loss" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__tensor_1_output" + ], + "loss_inputs": [ + "Output_1_x", + "Input__tensor_3_output" + ], + "outputs": [ + "Output_1_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__tensor_1_output\":{\"df\":\"df_test\",\"column\":\"x\"}}}", + "model_name": "model", + "output_mapping": "{\"map\":{\"Output_1_x\":{\"df\":\"df_test\",\"column\":\"pred\"}}}" + }, + "status": "done", + "title": "Model inference" + }, + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "index", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "index", + "x", + "y" + ] + }, + "training": { + "columns": [ + "training_loss" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__tensor_1_output" + ], + "loss_inputs": [ + "Input__tensor_3_output", + "Output_1_x" + ], + "outputs": [ + "Output_1_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__tensor_1_output\":{\"df\":\"df_test\",\"column\":\"x\"}}}", + "model_name": "model", + "output_mapping": "{\"map\":{\"Output_1_x\":{\"df\":\"df_test\",\"column\":\"pred\"}}}" + }, + "status": "done", + "title": "Model inference" + }, + "dragHandle": ".bg-primary", + "height": 650.0, + "id": "Model inference 1", + "position": { + "x": 2181.718373860645, + "y": -69.44701793295484 + }, + "type": "basic", + "width": 529.0 + }, + { + "_data": { + "__execution_delay": null, + "collapsed": false, + "display": { + "series": [ + { + "data": [ + 5.194248676300049, + 4.732226848602295, + 4.301504611968994, + 3.9289824962615967, + 3.6416826248168945, + 3.4493889808654785, + 3.339247703552246, + 3.2848846912384033, + 3.2611656188964844, + 3.251643180847168, + 3.2479231357574463, + 3.2463886737823486, + 3.245635986328125, + 3.245159149169922, + 3.2447798252105713, + 3.2444353103637695, + 3.2441060543060303, + 3.2437832355499268, + 3.243464469909668, + 3.243149518966675, + 3.2428362369537354, + 3.242525339126587, + 3.2422165870666504, + 3.241910457611084, + 3.2416069507598877, + 3.2413055896759033, + 3.2410058975219727, + 3.240708112716675, + 3.2404117584228516, + 3.2401177883148193, + 3.239825487136841, + 3.239534616470337, + 3.239245653152466, + 3.2389581203460693, + 3.238672971725464, + 3.238389015197754, + 3.2381069660186768, + 3.237826108932495, + 3.2375471591949463, + 3.237269878387451, + 3.2369940280914307, + 3.236720085144043, + 3.2364470958709717, + 3.236175775527954, + 3.2359063625335693, + 3.2356388568878174, + 3.235372304916382, + 3.235107183456421, + 3.2348432540893555, + 3.234581232070923, + 3.2343204021453857, + 3.2340610027313232, + 3.233802556991577, + 3.233546257019043, + 3.233290910720825, + 3.233036518096924, + 3.2327840328216553, + 3.2325327396392822, + 3.232283115386963, + 3.232034921646118, + 3.2317872047424316, + 3.2315409183502197, + 3.2312965393066406, + 3.231052875518799, + 3.2308101654052734, + 3.2305691242218018, + 3.2303292751312256, + 3.230090379714966, + 3.2298526763916016, + 3.2296159267425537, + 3.2293803691864014, + 3.2291462421417236, + 3.228912591934204, + 3.2286808490753174, + 3.228449821472168, + 3.228219985961914, + 3.2279903888702393, + 3.2277631759643555, + 3.22753643989563, + 3.2273104190826416, + 3.2270853519439697, + 3.2268614768981934, + 3.226637363433838, + 3.2264153957366943, + 3.2261929512023926, + 3.2259714603424072, + 3.2257511615753174, + 3.2255313396453857, + 3.2253129482269287, + 3.225095272064209, + 3.224879264831543, + 3.224663734436035, + 3.2244486808776855, + 3.2242350578308105, + 3.224022388458252, + 3.223810911178589, + 3.223599672317505, + 3.2233896255493164, + 3.2231807708740234, + 3.2229726314544678, + 3.222764730453491, + 3.2225584983825684, + 3.2223527431488037, + 3.2221477031707764, + 3.2219433784484863, + 3.2217350006103516, + 3.2210605144500732, + 3.2179861068725586, + 3.1490979194641113, + 2.5611555576324463, + 2.1667709350585938, + 1.941397786140442, + 1.8211313486099243, + 1.7602094411849976, + 1.7300406694412231, + 1.7150671482086182, + 1.707504153251648, + 1.703554630279541, + 1.7013800144195557, + 1.7000809907913208, + 1.6992148160934448, + 1.6985713243484497, + 1.6980407238006592, + 1.6975696086883545, + 1.6971304416656494, + 1.69670832157135, + 1.696295976638794, + 1.6958922147750854, + 1.6954957246780396, + 1.6951044797897339, + 1.6947181224822998, + 1.694334626197815, + 1.6939517259597778, + 1.6935737133026123, + 1.6931995153427124, + 1.6928293704986572, + 1.6924631595611572, + 1.6921008825302124, + 1.6917426586151123, + 1.6913865804672241, + 1.6910340785980225, + 1.690685510635376, + 1.690340518951416, + 1.6899985074996948, + 1.689659595489502, + 1.6893242597579956, + 1.6889920234680176, + 1.6886632442474365, + 1.688332438468933, + 1.6879974603652954, + 1.6876615285873413, + 1.687328815460205, + 1.6869547367095947, + 1.6862459182739258, + 1.6816266775131226, + 1.5337661504745483, + 0.8366889357566833, + 0.46365517377853394, + 0.2645129859447479, + 0.16432315111160278, + 0.11595670133829117, + 0.09297489374876022, + 0.08202926814556122, + 0.07672866433858871, + 0.07407510280609131, + 0.07266353815793991, + 0.07183551043272018, + 0.07128453254699707, + 0.07086450606584549, + 0.07050899416208267, + 0.0701858326792717, + 0.06987988203763962, + 0.0695839673280716, + 0.06929467618465424, + 0.06901033222675323, + 0.0687265694141388, + 0.0684463381767273, + 0.06816895306110382, + 0.06789495050907135, + 0.0676238089799881, + 0.06735056638717651, + 0.06708052009344101, + 0.06681209057569504, + 0.06654231995344162, + 0.06627301871776581, + 0.06600192189216614, + 0.06573258340358734, + 0.06545879691839218, + 0.06518517434597015, + 0.06490959227085114, + 0.06463567167520523, + 0.0643647089600563, + 0.06409519165754318, + 0.06382837891578674, + 0.06356203556060791, + 0.06330081075429916, + 0.06304193288087845, + 0.06278356909751892, + 0.06252720952033997, + 0.06227334961295128, + 0.06202361360192299, + 0.0617777444422245, + 0.06153156980872154, + 0.061283886432647705, + 0.061029158532619476, + 0.06077418848872185, + 0.060523588210344315, + 0.06027815118432045, + 0.06003476679325104, + 0.059792377054691315, + 0.059549830853939056, + 0.05930154025554657, + 0.05905551835894585, + 0.05881192907691002, + 0.0585709884762764, + 0.05833115428686142, + 0.05809348449110985, + 0.0578579381108284, + 0.05762450024485588, + 0.05739405006170273, + 0.05716623365879059, + 0.056934017688035965, + 0.05670491233468056, + 0.05647972598671913, + 0.05625642091035843, + 0.05603497847914696, + 0.05581538379192352, + 0.05559813603758812, + 0.05538330227136612, + 0.055170174688100815, + 0.054959800094366074, + 0.05475304275751114, + 0.054547909647226334, + 0.05434436723589897, + 0.05414241552352905, + 0.053942013531923294, + 0.053743164986371994, + 0.05354584753513336, + 0.05335003510117531, + 0.05315623804926872, + 0.05296580120921135, + 0.052776746451854706, + 0.052589051425457, + 0.05240271985530853, + 0.05221769958734512, + 0.05203401669859886, + 0.05185163766145706, + 0.05167055502533913, + 0.05149075761437416, + 0.05131221190094948, + 0.051134925335645676, + 0.05095922574400902, + 0.05078546702861786, + 0.05061294883489609, + 0.05044237896800041, + 0.050274644047021866, + 0.05010804161429405, + 0.04994256794452667, + 0.049778200685977936, + 0.04961492121219635, + 0.049452755600214005, + 0.04929284378886223, + 0.04913467913866043, + 0.04897753894329071, + 0.04882141575217247, + 0.04866630584001541, + 0.04851251095533371, + 0.04836169257760048, + 0.04821375384926796, + 0.04806669428944588, + 0.04792052507400513, + 0.04777522012591362, + 0.04763077199459076, + 0.04748716205358505, + 0.047344379127025604, + 0.04720241203904152, + 0.04706142097711563, + 0.04692186415195465, + 0.04678306728601456, + 0.04664503037929535, + 0.04650787264108658, + 0.04637163504958153, + 0.046236440539360046, + 0.04610292613506317, + 0.04597007483243942, + 0.045837946236133575, + 0.04570755362510681, + 0.04557782784104347, + 0.04544825479388237, + 0.0453183650970459, + 0.045189570635557175, + 0.04506213217973709, + 0.04493529349565506, + 0.044809043407440186, + 0.044683389365673065, + 0.04455830156803131, + 0.04443386197090149, + 0.04431009292602539, + 0.04418685659766197, + 0.04406414180994034, + 0.043941959738731384, + 0.043820276856422424, + 0.04369909688830376, + 0.043578337877988815, + 0.04345747083425522, + 0.04333708435297012, + 0.04321715980768204, + 0.04309769719839096, + 0.0429786778986454, + 0.04286010563373566, + 0.04274197295308113, + 0.042624276131391525, + 0.042507000267505646, + 0.04239014536142349, + 0.04227370768785477, + 0.042157672345638275, + 0.042042046785354614, + 0.04192682355642319, + 0.0418119840323925, + 0.041697535663843155, + 0.04158347100019455, + 0.04146978259086609, + 0.041356466710567474, + 0.041243527084589005, + 0.041130952537059784, + 0.04101872816681862, + 0.040906865149736404, + 0.04079534858465195, + 0.04068418964743614, + 0.0405733622610569, + 0.040462885051965714, + 0.04035273939371109, + 0.04024292156100273, + 0.040133725851774216, + 0.040025271475315094, + 0.03991713374853134, + 0.03980930522084236, + 0.039701659232378006, + 0.039593927562236786, + 0.039486486464738846, + 0.03937936946749687, + 0.039272651076316833, + 0.039166223257780075, + 0.039060063660144806, + 0.038954153656959534, + 0.0388483963906765, + 0.038742903620004654, + 0.0386376827955246, + 0.03853272274136543, + 0.03842802718281746, + 0.03832358866930008, + 0.03821941092610359, + 0.0381154865026474, + 0.038011811673641205, + 0.0379084013402462, + 0.037805236876010895, + 0.03770232945680618, + 0.03759966045618057, + 0.037497248500585556, + 0.03739452734589577, + 0.03729122132062912, + 0.03718816488981247, + 0.03708536550402641, + 0.03698281571269035, + 0.03688051551580429, + 0.036778464913368225, + 0.03667666018009186, + 0.03657510131597519, + 0.03647379204630852, + 0.036372724920511246, + 0.03627190366387367, + 0.036171332001686096, + 0.036071084439754486, + 0.03597136586904526, + 0.03587188571691513, + 0.03577264025807381, + 0.035673633217811584, + 0.03557485342025757, + 0.03547630459070206, + 0.03537798300385475, + 0.035279903560876846, + 0.035182058811187744, + 0.03508443757891655, + 0.03498705103993416, + 0.034889888018369675, + 0.034792978316545486, + 0.03469628840684891, + 0.03459983691573143, + 0.034503620117902756, + 0.034407634288072586, + 0.03431188315153122, + 0.034216366708278656, + 0.0341210775077343, + 0.03402603417634964, + 0.033931225538253784, + 0.03383665531873703, + 0.03374231979250908, + 0.03364821895956993, + 0.033554356545209885, + 0.03346073254942894, + 0.03336735814809799, + 0.033274225890636444, + 0.0331813283264637, + 0.03308868035674095, + 0.03299626335501671, + 0.03290409594774246, + 0.032812174409627914, + 0.032720498740673065, + 0.032629065215587616, + 0.03253787383437157, + 0.03244693577289581, + 0.03235623985528946, + 0.032265804708004, + 0.03217560797929764, + 0.03208566829562187, + 0.03199596703052521, + 0.03190653398633003, + 0.031817350536584854, + 0.031728409230709076, + 0.03163974732160568, + 0.03155132010579109, + 0.03146316111087799, + 0.03137525916099548, + 0.03128761053085327, + 0.031200233846902847, + 0.03111310862004757, + 0.031026242300868034, + 0.030939649790525436, + 0.030853310599923134, + 0.030767245218157768, + 0.030681440606713295, + 0.03059590980410576, + 0.030510643497109413, + 0.03042564168572426, + 0.030340921133756638, + 0.03025646135210991, + 0.030172280967235565, + 0.03008836880326271, + 0.030004747211933136, + 0.029921378940343857, + 0.029838303104043007, + 0.029755493625998497, + 0.029672972857952118, + 0.029590733349323273, + 0.029508762061595917, + 0.029427088797092438, + 0.029345687478780746, + 0.029264571145176888, + 0.02918374352157116, + 0.029103199020028114, + 0.02902294509112835, + 0.028942979872226715, + 0.028863299638032913, + 0.02878391183912754, + 0.02870481088757515, + 0.028626007959246635, + 0.028547491878271103, + 0.028469275683164597, + 0.02839135006070137, + 0.02831372618675232, + 0.02823638916015625, + 0.028159350156784058, + 0.02808261476457119, + 0.0280061773955822, + 0.027930041775107384, + 0.027854204177856445, + 0.027778668329119682, + 0.027703437954187393, + 0.02762851119041443, + 0.02755388431251049, + 0.027479562908411026, + 0.027405548840761185, + 0.027331842109560966, + 0.027258435264229774, + 0.02718534506857395, + 0.027112558484077454, + 0.02704007923603058, + 0.026967914775013924, + 0.026896055787801743, + 0.02682451158761978, + 0.026753274723887444, + 0.026682356372475624, + 0.02661174349486828, + 0.0265414509922266, + 0.026471465826034546, + 0.02640179730951786, + 0.026332441717386246, + 0.0262634065002203, + 0.026194684207439423, + 0.026126278564333916, + 0.02605818584561348, + 0.025990411639213562, + 0.025922955945134163, + 0.025855818763375282, + 0.02578899636864662, + 0.025722496211528778, + 0.025656312704086304, + 0.02559044398367405, + 0.02552489936351776, + 0.02545967325568199, + 0.02539476379752159 + ], + "type": "line" + } + ], + "title": { + "text": "Training loss" + }, + "xAxis": { + "type": "category" + }, + "yAxis": { + "type": "value" + } + }, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "x", + "y" + ] + }, + "training": { + "columns": [ + "training_loss" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__tensor_1_output" + ], + "loss_inputs": [ + "Output_1_x", + "Input__tensor_3_output" + ], + "outputs": [ + "Output_1_x" + ], + "trained": true + }, + "type": "model" + } + }, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View loss", + "outputs": {}, + "params": {}, + "type": "visualization" + }, + "params": {}, + "status": "done", + "title": "View loss" + }, + "data": { + "__execution_delay": null, + "collapsed": false, + "display": { + "series": [ + { + "data": [ + 6.014081001281738, + 5.580916404724121, + 5.274184226989746, + 5.0237603187561035, + 4.804426670074463, + 4.605026721954346, + 4.419903755187988, + 4.246149063110352, + 4.082696914672852, + 3.9301321506500244, + 3.7902746200561523, + 3.6642696857452393, + 3.5418264865875244, + 3.3390703201293945, + 2.8697218894958496, + 2.3933401107788086, + 2.047636032104492, + 1.83914053440094, + 1.7334750890731812, + 1.6865350008010864, + 1.666785478591919, + 1.658176302909851, + 1.6540385484695435, + 1.651779055595398, + 1.650368094444275, + 1.6493637561798096, + 1.6485661268234253, + 1.6478790044784546, + 1.6472536325454712, + 1.6466654539108276, + 1.6461007595062256, + 1.6455528736114502, + 1.6450183391571045, + 1.6444944143295288, + 1.643980622291565, + 1.6434764862060547, + 1.6429831981658936, + 1.6424978971481323, + 1.64202082157135, + 1.6415510177612305, + 1.6410887241363525, + 1.6406346559524536, + 1.6401888132095337, + 1.639750361442566, + 1.6393187046051025, + 1.6388964653015137, + 1.6384804248809814, + 1.638070821762085, + 1.6376668214797974, + 1.6372689008712769, + 1.6368769407272339, + 1.6364902257919312, + 1.636109471321106, + 1.6357333660125732, + 1.6353627443313599, + 1.6349972486495972, + 1.6346369981765747, + 1.6342813968658447, + 1.6339303255081177, + 1.6335841417312622, + 1.6332424879074097, + 1.6329057216644287, + 1.6325738430023193, + 1.6322462558746338, + 1.6319226026535034, + 1.6316030025482178, + 1.6312874555587769, + 1.6309759616851807, + 1.6306681632995605, + 1.630364179611206, + 1.6300634145736694, + 1.629766821861267, + 1.629473328590393, + 1.6291834115982056, + 1.628896713256836, + 1.6286135911941528, + 1.628333568572998, + 1.628056526184082, + 1.6277827024459839, + 1.6275124549865723, + 1.6272450685501099, + 1.6269807815551758, + 1.6267189979553223, + 1.626460075378418, + 1.6262041330337524, + 1.625950813293457, + 1.6256998777389526, + 1.625451683998108, + 1.6252059936523438, + 1.6249629259109497, + 1.6247217655181885, + 1.6244832277297974, + 1.6242470741271973, + 1.6240129470825195, + 1.6237813234329224, + 1.6235517263412476, + 1.6233243942260742, + 1.6230992078781128, + 1.6228758096694946, + 1.622654676437378, + 1.6224353313446045, + 1.6220967769622803, + 1.6087429523468018, + 1.1195111274719238, + 0.6312010288238525, + 0.35807740688323975, + 0.21476756036281586, + 0.14402888715267181, + 0.11020153015851974, + 0.09413749724626541, + 0.08644001930952072, + 0.08266805112361908, + 0.08074231445789337, + 0.07968885451555252, + 0.07904941588640213, + 0.0786079540848732, + 0.0782623365521431, + 0.07796423882246017, + 0.07769070565700531, + 0.0774308443069458, + 0.0771794393658638, + 0.07693397998809814, + 0.07669319212436676, + 0.07645650207996368, + 0.07622353732585907, + 0.07599412649869919, + 0.0757681354880333, + 0.07554544508457184, + 0.07532599568367004, + 0.07510971277952194, + 0.07489652186632156, + 0.07468635588884354, + 0.07447917759418488, + 0.07427489757537842, + 0.07407346367835999, + 0.073874831199646, + 0.07367893308401108, + 0.07348571717739105, + 0.07329512387514114, + 0.07310713827610016, + 0.07292166352272034, + 0.07273866981267929, + 0.07255809754133224, + 0.072379931807518, + 0.07220420241355896, + 0.07203087955713272, + 0.07185979187488556, + 0.07169090956449509, + 0.07152417302131653, + 0.0713595449924469, + 0.07119700312614441 + ], + "type": "line" + } + ], + "title": { + "text": "Training loss" + }, + "xAxis": { + "type": "category" + }, + "yAxis": { + "type": "value" + } + }, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "index", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "index", + "x", + "y" + ] + }, + "training": { + "columns": [ + "training_loss" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__tensor_1_output" + ], + "loss_inputs": [ + "Input__tensor_3_output", + "Output_1_x" + ], + "outputs": [ + "Output_1_x" + ], + "trained": true + }, + "type": "model" + } + }, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View loss", + "outputs": {}, + "params": {}, + "type": "visualization" + }, + "params": {}, + "status": "done", + "title": "View loss" + }, + "dragHandle": ".bg-primary", + "height": 417.0, + "id": "View loss 1", + "position": { + "x": 2052.643815443704, + "y": 617.6466886696832 + }, + "type": "visualization", + "width": 721.0 + }, + { + "data": { + "__execution_delay": null, + "collapsed": null, + "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": [ + "index", + "x", + "y", + "pred" + ], + "data": [ + [ + 4, + "[0.76807946 0.98855817 0.08259124 0.01730657]", + "[1.76807952 1.98855817 1.0825913 1.01730657]", + "[2.398310661315918, 2.482480764389038, 2.3205058574676514, 2.4670262336730957]" + ], + [ + 99, + "[0.68891573 0.25576538 0.96339929 0.503833 ]", + "[1.68891573 1.25576544 1.96339929 1.50383306]", + "[2.6001150608062744, 2.58300518989563, 2.5226938724517822, 2.607975959777832]" + ], + [ + 26, + "[0.31518555 0.49643308 0.11509258 0.95458382]", + "[1.31518555 1.49643302 1.11509252 1.95458388]", + "[2.460686445236206, 2.5214929580688477, 2.4216299057006836, 2.554131507873535]" + ], + [ + 40, + "[0.44330525 0.09997386 0.89025736 0.90507984]", + "[1.44330525 1.09997392 1.89025736 1.90507984]", + "[2.5939838886260986, 2.5837721824645996, 2.534832715988159, 2.6243085861206055]" + ], + [ + 44, + "[0.52784437 0.54268694 0.12358981 0.72116476]", + "[1.52784443 1.54268694 1.12358975 1.7211647 ]", + "[2.467513084411621, 2.5237104892730713, 2.4233744144439697, 2.5531327724456787]" + ], + [ + 8, + "[4.27091718e-01 4.89909172e-01 6.92297399e-01 2.57611275e-04]", + "[1.42709172 1.48990917 1.69229746 1.00025761]", + "[2.1933858394622803, 2.382107734680176, 2.1187074184417725, 2.328011989593506]" + ], + [ + 42, + "[0.75292218 0.81470108 0.49657214 0.56217098]", + "[1.75292218 1.81470108 1.49657214 1.56217098]", + "[2.7627859115600586, 2.660106658935547, 2.6692981719970703, 2.703057289123535]" + ], + [ + 62, + "[0.81788456 0.58174163 0.29376316 0.7971254 ]", + "[1.81788456 1.58174157 1.29376316 1.79712534]", + "[2.7435245513916016, 2.656848907470703, 2.682042360305786, 2.725670099258423]" + ], + [ + 15, + "[0.04508126 0.76880038 0.80721325 0.62542385]", + "[1.04508126 1.76880038 1.80721331 1.62542391]", + "[2.5160605907440186, 2.536039352416992, 2.410257339477539, 2.5175909996032715]" + ], + [ + 66, + "[0.02162331 0.81861657 0.92468154 0.07808572]", + "[1.02162337 1.81861663 1.92468154 1.07808566]", + "[2.2642712593078613, 2.4094104766845703, 2.148714065551758, 2.3313822746276855]" + ] + ] + }, + "df_train": { + "columns": [ + "index", + "x", + "y" + ], + "data": [ + [ + 10, + "[0.50783676 0.04156506 0.21984279 0.8454656 ]", + "[1.50783682 1.04156506 1.21984279 1.84546566]" + ], + [ + 11, + "[0.98324287 0.99464184 0.14008355 0.47651017]", + "[1.98324287 1.99464178 1.14008355 1.47651017]" + ], + [ + 12, + "[0.11693293 0.49860179 0.55020827 0.88832849]", + "[1.11693287 1.49860179 1.55020833 1.88832855]" + ], + [ + 13, + "[0.48959708 0.48549271 0.32688856 0.356677 ]", + "[1.48959708 1.48549271 1.32688856 1.35667706]" + ], + [ + 14, + "[0.50272274 0.54912758 0.17663097 0.79070699]", + "[1.50272274 1.54912758 1.17663097 1.79070699]" + ], + [ + 15, + "[0.04508126 0.76880038 0.80721325 0.62542385]", + "[1.04508126 1.76880038 1.80721331 1.62542391]" + ], + [ + 16, + "[0.19908059 0.17570406 0.51475513 0.1893943 ]", + "[1.19908059 1.175704 1.51475513 1.18939424]" + ], + [ + 17, + "[0.40167677 0.25953674 0.9407078 0.76308483]", + "[1.40167677 1.25953674 1.9407078 1.76308489]" + ], + [ + 18, + "[0.2480728 0.21694398 0.63941365 0.57128876]", + "[1.24807286 1.21694398 1.6394136 1.57128882]" + ], + [ + 19, + "[0.24388778 0.07268471 0.68350857 0.73431659]", + "[1.24388778 1.07268476 1.68350863 1.73431659]" + ], + [ + 20, + "[0.62569475 0.9881897 0.83639616 0.9828859 ]", + "[1.62569475 1.9881897 1.83639622 1.98288584]" + ], + [ + 21, + "[0.56922203 0.98222166 0.76851749 0.28615737]", + "[1.56922197 1.9822216 1.76851749 1.28615737]" + ], + [ + 22, + "[0.88776821 0.51636773 0.30333066 0.32230979]", + "[1.88776827 1.51636767 1.30333066 1.32230973]" + ], + [ + 23, + "[0.90817457 0.89270043 0.38583666 0.66566533]", + "[1.90817451 1.89270043 1.3858366 1.66566539]" + ], + [ + 24, + "[0.48507756 0.80808765 0.77162558 0.47834778]", + "[1.48507762 1.80808759 1.77162552 1.47834778]" + ], + [ + 25, + "[0.68062544 0.98093534 0.14778823 0.53244978]", + "[1.68062544 1.98093534 1.14778829 1.53244972]" + ], + [ + 26, + "[0.31518555 0.49643308 0.11509258 0.95458382]", + "[1.31518555 1.49643302 1.11509252 1.95458388]" + ], + [ + 27, + "[0.79121011 0.54161114 0.69369799 0.1520769 ]", + "[1.79121017 1.54161119 1.69369793 1.15207696]" + ], + [ + 28, + "[0.79423058 0.07138705 0.061777 0.18766576]", + "[1.79423058 1.07138705 1.061777 1.1876657 ]" + ], + [ + 29, + "[0.23942459 0.90487361 0.69337189 0.65089428]", + "[1.23942459 1.90487361 1.69337189 1.65089428]" + ], + [ + 30, + "[0.94516498 0.08422136 0.5608117 0.07652664]", + "[1.94516492 1.08422136 1.56081176 1.07652664]" + ], + [ + 31, + "[0.26661873 0.45946234 0.13510543 0.81294441]", + "[1.26661873 1.4594624 1.13510537 1.81294441]" + ], + [ + 32, + "[0.30754459 0.77694583 0.09278506 0.38326019]", + "[1.30754459 1.77694583 1.09278512 1.38326025]" + ], + [ + 33, + "[0.27845025 0.32472342 0.82203609 0.77107543]", + "[1.27845025 1.32472348 1.82203603 1.77107549]" + ], + [ + 34, + "[0.4827103 0.10563457 0.98858833 0.82286644]", + "[1.48271036 1.10563457 1.98858833 1.82286644]" + ], + [ + 35, + "[0.98033333 0.97656083 0.38939917 0.81491041]", + "[1.98033333 1.97656083 1.38939917 1.81491041]" + ], + [ + 36, + "[0.74064726 0.4155122 0.09800029 0.49930882]", + "[1.74064732 1.4155122 1.09800029 1.49930882]" + ], + [ + 37, + "[0.78956431 0.87284744 0.06880784 0.03455889]", + "[1.78956437 1.87284744 1.06880784 1.03455889]" + ], + [ + 38, + "[0.94221359 0.57740951 0.98649532 0.40934443]", + "[1.94221354 1.57740951 1.98649526 1.40934443]" + ], + [ + 39, + "[0.00497234 0.39319336 0.57054168 0.75150961]", + "[1.00497234 1.39319336 1.57054162 1.75150967]" + ], + [ + 40, + "[0.44330525 0.09997386 0.89025736 0.90507984]", + "[1.44330525 1.09997392 1.89025736 1.90507984]" + ], + [ + 41, + "[0.72290605 0.96945059 0.68354797 0.15270454]", + "[1.72290611 1.96945059 1.68354797 1.15270448]" + ], + [ + 42, + "[0.75292218 0.81470108 0.49657214 0.56217098]", + "[1.75292218 1.81470108 1.49657214 1.56217098]" + ], + [ + 43, + "[0.33480108 0.59181517 0.76198453 0.98062384]", + "[1.33480108 1.59181523 1.76198459 1.98062384]" + ], + [ + 44, + "[0.52784437 0.54268694 0.12358981 0.72116476]", + "[1.52784443 1.54268694 1.12358975 1.7211647 ]" + ], + [ + 45, + "[0.73217702 0.65233225 0.44077861 0.33837909]", + "[1.73217702 1.65233231 1.44077861 1.33837914]" + ], + [ + 46, + "[0.34084332 0.73018837 0.54168713 0.91440833]", + "[1.34084332 1.73018837 1.54168713 1.91440833]" + ], + [ + 47, + "[0.60110539 0.3618983 0.32342511 0.98672163]", + "[1.60110545 1.3618983 1.32342505 1.98672163]" + ], + [ + 48, + "[0.77427191 0.21829212 0.12769502 0.74303615]", + "[1.77427197 1.21829212 1.12769508 1.74303615]" + ], + [ + 49, + "[0.08107251 0.2602725 0.18861133 0.44833237]", + "[1.08107257 1.2602725 1.18861127 1.44833231]" + ], + [ + 50, + "[0.59812403 0.78395379 0.0291847 0.81814629]", + "[1.59812403 1.78395379 1.0291847 1.81814623]" + ], + [ + 51, + "[0.93488538 0.73882395 0.37345302 0.0274905 ]", + "[1.93488538 1.73882389 1.37345302 1.0274905 ]" + ], + [ + 52, + "[0.30631393 0.48311198 0.87847513 0.67559886]", + "[1.30631399 1.48311198 1.87847519 1.67559886]" + ], + [ + 53, + "[0.18720162 0.74115586 0.98626411 0.30355608]", + "[1.18720162 1.74115586 1.98626411 1.30355608]" + ], + [ + 54, + "[0.85566247 0.83362883 0.48424995 0.25265992]", + "[1.85566247 1.83362889 1.48424995 1.25265992]" + ], + [ + 55, + "[0.95928186 0.84273899 0.71514636 0.38619852]", + "[1.95928192 1.84273899 1.7151463 1.38619852]" + ], + [ + 56, + "[0.32565445 0.90939188 0.07488042 0.13730896]", + "[1.32565451 1.90939188 1.07488036 1.13730896]" + ], + [ + 57, + "[0.9829582 0.59269661 0.40120947 0.95487177]", + "[1.9829582 1.59269667 1.40120947 1.95487177]" + ], + [ + 58, + "[0.79905868 0.89367443 0.75429088 0.3190186 ]", + "[1.79905868 1.89367437 1.75429082 1.3190186 ]" + ], + [ + 59, + "[0.54914117 0.03810108 0.87531954 0.73044223]", + "[1.54914117 1.03810108 1.87531948 1.73044229]" + ], + [ + 60, + "[0.67418337 0.79634351 0.23229051 0.71345252]", + "[1.67418337 1.79634356 1.23229051 1.71345258]" + ], + [ + 61, + "[0.87285906 0.48354989 0.39394957 0.59456545]", + "[1.872859 1.48354983 1.39394951 1.59456539]" + ], + [ + 62, + "[0.81788456 0.58174163 0.29376316 0.7971254 ]", + "[1.81788456 1.58174157 1.29376316 1.79712534]" + ], + [ + 63, + "[0.94559073 0.65736622 0.25761551 0.48553199]", + "[1.94559073 1.65736628 1.25761557 1.48553205]" + ], + [ + 64, + "[0.60075855 0.12234765 0.00614399 0.30560958]", + "[1.60075855 1.12234759 1.00614405 1.30560958]" + ], + [ + 65, + "[0.39147133 0.29854035 0.84663737 0.58175623]", + "[1.39147139 1.29854035 1.84663737 1.58175623]" + ], + [ + 66, + "[0.02162331 0.81861657 0.92468154 0.07808572]", + "[1.02162337 1.81861663 1.92468154 1.07808566]" + ], + [ + 67, + "[0.02235305 0.52774918 0.7331115 0.84358269]", + "[1.02235305 1.52774918 1.7331115 1.84358263]" + ], + [ + 68, + "[0.6080932 0.56563014 0.32107437 0.72599429]", + "[1.60809326 1.5656302 1.32107437 1.72599435]" + ], + [ + 69, + "[0.67447788 0.6125319 0.98007888 0.65968603]", + "[1.67447782 1.6125319 1.98007894 1.65968609]" + ], + [ + 70, + "[0.47963417 0.81818312 0.48720706 0.49339259]", + "[1.47963417 1.81818318 1.48720706 1.49339259]" + ], + [ + 71, + "[0.9630242 0.76359051 0.24853623 0.76881069]", + "[1.96302414 1.76359057 1.24853623 1.76881075]" + ], + [ + 72, + "[0.60609657 0.96257663 0.19292736 0.95702219]", + "[1.60609651 1.96257663 1.19292736 1.95702219]" + ], + [ + 73, + "[0.80654246 0.08253473 0.74478531 0.71257162]", + "[1.8065424 1.08253479 1.74478531 1.71257162]" + ], + [ + 74, + "[0.70167565 0.26930219 0.5660674 0.61194974]", + "[1.70167565 1.26930213 1.56606746 1.61194968]" + ], + [ + 75, + "[0.76933283 0.86241865 0.44114518 0.65644735]", + "[1.76933289 1.86241865 1.44114518 1.65644741]" + ], + [ + 76, + "[0.59492421 0.90274489 0.38069052 0.46101224]", + "[1.59492421 1.90274489 1.38069057 1.46101224]" + ], + [ + 77, + "[0.15064228 0.03198934 0.25754827 0.51484001]", + "[1.15064228 1.03198934 1.25754833 1.51484001]" + ], + [ + 78, + "[0.12024075 0.21342516 0.56858408 0.58644271]", + "[1.12024069 1.21342516 1.56858408 1.58644271]" + ], + [ + 79, + "[0.91730917 0.22574073 0.09591609 0.33056474]", + "[1.91730917 1.22574067 1.09591603 1.33056474]" + ], + [ + 80, + "[0.49691743 0.61873293 0.90698647 0.94486356]", + "[1.49691749 1.61873293 1.90698647 1.94486356]" + ], + [ + 81, + "[0.6032477 0.83361369 0.18538666 0.19108021]", + "[1.60324764 1.83361363 1.18538666 1.19108021]" + ], + [ + 82, + "[0.63235509 0.70352674 0.96188956 0.46240485]", + "[1.63235509 1.70352674 1.96188951 1.46240485]" + ], + [ + 83, + "[0.37959969 0.42820001 0.10690689 0.96353984]", + "[1.37959969 1.42820001 1.10690689 1.96353984]" + ], + [ + 84, + "[0.49607176 0.1922397 0.46640229 0.78321403]", + "[1.49607182 1.19223976 1.46640229 1.78321409]" + ], + [ + 85, + "[0.40234613 0.54987347 0.49542785 0.54153186]", + "[1.40234613 1.54987347 1.49542785 1.5415318 ]" + ], + [ + 86, + "[0.80893755 0.92237449 0.88346356 0.93164903]", + "[1.80893755 1.92237449 1.88346362 1.93164897]" + ], + [ + 87, + "[0.12858278 0.09930819 0.83222693 0.72485673]", + "[1.12858272 1.09930825 1.83222699 1.72485673]" + ], + [ + 88, + "[0.72470158 0.4940322 0.41027349 0.89364016]", + "[1.72470164 1.49403214 1.41027355 1.89364016]" + ], + [ + 89, + "[0.47856545 0.46267092 0.6376707 0.84747767]", + "[1.47856545 1.46267092 1.63767076 1.84747767]" + ], + [ + 90, + "[0.49584109 0.80599248 0.07096875 0.75872749]", + "[1.49584103 1.80599248 1.07096875 1.75872755]" + ], + [ + 91, + "[0.43500566 0.66041756 0.80293626 0.96224713]", + "[1.43500566 1.66041756 1.80293632 1.96224713]" + ], + [ + 92, + "[0.78397602 0.74223626 0.26603186 0.41664881]", + "[1.78397608 1.74223626 1.26603186 1.41664886]" + ], + [ + 93, + "[0.28942841 0.05601001 0.33039129 0.27781558]", + "[1.28942847 1.05601001 1.33039129 1.27781558]" + ], + [ + 94, + "[0.68094063 0.45189077 0.22661722 0.37354094]", + "[1.68094063 1.45189071 1.22661722 1.37354088]" + ], + [ + 95, + "[0.43681622 0.74680805 0.83598751 0.12414402]", + "[1.43681622 1.74680805 1.83598757 1.12414408]" + ], + [ + 96, + "[0.47870928 0.17129105 0.27300501 0.20634609]", + "[1.47870922 1.17129111 1.27300501 1.20634604]" + ], + [ + 97, + "[0.72795159 0.79317838 0.27832931 0.96576637]", + "[1.72795153 1.79317832 1.27832937 1.96576643]" + ], + [ + 98, + "[0.87608397 0.93200487 0.80169648 0.37758952]", + "[1.87608397 1.93200493 1.80169654 1.37758946]" + ], + [ + 99, + "[0.68891573 0.25576538 0.96339929 0.503833 ]", + "[1.68891573 1.25576544 1.96339929 1.50383306]" + ] + ] + }, + "training": { + "columns": [ + "training_loss" + ], + "data": [ + [ + 6.014081001281738 + ], + [ + 5.580916404724121 + ], + [ + 5.274184226989746 + ], + [ + 5.0237603187561035 + ], + [ + 4.804426670074463 + ], + [ + 4.605026721954346 + ], + [ + 4.419903755187988 + ], + [ + 4.246149063110352 + ], + [ + 4.082696914672852 + ], + [ + 3.9301321506500244 + ], + [ + 3.7902746200561523 + ], + [ + 3.6642696857452393 + ], + [ + 3.5418264865875244 + ], + [ + 3.3390703201293945 + ], + [ + 2.8697218894958496 + ], + [ + 2.3933401107788086 + ], + [ + 2.047636032104492 + ], + [ + 1.83914053440094 + ], + [ + 1.7334750890731812 + ], + [ + 1.6865350008010864 + ], + [ + 1.666785478591919 + ], + [ + 1.658176302909851 + ], + [ + 1.6540385484695435 + ], + [ + 1.651779055595398 + ], + [ + 1.650368094444275 + ], + [ + 1.6493637561798096 + ], + [ + 1.6485661268234253 + ], + [ + 1.6478790044784546 + ], + [ + 1.6472536325454712 + ], + [ + 1.6466654539108276 + ], + [ + 1.6461007595062256 + ], + [ + 1.6455528736114502 + ], + [ + 1.6450183391571045 + ], + [ + 1.6444944143295288 + ], + [ + 1.643980622291565 + ], + [ + 1.6434764862060547 + ], + [ + 1.6429831981658936 + ], + [ + 1.6424978971481323 + ], + [ + 1.64202082157135 + ], + [ + 1.6415510177612305 + ], + [ + 1.6410887241363525 + ], + [ + 1.6406346559524536 + ], + [ + 1.6401888132095337 + ], + [ + 1.639750361442566 + ], + [ + 1.6393187046051025 + ], + [ + 1.6388964653015137 + ], + [ + 1.6384804248809814 + ], + [ + 1.638070821762085 + ], + [ + 1.6376668214797974 + ], + [ + 1.6372689008712769 + ], + [ + 1.6368769407272339 + ], + [ + 1.6364902257919312 + ], + [ + 1.636109471321106 + ], + [ + 1.6357333660125732 + ], + [ + 1.6353627443313599 + ], + [ + 1.6349972486495972 + ], + [ + 1.6346369981765747 + ], + [ + 1.6342813968658447 + ], + [ + 1.6339303255081177 + ], + [ + 1.6335841417312622 + ], + [ + 1.6332424879074097 + ], + [ + 1.6329057216644287 + ], + [ + 1.6325738430023193 + ], + [ + 1.6322462558746338 + ], + [ + 1.6319226026535034 + ], + [ + 1.6316030025482178 + ], + [ + 1.6312874555587769 + ], + [ + 1.6309759616851807 + ], + [ + 1.6306681632995605 + ], + [ + 1.630364179611206 + ], + [ + 1.6300634145736694 + ], + [ + 1.629766821861267 + ], + [ + 1.629473328590393 + ], + [ + 1.6291834115982056 + ], + [ + 1.628896713256836 + ], + [ + 1.6286135911941528 + ], + [ + 1.628333568572998 + ], + [ + 1.628056526184082 + ], + [ + 1.6277827024459839 + ], + [ + 1.6275124549865723 + ], + [ + 1.6272450685501099 + ], + [ + 1.6269807815551758 + ], + [ + 1.6267189979553223 + ], + [ + 1.626460075378418 + ], + [ + 1.6262041330337524 + ], + [ + 1.625950813293457 + ], + [ + 1.6256998777389526 + ], + [ + 1.625451683998108 + ], + [ + 1.6252059936523438 + ], + [ + 1.6249629259109497 + ], + [ + 1.6247217655181885 + ], + [ + 1.6244832277297974 + ], + [ + 1.6242470741271973 + ], + [ + 1.6240129470825195 + ], + [ + 1.6237813234329224 + ], + [ + 1.6235517263412476 + ], + [ + 1.6233243942260742 + ], + [ + 1.6230992078781128 + ], + [ + 1.6228758096694946 + ], + [ + 1.622654676437378 + ] + ] + } + }, + "other": { + "model": "ModelConfig(model=Sequential(\n (0) - Identity(): Input__tensor_1_output -> START_Repeat_1_output\n (1) - Linear(4, 4, bias=True): START_Repeat_1_output -> Linear_1_output\n (2) - : Linear_1_output -> Activation_1_output\n (3) - Identity(): Activation_1_output -> START_Repeat_1_output\n (4) - Linear(4, 4, bias=True): START_Repeat_1_output -> Linear_1_output\n (5) - : Linear_1_output -> Activation_1_output\n (6) - Identity(): Activation_1_output -> END_Repeat_1_output\n (7) - Identity(): END_Repeat_1_output -> Output_1_x\n (8) - Identity(): Output_1_x -> Output_1_x\n), model_inputs=['Input__tensor_1_output'], model_outputs=['Output_1_x'], loss_inputs=['Input__tensor_3_output', 'Output_1_x'], loss=Sequential(\n (0) - . at 0x761ebc727740>: nothing -> Constant_vector_1_output\n (1) - : Input__tensor_3_output, Constant_vector_1_output -> Add_1_output\n (2) - : Output_1_x, Add_1_output -> MSE_loss_2_output\n (3) - Identity(): MSE_loss_2_output -> loss\n), optimizer_parameters={'lr': 0.1, 'type': }, 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='Model definition', trained=True)" + }, + "relations": [] + }, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "index", + "pred", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "index", + "x", + "y" + ] + }, + "training": { + "columns": [ + "training_loss" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__tensor_1_output" + ], + "loss_inputs": [ + "Input__tensor_3_output", + "Output_1_x" + ], + "outputs": [ + "Output_1_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": { + "_tables_open": { + "df_test": true + }, + "limit": 100.0 + }, + "status": "done", + "title": "View tables" + }, + "dragHandle": ".bg-primary", + "height": 636.0, + "id": "View tables 1", + "position": { + "x": 3075.0, + "y": -90.0 + }, + "type": "table_view", + "width": 603.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": { + "series": [ + { + "data": [ + [ + -1287.0316162109375, + -197.19064331054688, + "", + -10.191871643066406 + ], + [ + 1850.403076171875, + -1934.8701171875, + "", + -10.843463897705078 + ], + [ + -2139.6982421875, + 2140.9306640625, + "", + -9.693496704101562 + ], + [ + -829.4639892578125, + 1453.0125732421875, + "", + -12.964160919189453 + ], + [ + -2034.95068359375, + -2228.56005859375, + "", + -8.494583129882812 + ], + [ + 775.7841796875, + -987.1351318359375, + "", + -7.914520263671875 + ], + [ + -834.7413330078125, + -1010.576904296875, + "", + -11.352218627929688 + ], + [ + 1341.696044921875, + 327.52203369140625, + "", + -12.275350570678711 + ], + [ + 2031.8687744140625, + 1949.9718017578125, + "", + -11.710403442382812 + ], + [ + 506.062255859375, + 1029.9742431640625, + "", + -8.997444152832031 + ] + ], + "symbolSize": 15.811388300841896, + "type": "scatter" + } + ], + "title": { + "text": "UMAP projection of pred" + }, + "tooltip": { + "show": false + }, + "visualMap": { + "calculable": true, + "dimension": 3, + "inRange": { + "color": [ + "#440154", + "#482777", + "#3E4989", + "#31688E", + "#26828E", + "#1F9E89", + "#35B779", + "#6CCE59", + "#B4DE2C", + "#FDE725" + ] + }, + "max": -7.914520263671875, + "min": -12.964160919189453, + "right": 10, + "top": "center" + }, + "xAxis": [ + { + "type": "value" + } + ], + "yAxis": [ + { + "type": "value" + } + ] + }, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "x", + "y" + ] + }, + "df_test": { + "columns": [ + "index", + "pred", + "x", + "y" + ] + }, + "df_train": { + "columns": [ + "index", + "x", + "y" + ] + }, + "training": { + "columns": [ + "training_loss" + ] + } + }, + "other": { + "model": { + "model": { + "inputs": [ + "Input__tensor_1_output" + ], + "loss_inputs": [ + "Input__tensor_3_output", + "Output_1_x" + ], + "outputs": [ + "Output_1_x" + ], + "trained": true + }, + "type": "model" + } + }, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View vectors", + "outputs": {}, + "params": { + "label_column": { + "default": "", + "name": "label_column", + "type": { + "type": "" + } + }, + "table_name": { + "default": "nodes", + "name": "table_name", + "type": { + "type": "" + } + }, + "vector_column": { + "default": "", + "name": "vector_column", + "type": { + "type": "" + } + } + }, + "position": { + "x": 943.0, + "y": 315.0 + }, + "type": "visualization" + }, + "params": { + "label_column": "", + "table_name": "df_test", + "vector_column": "pred" + }, + "status": "done", + "title": "View vectors" + }, + "dragHandle": ".bg-primary", + "height": 668.0, + "id": "View vectors 1", + "position": { + "x": 3091.4609779299844, + "y": 659.497108066971 + }, + "type": "visualization", + "width": 613.0 + } + ] +} diff --git a/examples/NetworkX demo b/examples/NetworkX demo.lynxkite.json similarity index 100% rename from examples/NetworkX demo rename to examples/NetworkX demo.lynxkite.json diff --git a/examples/ODE-GNN experiment.lynxkite.json b/examples/ODE-GNN experiment.lynxkite.json new file mode 100644 index 0000000000000000000000000000000000000000..a7f890e74e5d9560f2ca764bed444d82257d53b2 --- /dev/null +++ b/examples/ODE-GNN experiment.lynxkite.json @@ -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/ODE-GNN.lynxkite.json b/examples/ODE-GNN.lynxkite.json new file mode 100644 index 0000000000000000000000000000000000000000..9068d6506e6ef8f0ade35c7ea70b2ad7661149c0 --- /dev/null +++ b/examples/ODE-GNN.lynxkite.json @@ -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/PyTorch demo b/examples/PyTorch demo.lynxkite.json similarity index 100% rename from examples/PyTorch demo rename to examples/PyTorch demo.lynxkite.json diff --git a/examples/RAG chatbot app b/examples/RAG chatbot app.lynxkite.json similarity index 100% rename from examples/RAG chatbot app rename to examples/RAG chatbot app.lynxkite.json diff --git a/examples/Word2vec.lynxkite.json b/examples/Word2vec.lynxkite.json new file mode 100644 index 0000000000000000000000000000000000000000..518b2827bc8f081b5349c9e50ac805ce942adb0d --- /dev/null +++ b/examples/Word2vec.lynxkite.json @@ -0,0 +1,3822 @@ +{ + "edges": [ + { + "id": "Word2vec for the top 1000 words 1 Sample N 1", + "source": "Word2vec for the top 1000 words 1", + "sourceHandle": "output", + "target": "Sample N 1", + "targetHandle": "df" + }, + { + "id": "Sample N 1 View vectors 2", + "source": "Sample N 1", + "sourceHandle": "output", + "target": "View vectors 2", + "targetHandle": "bundle" + }, + { + "id": "Word2vec for the top 1000 words 1 Take first N 1", + "source": "Word2vec for the top 1000 words 1", + "sourceHandle": "output", + "target": "Take first N 1", + "targetHandle": "df" + }, + { + "id": "Take first N 1 View vectors 1", + "source": "Take first N 1", + "sourceHandle": "output", + "target": "View vectors 1", + "targetHandle": "bundle" + } + ], + "env": "LynxKite Graph Analytics", + "nodes": [ + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": { + "series": [ + { + "data": [ + [ + -550.2080078125, + -193.56869506835938, + "the", + -7.1511993408203125 + ], + [ + -51.58413314819336, + -253.1653289794922, + "of", + -10.931352615356445 + ], + [ + 236.92782592773438, + 277.9530029296875, + "to", + -10.808002471923828 + ], + [ + -123.2071533203125, + 143.89501953125, + "and", + -11.119552612304688 + ], + [ + -304.17584228515625, + -248.37879943847656, + "a", + -9.488176345825195 + ], + [ + 543.546875, + -380.580322265625, + "in", + -4.3983306884765625 + ], + [ + 307.809814453125, + 404.77410888671875, + "is", + -5.574165344238281 + ], + [ + 829.3927001953125, + 185.58872985839844, + "it", + -8.320213317871094 + ], + [ + 201.67181396484375, + -340.33837890625, + "you", + -9.855392456054688 + ], + [ + 605.5860595703125, + 753.9739990234375, + "that", + -3.7964401245117188 + ], + [ + -464.0140380859375, + 508.30364990234375, + "he", + -9.057525634765625 + ], + [ + -376.85113525390625, + -379.007568359375, + "was", + -5.062995910644531 + ], + [ + -155.01657104492188, + 40.06785583496094, + "for", + -5.726282119750977 + ], + [ + -287.4300537109375, + 166.65663146972656, + "on", + -4.712070465087891 + ], + [ + -80.4262466430664, + -338.1707763671875, + "are", + -8.356330871582031 + ], + [ + -220.5533447265625, + -138.72828674316406, + "with", + -4.086139678955078 + ], + [ + 30.056007385253906, + 149.19552612304688, + "as", + -4.268444061279297 + ], + [ + -175.18438720703125, + -111.49411010742188, + "I", + -9.832773208618164 + ], + [ + 236.69482421875, + -192.7000732421875, + "his", + -9.301101684570312 + ], + [ + 150.2474365234375, + -136.1674346923828, + "they", + -9.037469863891602 + ], + [ + -429.0916748046875, + 437.9788818359375, + "be", + -7.986484527587891 + ], + [ + 452.71356201171875, + 437.95086669921875, + "at", + -4.875827789306641 + ], + [ + 617.0352783203125, + -630.5379638671875, + "one", + -6.1219940185546875 + ], + [ + 486.7861328125, + 477.48809814453125, + "have", + -11.648157119750977 + ], + [ + 522.38427734375, + -220.94395446777344, + "this", + -6.2866668701171875 + ], + [ + -56.12694549560547, + -336.9961242675781, + "from", + -5.182554244995117 + ], + [ + 358.8907470703125, + 213.52056884765625, + "or", + -6.3631744384765625 + ], + [ + 39.158935546875, + 485.28778076171875, + "had", + -11.298377990722656 + ], + [ + -453.17144775390625, + -448.9779052734375, + "by", + -3.24090576171875 + ], + [ + -864.658203125, + 837.901611328125, + "not", + -6.5158233642578125 + ], + [ + 235.3666229248047, + -360.3839111328125, + "word", + -2.8296165466308594 + ], + [ + 16.86553192138672, + -306.6860656738281, + "but", + -3.667888641357422 + ], + [ + 57.00987243652344, + 278.17431640625, + "what", + -7.613521575927734 + ], + [ + 79.3001708984375, + 318.89569091796875, + "some", + -6.575878143310547 + ], + [ + 505.434326171875, + 321.3858947753906, + "we", + -8.818180084228516 + ], + [ + -310.1900634765625, + -52.102500915527344, + "can", + -7.497550964355469 + ], + [ + -347.4095153808594, + 359.81982421875, + "out", + -4.6057891845703125 + ], + [ + 301.33197021484375, + 99.00799560546875, + "other", + -12.146160125732422 + ], + [ + 370.1690673828125, + -343.7665710449219, + "were", + -10.579906463623047 + ], + [ + -250.0229949951172, + 91.7080078125, + "all", + -11.757408142089844 + ], + [ + -438.34014892578125, + -458.03118896484375, + "there", + -10.018669128417969 + ], + [ + 206.314697265625, + -298.57794189453125, + "when", + -6.686424255371094 + ], + [ + 331.2621154785156, + -255.24049377441406, + "up", + -10.357263565063477 + ], + [ + 287.84820556640625, + -292.0658264160156, + "use", + -8.055950164794922 + ], + [ + -294.0262756347656, + 360.35107421875, + "your", + -7.927600860595703 + ], + [ + -484.65301513671875, + -360.6261901855469, + "how", + -8.422859191894531 + ], + [ + -120.36991882324219, + 274.15667724609375, + "said", + -7.161012649536133 + ], + [ + 89.53871154785156, + -6.135284423828125, + "an", + -7.244850158691406 + ], + [ + -212.00540161132812, + -53.253265380859375, + "each", + -5.8790435791015625 + ], + [ + 160.35023498535156, + 126.24497985839844, + "she", + -8.766075134277344 + ] + ], + "symbolSize": 20.91279105182546, + "type": "scatter" + } + ], + "title": { + "text": "UMAP projection of embedding" + }, + "tooltip": { + "formatter": "GET_THIRD_VALUE", + "trigger": "item" + }, + "visualMap": { + "calculable": true, + "dimension": 3, + "inRange": { + "color": [ + "#440154", + "#482777", + "#3E4989", + "#31688E", + "#26828E", + "#1F9E89", + "#35B779", + "#6CCE59", + "#B4DE2C", + "#FDE725" + ] + }, + "max": -2.8296165466308594, + "min": -12.146160125732422, + "right": 10, + "top": "center" + }, + "xAxis": [ + { + "type": "value" + } + ], + "yAxis": [ + { + "type": "value" + } + ] + }, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "embedding", + "word" + ] + } + }, + "other": {}, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View vectors", + "outputs": {}, + "params": { + "label_column": { + "default": "", + "name": "label_column", + "type": { + "type": "" + } + }, + "metric": { + "default": "euclidean", + "name": "metric", + "type": { + "enum": [ + "l1", + "cityblock", + "taxicab", + "manhattan", + "euclidean", + "l2", + "sqeuclidean", + "canberra", + "minkowski", + "chebyshev", + "linf", + "cosine", + "correlation", + "hellinger", + "hamming" + ] + } + }, + "min_dist": { + "default": 0.1, + "name": "min_dist", + "type": { + "type": "" + } + }, + "n_neighbors": { + "default": 15.0, + "name": "n_neighbors", + "type": { + "type": "" + } + }, + "table_name": { + "default": "nodes", + "name": "table_name", + "type": { + "type": "" + } + }, + "vector_column": { + "default": "", + "name": "vector_column", + "type": { + "type": "" + } + } + }, + "type": "visualization" + }, + "params": { + "label_column": "word", + "table_name": "df", + "vector_column": "embedding" + }, + "status": "done", + "title": "View vectors" + }, + "dragHandle": ".bg-primary", + "height": 642.0, + "id": "View vectors 1", + "position": { + "x": 499.0, + "y": -42.0 + }, + "type": "visualization", + "width": 609.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": { + "series": [ + { + "data": [ + [ + 9.705421447753906, + -1.6202621459960938, + "connect", + -5.043638229370117 + ], + [ + 9.130412101745605, + -0.5033645629882812, + "person", + -5.379600524902344 + ], + [ + 8.443862915039062, + -1.641103744506836, + "city", + -8.620040893554688 + ], + [ + 7.245532035827637, + 0.04806041717529297, + "yard", + -3.694864273071289 + ], + [ + 9.24234390258789, + -1.4390363693237305, + "paragraph", + -6.138225555419922 + ], + [ + 7.8748064041137695, + 0.12785911560058594, + "sail", + -3.2888870239257812 + ], + [ + 10.727043151855469, + -0.4813880920410156, + "don't", + -6.996122360229492 + ], + [ + 9.738138198852539, + -0.7770423889160156, + "possible", + -6.681423187255859 + ], + [ + 9.615436553955078, + 0.6433887481689453, + "force", + -4.459627151489258 + ], + [ + 7.484790802001953, + 0.5414066314697266, + "hot", + -2.813547134399414 + ], + [ + 11.386945724487305, + -0.5916843414306641, + "all", + -7.671173095703125 + ], + [ + 9.722660064697266, + -1.8213415145874023, + "low", + -5.899736404418945 + ], + [ + 9.952056884765625, + 0.49077796936035156, + "settle", + -4.838972091674805 + ], + [ + 9.000537872314453, + 0.9387826919555664, + "tie", + -3.8841114044189453 + ], + [ + 7.964543342590332, + -1.220489501953125, + "space", + -2.7294235229492188 + ], + [ + 8.902664184570312, + -0.0771026611328125, + "complete", + -4.395469665527344 + ], + [ + 10.087776184082031, + -1.5750312805175781, + "reach", + -4.78887939453125 + ], + [ + 10.26522445678711, + -0.6015787124633789, + "tell", + -6.619012832641602 + ], + [ + 9.41927719116211, + -1.2343559265136719, + "new", + -5.117774963378906 + ], + [ + 7.931597709655762, + -1.9762115478515625, + "molecule", + -2.740489959716797 + ], + [ + 9.86049747467041, + 0.8259296417236328, + "sharp", + -4.102287292480469 + ], + [ + 9.280028343200684, + 1.0119094848632812, + "draw", + -4.37700080871582 + ], + [ + 10.876468658447266, + -1.1106939315795898, + "no", + -7.861886978149414 + ], + [ + 11.241806030273438, + -0.7494087219238281, + "present", + -7.815248489379883 + ], + [ + 9.479208946228027, + -1.8511619567871094, + "raise", + -5.727174758911133 + ], + [ + 10.78598403930664, + -0.8624553680419922, + "may", + -7.379493713378906 + ], + [ + 7.929062843322754, + -0.9780731201171875, + "gold", + -2.9003143310546875 + ], + [ + 8.704174041748047, + -1.4303770065307617, + "condition", + -5.16314697265625 + ], + [ + 10.054300308227539, + -0.4632568359375, + "loud", + -8.089111328125 + ], + [ + 8.433553695678711, + -0.27761077880859375, + "mile", + -5.262186050415039 + ], + [ + 7.497696876525879, + -0.8923044204711914, + "paint", + -3.392353057861328 + ], + [ + 8.929729461669922, + -2.335226058959961, + "use", + -1.1991100311279297 + ], + [ + 8.1669340133667, + -1.5521936416625977, + "blood", + -2.562234878540039 + ], + [ + 8.58918285369873, + -2.1446266174316406, + "sheet", + -2.9479713439941406 + ], + [ + 10.316741943359375, + -0.2744626998901367, + "listen", + -6.7239990234375 + ], + [ + 9.21673583984375, + 0.5316085815429688, + "day", + -5.576120376586914 + ], + [ + 10.390461921691895, + -1.7747783660888672, + "take", + -6.935983657836914 + ], + [ + 9.087207794189453, + 0.44107818603515625, + "week", + -5.709781646728516 + ], + [ + 10.248027801513672, + 0.15464496612548828, + "caught", + -6.537464141845703 + ], + [ + 11.156108856201172, + -0.9192447662353516, + "many", + -7.435237884521484 + ], + [ + 8.403881072998047, + 0.2333669662475586, + "on", + -3.6714611053466797 + ], + [ + 9.728498458862305, + -1.3807125091552734, + "be", + -6.650819778442383 + ], + [ + 9.53528881072998, + -0.36866092681884766, + "end", + -5.020048141479492 + ], + [ + 11.065614700317383, + 0.04558753967285156, + "about", + -7.400260925292969 + ], + [ + 8.444879531860352, + 0.5892887115478516, + "ring", + -2.301654815673828 + ], + [ + 10.786881446838379, + -0.13848304748535156, + "happen", + -6.555196762084961 + ], + [ + 8.215581893920898, + -0.8318119049072266, + "arrange", + -3.6642894744873047 + ], + [ + 10.239469528198242, + -0.6189842224121094, + "answer", + -5.80389404296875 + ], + [ + 6.976543426513672, + -1.0019855499267578, + "cow", + -1.7641487121582031 + ], + [ + 8.645442962646484, + 0.3105010986328125, + "lay", + -2.9696044921875 + ], + [ + 9.819766998291016, + -0.5371360778808594, + "our", + -5.621616363525391 + ], + [ + 8.841897010803223, + -0.2823143005371094, + "pass", + -4.711799621582031 + ], + [ + 8.729131698608398, + -0.5525054931640625, + "children", + -3.3475284576416016 + ], + [ + 9.393856048583984, + 0.18387985229492188, + "went", + -4.9727935791015625 + ], + [ + 10.763107299804688, + 0.2324657440185547, + "had", + -7.250463485717773 + ], + [ + 7.568221092224121, + -0.7809352874755859, + "dress", + -2.3141956329345703 + ], + [ + 7.192462921142578, + -0.596705436706543, + "rain", + -2.3895015716552734 + ], + [ + 10.875743865966797, + 0.43859291076660156, + "under", + -6.414041519165039 + ], + [ + 8.407270431518555, + -0.7229270935058594, + "fresh", + -3.883523941040039 + ], + [ + 9.625202178955078, + -0.2839069366455078, + "as", + -4.919961929321289 + ], + [ + 10.221067428588867, + -1.122823715209961, + "favor", + -6.969539642333984 + ], + [ + 10.634981155395508, + -0.4026145935058594, + "we", + -7.041242599487305 + ], + [ + 10.520210266113281, + -0.4237394332885742, + "decide", + -6.301200866699219 + ], + [ + 7.844219207763672, + 0.047156333923339844, + "old", + -3.07623291015625 + ], + [ + 11.162557601928711, + -1.0388507843017578, + "except", + -7.269565582275391 + ], + [ + 9.899114608764648, + -1.1657962799072266, + "is", + -6.526023864746094 + ], + [ + 9.717798233032227, + 1.0700626373291016, + "fine", + -4.418558120727539 + ], + [ + 7.917577743530273, + 0.7061672210693359, + "double", + -3.7655868530273438 + ], + [ + 9.55799674987793, + -1.7506284713745117, + "pay", + -4.489490509033203 + ], + [ + 8.555315017700195, + 0.5093526840209961, + "finish", + -3.569110870361328 + ], + [ + 8.173162460327148, + 1.0935115814208984, + "son", + -3.1344070434570312 + ], + [ + 9.881093978881836, + 1.0684623718261719, + "open", + -4.771450042724609 + ], + [ + 9.507574081420898, + 0.4131736755371094, + "when", + -4.696849822998047 + ], + [ + 8.903182983398438, + -1.9196205139160156, + "build", + -0.8535995483398438 + ], + [ + 7.771153450012207, + 0.3381786346435547, + "horse", + -3.4455909729003906 + ], + [ + 8.923187255859375, + 0.026734352111816406, + "soldier", + -4.742025375366211 + ], + [ + 7.932086944580078, + -2.0627002716064453, + "skin", + -2.5560951232910156 + ], + [ + 7.976713180541992, + 0.23676300048828125, + "man", + -2.6652889251708984 + ], + [ + 10.759855270385742, + -0.7708530426025391, + "why", + -6.99298095703125 + ], + [ + 10.4178466796875, + -1.4358654022216797, + "every", + -5.325008392333984 + ], + [ + 9.661596298217773, + 0.3596515655517578, + "show", + -3.9961814880371094 + ], + [ + 11.333105087280273, + -0.7634057998657227, + "these", + -7.542236328125 + ], + [ + 10.327091217041016, + -1.4170989990234375, + "fear", + -6.658540725708008 + ], + [ + 10.889259338378906, + -0.2451791763305664, + "else", + -7.781885147094727 + ], + [ + 7.222639083862305, + -0.05264759063720703, + "pound", + -2.745464324951172 + ], + [ + 7.469949722290039, + -1.0274600982666016, + "yellow", + -2.2890396118164062 + ], + [ + 9.524869918823242, + -1.1965618133544922, + "broad", + -7.949125289916992 + ], + [ + 10.313518524169922, + -1.9088897705078125, + "an", + -6.125152587890625 + ], + [ + 9.635832786560059, + 0.08489990234375, + "toward", + -6.423177719116211 + ], + [ + 7.064798355102539, + -1.10357666015625, + "white", + -2.0485153198242188 + ], + [ + 9.926129341125488, + -2.0169029235839844, + "rather", + -5.7935638427734375 + ], + [ + 10.298717498779297, + -1.9158267974853516, + "less", + -6.034486770629883 + ], + [ + 10.206244468688965, + -1.3451213836669922, + "hold", + -6.559795379638672 + ], + [ + 8.863961219787598, + -2.0822811126708984, + "form", + -8.684537887573242 + ], + [ + 7.558222770690918, + -1.840799331665039, + "apple", + -1.6394634246826172 + ], + [ + 8.403818130493164, + 0.18453121185302734, + "whose", + -4.023681640625 + ], + [ + 7.2743330001831055, + -1.6126747131347656, + "bread", + -1.5011749267578125 + ], + [ + 9.95626449584961, + 0.5859489440917969, + "come", + -4.769378662109375 + ], + [ + 8.958946228027344, + -1.326472282409668, + "column", + -6.362823486328125 + ], + [ + 9.383491516113281, + -0.3816204071044922, + "job", + -5.734615325927734 + ], + [ + 9.965450286865234, + -0.7369594573974609, + "miss", + -6.288843154907227 + ], + [ + 10.278857231140137, + -0.7298774719238281, + "feel", + -6.029008865356445 + ], + [ + 7.315210342407227, + -1.2789764404296875, + "heat", + -1.259420394897461 + ], + [ + 9.34441089630127, + -1.8565330505371094, + "create", + -5.0209808349609375 + ], + [ + 7.271982192993164, + -0.5561141967773438, + "red", + -2.5511512756347656 + ], + [ + 9.83324909210205, + -1.9700841903686523, + "buy", + -1.4719467163085938 + ], + [ + 7.415467262268066, + -0.17502975463867188, + "picture", + -2.203298568725586 + ], + [ + 11.020034790039062, + 0.1524524688720703, + "thought", + -7.610630035400391 + ], + [ + 8.17623519897461, + -0.30194091796875, + "near", + -3.254884719848633 + ], + [ + 9.6405029296875, + 0.9672622680664062, + "rest", + -4.229320526123047 + ], + [ + 9.617341041564941, + -1.344350814819336, + "ease", + -3.2516212463378906 + ], + [ + 9.168664932250977, + -0.16341018676757812, + "told", + -4.204803466796875 + ], + [ + 7.583606719970703, + -1.0838050842285156, + "farm", + -2.251821517944336 + ], + [ + 7.6207122802734375, + -1.8589229583740234, + "crop", + -1.8739910125732422 + ], + [ + 11.157360076904297, + -0.5270547866821289, + "wrong", + -7.250457763671875 + ], + [ + 7.4870500564575195, + -0.3173179626464844, + "dark", + -2.1629066467285156 + ], + [ + 9.040669441223145, + -1.3699016571044922, + "experiment", + -5.051937103271484 + ], + [ + 7.49202823638916, + -0.37940311431884766, + "found", + -2.005847930908203 + ], + [ + 8.207695007324219, + 0.09478187561035156, + "wheel", + -3.577228546142578 + ], + [ + 7.112095832824707, + -0.8223438262939453, + "land", + -2.3891773223876953 + ], + [ + 7.728734016418457, + -1.7707042694091797, + "atom", + -2.2389144897460938 + ], + [ + 9.279362678527832, + -1.119659423828125, + "general", + -8.668228149414062 + ], + [ + 7.456666946411133, + -1.7318344116210938, + "cotton", + -1.8832836151123047 + ], + [ + 8.2890625, + 0.8406314849853516, + "pair", + -4.428112030029297 + ], + [ + 8.388565063476562, + -0.9826793670654297, + "floor", + -3.7582321166992188 + ], + [ + 10.667255401611328, + -0.6516246795654297, + "nature", + -7.371145248413086 + ], + [ + 8.195266723632812, + -1.4605579376220703, + "power", + -0.8324642181396484 + ], + [ + 8.241079330444336, + 0.25090599060058594, + "death", + -3.7532081604003906 + ], + [ + 7.307436943054199, + -1.5928363800048828, + "glass", + -9.161514282226562 + ], + [ + 8.622943878173828, + -1.4177026748657227, + "skill", + -2.871753692626953 + ], + [ + 8.344510078430176, + 0.8974342346191406, + "lone", + -4.186016082763672 + ], + [ + 8.203729629516602, + 0.9685897827148438, + "pitch", + -3.6885643005371094 + ], + [ + 9.088505744934082, + -1.0184268951416016, + "a", + -5.230648040771484 + ], + [ + 10.287410736083984, + 0.3056831359863281, + "wait", + -7.466218948364258 + ], + [ + 11.198684692382812, + -0.8713874816894531, + "other", + -6.974910736083984 + ], + [ + 8.9678955078125, + -1.0634832382202148, + "wide", + -4.217897415161133 + ], + [ + 8.487163543701172, + -0.3246746063232422, + "child", + -2.877225875854492 + ], + [ + 7.162151336669922, + -0.8574180603027344, + "sand", + -2.349193572998047 + ], + [ + 8.52857780456543, + 0.932342529296875, + "run", + -4.517963409423828 + ], + [ + 8.696222305297852, + -1.8041582107543945, + "dictionary", + -6.082359313964844 + ], + [ + 7.488333702087402, + -1.3876466751098633, + "mine", + -1.9852409362792969 + ], + [ + 9.915006637573242, + -0.32323265075683594, + "expect", + -5.952198028564453 + ], + [ + 10.085674285888672, + 0.31562042236328125, + "again", + -4.859165191650391 + ], + [ + 8.933673858642578, + -0.3447084426879883, + "born", + -5.098970413208008 + ], + [ + 8.420075416564941, + 0.7935905456542969, + "throw", + -4.661285400390625 + ], + [ + 9.929466247558594, + -1.0345592498779297, + "written", + -7.425725936889648 + ], + [ + 9.544451713562012, + 0.5087871551513672, + "his", + -1.2985954284667969 + ], + [ + 8.321542739868164, + 0.6514739990234375, + "dead", + -3.4188976287841797 + ], + [ + 11.347782135009766, + -1.0068092346191406, + "must", + -8.038846969604492 + ], + [ + 8.719817161560059, + -0.3084220886230469, + "bell", + -5.174556732177734 + ], + [ + 9.985979080200195, + -1.3273944854736328, + "for", + -6.198692321777344 + ], + [ + 10.605762481689453, + -1.2570686340332031, + "short", + -6.857606887817383 + ], + [ + 11.087533950805664, + -0.32633495330810547, + "gave", + -7.538431167602539 + ], + [ + 10.466299057006836, + -0.1162557601928711, + "ever", + -6.891139984130859 + ], + [ + 11.016716003417969, + -0.7257976531982422, + "lost", + -0.5272502899169922 + ], + [ + 9.232606887817383, + 0.32483577728271484, + "who", + -4.428791046142578 + ], + [ + 7.901195526123047, + -0.9039516448974609, + "green", + -2.1756668090820312 + ], + [ + 9.625354766845703, + -1.535909652709961, + "degree", + -6.0194854736328125 + ], + [ + 8.933836936950684, + -2.039337158203125, + "locate", + -5.903408050537109 + ], + [ + 9.008529663085938, + 0.32697296142578125, + "right", + -5.10107421875 + ], + [ + 9.1718168258667, + -0.4009847640991211, + "speech", + -4.924285888671875 + ], + [ + 11.227407455444336, + -0.4570808410644531, + "difficult", + -7.586511611938477 + ], + [ + 8.683867454528809, + -2.0107593536376953, + "noun", + -7.035011291503906 + ], + [ + 7.425825119018555, + -0.6846828460693359, + "coat", + -2.241558074951172 + ], + [ + 10.855249404907227, + -0.6529922485351562, + "especially", + -7.2549896240234375 + ], + [ + 8.430549621582031, + -0.06706619262695312, + "train", + -2.8426647186279297 + ], + [ + 9.903097152709961, + -1.0517692565917969, + "or", + -6.543560028076172 + ], + [ + 11.377645492553711, + -0.3626880645751953, + "were", + -6.936336517333984 + ], + [ + 8.622772216796875, + 0.7835578918457031, + "place", + -3.8290138244628906 + ], + [ + 9.652311325073242, + -0.6272363662719727, + "meet", + -5.365592956542969 + ], + [ + 7.439994812011719, + 0.4171895980834961, + "steam", + -2.678203582763672 + ], + [ + 7.622471809387207, + -0.4093437194824219, + "sea", + -2.2831859588623047 + ], + [ + 9.531190872192383, + -1.3815221786499023, + "case", + -4.197841644287109 + ], + [ + 10.332783699035645, + -1.1293754577636719, + "problem", + -8.360343933105469 + ], + [ + 7.495968818664551, + -0.22672653198242188, + "truck", + -2.7059669494628906 + ], + [ + 9.641592979431152, + -2.1642045974731445, + "symbol", + -5.413917541503906 + ], + [ + 11.036380767822266, + -1.0272216796875, + "need", + -8.216562271118164 + ], + [ + 8.285832405090332, + 0.05747413635253906, + "mount", + -4.367256164550781 + ], + [ + 9.096134185791016, + -1.3056840896606445, + "log", + -7.861612319946289 + ], + [ + 10.232532501220703, + -0.9366292953491211, + "receive", + -6.228248596191406 + ], + [ + 10.027568817138672, + -1.7570009231567383, + "particular", + -6.295259475708008 + ], + [ + 8.12200927734375, + 0.6886997222900391, + "practice", + -3.5738983154296875 + ], + [ + 10.101877212524414, + -0.37372303009033203, + "enemy", + -5.967105865478516 + ], + [ + 8.854106903076172, + -0.10905647277832031, + "step", + -3.6609115600585938 + ], + [ + 7.070842742919922, + -1.051095962524414, + "shell", + -1.8678722381591797 + ], + [ + 8.136619567871094, + -0.47051239013671875, + "street", + -1.29150390625 + ], + [ + 10.498491287231445, + -1.3328733444213867, + "count", + -7.8002777099609375 + ], + [ + 8.786224365234375, + -0.7328758239746094, + "clothe", + -2.939737319946289 + ], + [ + 9.136659622192383, + -0.5869836807250977, + "slave", + -3.47265625 + ], + [ + 8.646186828613281, + -0.43239784240722656, + "camp", + -3.3029842376708984 + ], + [ + 8.58157730102539, + -0.39379310607910156, + "noon", + -3.905363082885742 + ], + [ + 8.571287155151367, + -0.6773996353149414, + "parent", + -3.4243736267089844 + ], + [ + 8.487804412841797, + -1.9839744567871094, + "suffix", + -1.6700439453125 + ], + [ + 10.211372375488281, + -0.23032379150390625, + "point", + -6.393207550048828 + ], + [ + 7.806435585021973, + -1.9929542541503906, + "cell", + -2.427999496459961 + ], + [ + 10.040525436401367, + 0.16179656982421875, + "together", + -6.643402099609375 + ], + [ + 7.850898742675781, + -1.0259227752685547, + "town", + -2.4300079345703125 + ], + [ + 8.913254737854004, + 0.7761383056640625, + "straight", + -4.071504592895508 + ], + [ + 9.015832901000977, + 0.7481708526611328, + "while", + -5.1012115478515625 + ], + [ + 7.197414398193359, + -1.3717155456542969, + "salt", + -1.8245849609375 + ], + [ + 9.178682327270508, + 0.9066495895385742, + "long", + -3.794696807861328 + ], + [ + 6.969470977783203, + -0.8678665161132812, + "fish", + -1.7958126068115234 + ], + [ + 9.872696876525879, + -0.13025474548339844, + "kept", + -4.844449996948242 + ], + [ + 11.116975784301758, + -0.116851806640625, + "good", + -7.624397277832031 + ], + [ + 9.433011054992676, + 0.5200595855712891, + "lead", + -5.429721832275391 + ], + [ + 9.198972702026367, + -1.118408203125, + "stream", + -3.5769386291503906 + ], + [ + 7.869829177856445, + 0.6466588973999023, + "leg", + -2.9935302734375 + ], + [ + 10.109264373779297, + -0.08135795593261719, + "table", + -6.477334976196289 + ], + [ + 8.027925491333008, + -2.1374988555908203, + "fat", + -2.064046859741211 + ], + [ + 10.47620677947998, + -0.38314247131347656, + "much", + -7.274169921875 + ], + [ + 9.809696197509766, + -0.7240409851074219, + "collect", + -5.536598205566406 + ], + [ + 8.678857803344727, + 0.08590507507324219, + "to", + -3.3431453704833984 + ], + [ + 9.202984809875488, + -1.7323780059814453, + "serve", + -4.887056350708008 + ], + [ + 10.751846313476562, + -0.8826971054077148, + "element", + -7.301883697509766 + ], + [ + 8.123395919799805, + -1.8428153991699219, + "instrument", + -2.8939666748046875 + ], + [ + 7.203239440917969, + -0.5821323394775391, + "rub", + -1.3963813781738281 + ], + [ + 7.604406356811523, + -0.6315155029296875, + "chick", + -2.6468467712402344 + ], + [ + 7.902185440063477, + -1.874009132385254, + "organ", + -2.5868492126464844 + ], + [ + 9.06179141998291, + -1.9944496154785156, + "mass", + -5.63371467590332 + ], + [ + 9.123880386352539, + 0.4550361633300781, + "spot", + -5.111186981201172 + ], + [ + 9.13984489440918, + -0.7347526550292969, + "board", + -4.261955261230469 + ], + [ + 10.802042007446289, + -1.1598291397094727, + "suggest", + -7.640766143798828 + ], + [ + 8.504446029663086, + -1.1709003448486328, + "small", + -3.2640380859375 + ], + [ + 7.797210693359375, + -0.2097320556640625, + "lady", + -2.495433807373047 + ], + [ + 7.513587951660156, + -1.7029094696044922, + "metal", + -1.8146839141845703 + ], + [ + 9.745294570922852, + -1.4287071228027344, + "govern", + -5.734018325805664 + ], + [ + 10.819705963134766, + -0.6651096343994141, + "kind", + -7.151927947998047 + ], + [ + 9.488946914672852, + 0.12014961242675781, + "path", + -1.1013050079345703 + ], + [ + 9.75282096862793, + -1.095372200012207, + "continue", + -5.3574981689453125 + ], + [ + 10.363008499145508, + -0.48404502868652344, + "real", + -7.176004409790039 + ], + [ + 7.287256240844727, + -0.8206787109375, + "hill", + -2.526346206665039 + ], + [ + 8.55687141418457, + -2.2750959396362305, + "produce", + -4.086112976074219 + ], + [ + 10.17635726928711, + -1.078826904296875, + "divide", + -8.420928955078125 + ], + [ + 8.779930114746094, + 1.1141738891601562, + "second", + -4.104198455810547 + ], + [ + 8.94996452331543, + -0.7212944030761719, + "country", + -5.322467803955078 + ], + [ + 8.417352676391602, + -1.525991439819336, + "language", + -2.771120071411133 + ], + [ + 7.244673728942871, + -0.12873172760009766, + "weight", + -1.574615478515625 + ], + [ + 7.289228439331055, + -0.7411766052246094, + "island", + -2.6906299591064453 + ], + [ + 10.64132022857666, + -1.5493059158325195, + "if", + -6.950634002685547 + ], + [ + 10.745885848999023, + -0.29459381103515625, + "love", + -7.173192977905273 + ], + [ + 9.854390144348145, + -1.9976043701171875, + "current", + -5.575197219848633 + ], + [ + 10.397014617919922, + -1.6375904083251953, + "agree", + -6.353199005126953 + ], + [ + 9.214599609375, + 0.8919906616210938, + "record", + -4.135852813720703 + ], + [ + 10.565893173217773, + -0.6728229522705078, + "most", + -6.702648162841797 + ], + [ + 10.438834190368652, + -1.0607843399047852, + "view", + -6.332784652709961 + ], + [ + 8.675554275512695, + 0.4777965545654297, + "minute", + -3.345745086669922 + ], + [ + 10.099231719970703, + -0.00199127197265625, + "moment", + -6.972249984741211 + ], + [ + 10.910646438598633, + -0.02664947509765625, + "enough", + -7.6613616943359375 + ], + [ + 7.870171546936035, + 0.1725177764892578, + "break", + -3.0094757080078125 + ], + [ + 10.560181617736816, + -0.47589111328125, + "little", + -7.645763397216797 + ], + [ + 11.059809684753418, + -1.3190498352050781, + "fall", + -0.5873661041259766 + ], + [ + 8.703895568847656, + 0.5401287078857422, + "front", + -5.880407333374023 + ], + [ + 8.125936508178711, + -0.02980327606201172, + "middle", + -0.6793441772460938 + ], + [ + 8.174629211425781, + -2.144618034362793, + "supply", + -1.73681640625 + ], + [ + 10.612102508544922, + -1.145904541015625, + "between", + -7.680097579956055 + ], + [ + 9.823995590209961, + -0.5029706954956055, + "sight", + -4.630161285400391 + ], + [ + 10.495540618896484, + -0.8245811462402344, + "some", + -7.049896240234375 + ], + [ + 9.412630081176758, + 0.06282424926757812, + "die", + -6.743677139282227 + ], + [ + 8.933223724365234, + -1.025869369506836, + "contain", + -3.9302291870117188 + ], + [ + 7.891936302185059, + 0.039513587951660156, + "girl", + -2.309316635131836 + ], + [ + 7.360945701599121, + -1.0474109649658203, + "water", + -2.359294891357422 + ], + [ + 10.093228340148926, + 0.18917083740234375, + "face", + -5.75489616394043 + ], + [ + 9.682830810546875, + -1.9149169921875, + "will", + -8.657611846923828 + ], + [ + 9.517921447753906, + 0.5680561065673828, + "cover", + -3.94879150390625 + ], + [ + 9.985960960388184, + -1.228302001953125, + "rich", + -7.009227752685547 + ], + [ + 9.983827590942383, + -1.5506591796875, + "either", + -6.5276336669921875 + ], + [ + 8.211465835571289, + -0.6166534423828125, + "dance", + -1.6230411529541016 + ], + [ + 9.095911026000977, + -1.7631521224975586, + "group", + -4.816959381103516 + ], + [ + 9.835083961486816, + 0.7383060455322266, + "few", + -5.085540771484375 + ], + [ + 8.51152515411377, + -1.427830696105957, + "master", + -3.3075809478759766 + ], + [ + 8.378485679626465, + -2.1000404357910156, + "sound", + -6.66911506652832 + ], + [ + 9.617252349853516, + -0.16365814208984375, + "hear", + -8.027200698852539 + ], + [ + 10.321809768676758, + -0.4277362823486328, + "slow", + -5.975191116333008 + ], + [ + 10.714323043823242, + 0.35587120056152344, + "afraid", + -7.586551666259766 + ], + [ + 7.907369613647461, + 0.7614669799804688, + "foot", + -3.0224552154541016 + ], + [ + 10.433650016784668, + 0.36209774017333984, + "catch", + -6.582338333129883 + ], + [ + 11.316778182983398, + -0.48270416259765625, + "those", + -7.378162384033203 + ], + [ + 7.671995162963867, + -0.47888851165771484, + "grand", + -2.9406967163085938 + ], + [ + 8.672286033630371, + -0.9496126174926758, + "teach", + -5.863687515258789 + ], + [ + 7.912814140319824, + 0.35114288330078125, + "top", + -9.017660140991211 + ], + [ + 9.165765762329102, + -1.5714521408081055, + "chart", + -6.329612731933594 + ], + [ + 9.11094856262207, + -1.404623031616211, + "work", + -6.71723747253418 + ], + [ + 9.719640731811523, + -0.6025371551513672, + "surprise", + -6.765857696533203 + ], + [ + 7.984842300415039, + 0.1566610336303711, + "sat", + -4.000431060791016 + ], + [ + 8.938560485839844, + -0.3287496566772461, + "pick", + -4.8713531494140625 + ], + [ + 8.895216941833496, + 0.2815427780151367, + "division", + -3.880960464477539 + ], + [ + 10.114588737487793, + -0.6898574829101562, + "spend", + -6.181632995605469 + ], + [ + 10.72757339477539, + -0.15771484375, + "bear", + -8.282672882080078 + ], + [ + 7.927890777587891, + -1.1014270782470703, + "shape", + -1.195138931274414 + ], + [ + 10.262609481811523, + -0.25183582305908203, + "see", + -6.837575912475586 + ], + [ + 8.498737335205078, + 0.13207244873046875, + "stretch", + -4.337978363037109 + ], + [ + 10.495330810546875, + 0.6402111053466797, + "big", + -8.043342590332031 + ], + [ + 7.531152725219727, + -1.92742919921875, + "fruit", + -1.6345787048339844 + ], + [ + 11.078706741333008, + -0.3789844512939453, + "clear", + -7.417970657348633 + ], + [ + 11.258946418762207, + -0.09697437286376953, + "question", + -7.081962585449219 + ], + [ + 9.575410842895508, + -1.0628118515014648, + "free", + -5.644039154052734 + ], + [ + 9.784116744995117, + 0.25453758239746094, + "my", + -6.838207244873047 + ], + [ + 7.265134811401367, + -1.7094573974609375, + "oil", + -4.18231201171875 + ], + [ + 7.880622863769531, + -0.772369384765625, + "house", + -2.366434097290039 + ], + [ + 7.597285270690918, + -1.1999053955078125, + "soil", + -1.9080944061279297 + ], + [ + 7.839899063110352, + -1.6983985900878906, + "iron", + -1.7415218353271484 + ], + [ + 9.240654945373535, + -2.3757381439208984, + "grow", + -5.70623779296875 + ], + [ + 7.8985395431518555, + -0.45880699157714844, + "corner", + -2.7022933959960938 + ], + [ + 9.01400375366211, + -2.294121742248535, + "product", + -6.54985237121582 + ], + [ + 9.261569023132324, + -2.21856689453125, + "solution", + -8.536857604980469 + ], + [ + 9.086444854736328, + -1.1178340911865234, + "room", + -5.481542587280273 + ], + [ + 8.349039077758789, + -0.31093883514404297, + "station", + -4.075033187866211 + ], + [ + 7.042975425720215, + -0.8180961608886719, + "river", + -2.101419448852539 + ], + [ + 8.82221794128418, + 0.7164363861083984, + "nine", + -4.279083251953125 + ], + [ + 9.245670318603516, + -0.9909992218017578, + "science", + -5.926113128662109 + ], + [ + 9.638736724853516, + -0.6749954223632812, + "far", + -6.809785842895508 + ], + [ + 8.008780479431152, + -0.6620426177978516, + "sleep", + -3.3085803985595703 + ], + [ + 8.38362979888916, + -1.297663688659668, + "century", + -3.140125274658203 + ], + [ + 9.933085441589355, + -0.7076225280761719, + "able", + -6.298130035400391 + ], + [ + 7.168739318847656, + -1.0098857879638672, + "brown", + -1.9135112762451172 + ], + [ + 10.699699401855469, + 0.22528648376464844, + "think", + -7.773277282714844 + ], + [ + 10.483412742614746, + -0.9568614959716797, + "imagine", + -8.212850570678711 + ], + [ + 7.833906173706055, + -0.3220939636230469, + "plane", + -3.1630420684814453 + ], + [ + 8.210418701171875, + 0.8361015319824219, + "sent", + -0.8266048431396484 + ], + [ + 6.819490432739258, + -0.8007488250732422, + "hunt", + -1.719278335571289 + ], + [ + 10.476640701293945, + 0.10581016540527344, + "quiet", + -8.134761810302734 + ], + [ + 7.999881744384766, + 0.6614170074462891, + "hand", + -3.429309844970703 + ], + [ + 8.40423583984375, + -0.478607177734375, + "square", + -3.4484710693359375 + ], + [ + 8.492681503295898, + -1.888692855834961, + "occur", + -4.885202407836914 + ], + [ + 7.404384613037109, + -1.8284826278686523, + "fig", + -3.0762557983398438 + ], + [ + 7.171548843383789, + -0.7477483749389648, + "hair", + -2.2905502319335938 + ], + [ + 9.782198905944824, + -0.9327774047851562, + "quotient", + -7.0789337158203125 + ], + [ + 11.082287788391113, + -0.07944488525390625, + "trouble", + -7.184257507324219 + ], + [ + 10.929115295410156, + -0.7890472412109375, + "might", + -7.5719757080078125 + ], + [ + 8.606180191040039, + -0.6850605010986328, + "learn", + -3.002727508544922 + ], + [ + 8.147295951843262, + 0.5015926361083984, + "left", + -3.9713973999023438 + ], + [ + 9.04050064086914, + -2.202239990234375, + "market", + -5.012790679931641 + ], + [ + 8.872386932373047, + 1.1449050903320312, + "final", + -4.125270843505859 + ], + [ + 7.8602800369262695, + -1.447153091430664, + "engine", + -2.4469871520996094 + ], + [ + 7.358867645263672, + -1.764883041381836, + "eat", + -1.476644515991211 + ], + [ + 8.895085334777832, + -1.7021865844726562, + "process", + -4.003360748291016 + ], + [ + 8.39578914642334, + 0.24529647827148438, + "friend", + -1.2306861877441406 + ], + [ + 11.110538482666016, + -1.2167205810546875, + "equal", + -8.186088562011719 + ], + [ + 10.135372161865234, + -0.8833980560302734, + "can", + -6.744237899780273 + ], + [ + 8.698028564453125, + 0.9316825866699219, + "match", + -4.148204803466797 + ], + [ + 8.836429595947266, + 0.7788429260253906, + "bottom", + -4.466312408447266 + ], + [ + 11.099969863891602, + -0.1879405975341797, + "hard", + -7.650529861450195 + ], + [ + 9.321138381958008, + 1.2580432891845703, + "cross", + -4.491294860839844 + ], + [ + 9.639942169189453, + -0.9923372268676758, + "read", + -6.099143981933594 + ], + [ + 10.377788543701172, + -0.1427326202392578, + "key", + -6.230197906494141 + ], + [ + 8.704994201660156, + -1.7518157958984375, + "consonant", + -6.656862258911133 + ], + [ + 7.801006317138672, + -0.5200710296630859, + "village", + -3.226612091064453 + ], + [ + 10.005359649658203, + 0.8560390472412109, + "up", + -6.426822662353516 + ], + [ + 9.299352645874023, + -2.3005895614624023, + "which", + -4.8292999267578125 + ], + [ + 9.945527076721191, + 0.29288387298583984, + "soon", + -4.192377090454102 + ], + [ + 8.74548625946045, + 0.33274269104003906, + "morning", + -3.826580047607422 + ], + [ + 9.457895278930664, + 0.49502086639404297, + "last", + -5.318733215332031 + ], + [ + 10.717411041259766, + -0.8755025863647461, + "even", + -7.4935455322265625 + ], + [ + 7.550937652587891, + -0.7902345657348633, + "shoe", + -8.876346588134766 + ], + [ + 8.62115478515625, + 1.0277957916259766, + "win", + -4.144828796386719 + ], + [ + 7.863665580749512, + -1.7517814636230469, + "tube", + -1.6202125549316406 + ], + [ + 7.97612190246582, + -0.8412322998046875, + "bright", + -2.956707000732422 + ], + [ + 8.329849243164062, + -1.2256889343261719, + "song", + -6.54052734375 + ], + [ + 8.351530075073242, + 0.6271114349365234, + "field", + -4.356536865234375 + ], + [ + 9.54726505279541, + -2.2778186798095703, + "effect", + -6.187808990478516 + ], + [ + 10.976537704467773, + 0.03689765930175781, + "lot", + -7.398105621337891 + ], + [ + 10.337334632873535, + -1.3922004699707031, + "excite", + -6.093294143676758 + ], + [ + 10.439445495605469, + -0.6506004333496094, + "so", + -6.923641204833984 + ], + [ + 10.844486236572266, + 0.18193626403808594, + "sure", + -7.715330123901367 + ], + [ + 8.721134185791016, + -2.032611846923828, + "region", + -2.4382057189941406 + ], + [ + 8.343133926391602, + -0.3351259231567383, + "office", + -5.0361785888671875 + ], + [ + 10.691744804382324, + -0.4163322448730469, + "both", + -6.529838562011719 + ], + [ + 7.260385513305664, + -1.177316665649414, + "dry", + -1.6701698303222656 + ], + [ + 8.391688346862793, + -0.7828998565673828, + "add", + -4.0165863037109375 + ], + [ + 8.965877532958984, + -1.709507942199707, + "type", + -1.9511222839355469 + ], + [ + 8.19111442565918, + -2.204071044921875, + "inch", + -3.4783897399902344 + ], + [ + 7.913370132446289, + -1.6485004425048828, + "electric", + -0.9990577697753906 + ], + [ + 7.684410095214844, + 0.2896127700805664, + "length", + -3.6876583099365234 + ], + [ + 7.678139686584473, + -0.009931564331054688, + "ship", + -3.691009521484375 + ], + [ + 8.787239074707031, + -0.015536308288574219, + "life", + -5.067731857299805 + ], + [ + 8.54845905303955, + -0.5322189331054688, + "trade", + -2.6521244049072266 + ], + [ + 10.168787002563477, + -0.8130226135253906, + "solve", + -8.300003051757812 + ], + [ + 9.681930541992188, + -1.8118209838867188, + "plan", + -4.2532196044921875 + ], + [ + 8.331022262573242, + -1.7998228073120117, + "design", + -2.920543670654297 + ], + [ + 9.299009323120117, + -1.369978904724121, + "fraction", + -5.435192108154297 + ], + [ + 9.319856643676758, + -0.6155786514282227, + "deep", + -4.616168975830078 + ], + [ + 7.866672515869141, + -0.759185791015625, + "cent", + -5.431282043457031 + ], + [ + 8.72700023651123, + -1.701375961303711, + "word", + -6.800708770751953 + ], + [ + 7.1071319580078125, + -1.6338424682617188, + "gas", + -2.0270423889160156 + ], + [ + 8.930885314941406, + -2.2451095581054688, + "magnet", + -1.9245243072509766 + ], + [ + 9.090251922607422, + -0.39264678955078125, + "cloud", + -4.708929061889648 + ], + [ + 8.137852668762207, + 1.115682601928711, + "brother", + -2.6910934448242188 + ], + [ + 7.305164337158203, + -1.3625621795654297, + "insect", + -2.1222362518310547 + ], + [ + 7.084165573120117, + -0.8540630340576172, + "snow", + -2.29876708984375 + ], + [ + 9.775636672973633, + -0.021364212036132812, + "leave", + -1.0631675720214844 + ], + [ + 11.353084564208984, + -0.9628667831420898, + "correct", + -8.000253677368164 + ], + [ + 9.759336471557617, + 0.5476531982421875, + "dream", + -8.093257904052734 + ], + [ + 9.356287002563477, + 0.7728424072265625, + "head", + -4.922657012939453 + ], + [ + 8.808540344238281, + -0.6841487884521484, + "door", + -3.4377288818359375 + ], + [ + 7.599915504455566, + -0.9341678619384766, + "moon", + -2.6378936767578125 + ], + [ + 10.563369750976562, + -1.5518150329589844, + "depend", + -5.712308883666992 + ], + [ + 9.480112075805664, + 0.47827625274658203, + "sit", + -4.46095085144043 + ], + [ + 10.1025390625, + -0.212188720703125, + "he", + -5.665681838989258 + ], + [ + 9.310375213623047, + -1.4097900390625, + "held", + -4.969005584716797 + ], + [ + 10.05282974243164, + -0.2538909912109375, + "get", + -5.832080841064453 + ], + [ + 10.852553367614746, + -1.4392461776733398, + "modern", + -8.549518585205078 + ], + [ + 8.102584838867188, + -0.27973175048828125, + "chair", + -3.7628936767578125 + ], + [ + 7.699697494506836, + 0.17453575134277344, + "seed", + -3.0458526611328125 + ], + [ + 10.875446319580078, + -1.5297985076904297, + "claim", + -5.535430908203125 + ], + [ + 8.714405059814453, + -0.8549537658691406, + "visit", + -4.025903701782227 + ], + [ + 10.408727645874023, + -0.755645751953125, + "hope", + -6.667148590087891 + ], + [ + 9.263021469116211, + -0.7617912292480469, + "in", + -5.398681640625 + ], + [ + 9.061752319335938, + 0.076324462890625, + "sentence", + -3.4692459106445312 + ], + [ + 10.25174331665039, + -1.4498043060302734, + "cut", + -6.74267578125 + ], + [ + 8.640352249145508, + 0.8113470077514648, + "start", + -4.101293563842773 + ], + [ + 9.385581016540527, + -0.13243865966796875, + "send", + -5.461513519287109 + ], + [ + 7.576723098754883, + -1.739638328552246, + "steel", + -1.8338432312011719 + ], + [ + 11.16357421875, + -0.14521026611328125, + "better", + -7.505317687988281 + ], + [ + 8.92176628112793, + -0.1935291290283203, + "thousand", + -4.748767852783203 + ], + [ + 7.941860198974609, + -1.3506441116333008, + "rock", + -0.9484977722167969 + ], + [ + 8.533201217651367, + -0.4759349822998047, + "hour", + -5.112495422363281 + ], + [ + 8.386079788208008, + -0.7962493896484375, + "light", + -4.586294174194336 + ], + [ + 8.966995239257812, + 0.9144821166992188, + "score", + -5.469371795654297 + ], + [ + 10.509401321411133, + 0.09610366821289062, + "won't", + -7.320213317871094 + ], + [ + 7.843727111816406, + 0.8865718841552734, + "bat", + -3.5400123596191406 + ], + [ + 8.96402359008789, + 0.5577812194824219, + "fight", + -3.0865745544433594 + ], + [ + 10.833044052124023, + -1.0438385009765625, + "cause", + -7.1952972412109375 + ], + [ + 10.577264785766602, + -1.1485271453857422, + "pose", + -7.8992156982421875 + ], + [ + 10.00887680053711, + 0.5510120391845703, + "least", + -4.90313720703125 + ], + [ + 10.384449005126953, + -1.496504783630371, + "consider", + -7.831310272216797 + ], + [ + 8.991353034973145, + 1.0179424285888672, + "round", + -4.062465667724609 + ], + [ + 10.418274879455566, + -1.7318954467773438, + "notice", + -5.196321487426758 + ], + [ + 11.423042297363281, + -0.9541816711425781, + "proper", + -6.278926849365234 + ], + [ + 8.663097381591797, + -1.2070283889770508, + "doctor", + -3.292722702026367 + ], + [ + 10.833677291870117, + -0.9029197692871094, + "perhaps", + -7.730670928955078 + ], + [ + 9.53502082824707, + -0.35948657989501953, + "thank", + -6.159873962402344 + ], + [ + 7.338356971740723, + -0.8543062210083008, + "grass", + -2.334369659423828 + ], + [ + 9.874786376953125, + -1.601266860961914, + "choose", + -5.555202484130859 + ], + [ + 7.404414176940918, + -1.6587181091308594, + "corn", + -1.5042572021484375 + ], + [ + 9.575763702392578, + 1.2070941925048828, + "behind", + -4.611507415771484 + ], + [ + 10.520232200622559, + -0.5148029327392578, + "own", + -7.455322265625 + ], + [ + 9.084188461303711, + 1.409226417541504, + "jump", + -5.414314270019531 + ], + [ + 8.314706802368164, + 0.30698204040527344, + "stood", + -3.5847301483154297 + ], + [ + 8.184662818908691, + -0.8948917388916016, + "music", + -3.5408973693847656 + ], + [ + 8.787952423095703, + 0.6120615005493164, + "before", + -4.664300918579102 + ], + [ + 9.862781524658203, + -0.3862762451171875, + "silent", + -5.323215484619141 + ], + [ + 9.977130889892578, + -0.8066577911376953, + "only", + -5.950065612792969 + ], + [ + 8.958393096923828, + -0.93035888671875, + "fell", + -1.3447303771972656 + ], + [ + 9.255010604858398, + -0.04082298278808594, + "by", + -5.282999038696289 + ], + [ + 9.192758560180664, + -0.8222618103027344, + "fill", + -5.524379730224609 + ], + [ + 8.90007209777832, + -1.5841951370239258, + "carry", + -4.594884872436523 + ], + [ + 10.80865478515625, + 0.060588836669921875, + "remember", + -7.2264404296875 + ], + [ + 8.843515396118164, + 0.6408853530883789, + "men", + -4.400381088256836 + ], + [ + 10.936755180358887, + -0.2315521240234375, + "well", + -8.164297103881836 + ], + [ + 9.063928604125977, + -0.08184337615966797, + "dollar", + -4.683986663818359 + ], + [ + 8.519445419311523, + -1.4493846893310547, + "book", + -5.585479736328125 + ], + [ + 8.77540111541748, + -1.861297607421875, + "decimal", + -6.328556060791016 + ], + [ + 10.608173370361328, + 0.6091556549072266, + "came", + -7.657260894775391 + ], + [ + 7.11159610748291, + -1.7039375305175781, + "cook", + -1.4680747985839844 + ], + [ + 9.929675102233887, + 0.9566020965576172, + "close", + -4.500801086425781 + ], + [ + 9.392984390258789, + -0.3690662384033203, + "where", + -4.478967666625977 + ], + [ + 9.34660530090332, + -1.8804922103881836, + "also", + -4.741748809814453 + ], + [ + 9.042420387268066, + 0.23779678344726562, + "charge", + -3.6447830200195312 + ], + [ + 9.158921241760254, + -2.115571975708008, + "tool", + -6.064085006713867 + ], + [ + 8.444854736328125, + -1.8353214263916016, + "verb", + -6.489152908325195 + ], + [ + 8.243492126464844, + -1.364877700805664, + "high", + -2.851408004760742 + ], + [ + 10.155448913574219, + -0.9414920806884766, + "repeat", + -5.969577789306641 + ], + [ + 8.22105598449707, + -1.2784357070922852, + "poem", + -5.40960693359375 + ], + [ + 10.715930938720703, + -0.8763389587402344, + "like", + -7.290260314941406 + ], + [ + 10.843742370605469, + 0.3056964874267578, + "just", + -7.957672119140625 + ], + [ + 11.280832290649414, + -0.3253440856933594, + "wonder", + -7.804298400878906 + ], + [ + 9.855314254760742, + 0.18529033660888672, + "keep", + -5.1071624755859375 + ], + [ + 9.374176979064941, + -0.6381006240844727, + "letter", + -4.821708679199219 + ], + [ + 9.566593170166016, + 0.8836917877197266, + "night", + -4.435352325439453 + ], + [ + 8.789992332458496, + 1.1632003784179688, + "late", + -4.020547866821289 + ], + [ + 8.728007316589355, + 1.3587589263916016, + "drive", + -0.7056884765625 + ], + [ + 7.991842269897461, + 0.079193115234375, + "climb", + -3.0230674743652344 + ], + [ + 10.414073944091797, + -1.8299312591552734, + "deal", + -5.987232208251953 + ], + [ + 7.98842716217041, + 0.7715644836425781, + "finger", + -3.3824119567871094 + ], + [ + 10.247451782226562, + 0.5708169937133789, + "roll", + -5.87403678894043 + ], + [ + 7.462527275085449, + -0.9781131744384766, + "weather", + -1.7276191711425781 + ], + [ + 7.594348907470703, + -1.5581245422363281, + "food", + -1.3637466430664062 + ], + [ + 8.271196365356445, + -0.7559995651245117, + "bought", + -3.8259811401367188 + ], + [ + 9.05303955078125, + 0.9271135330200195, + "took", + -3.9968624114990234 + ], + [ + 11.012201309204102, + -0.4364738464355469, + "past", + -7.17340087890625 + ], + [ + 9.675520896911621, + 0.8599920272827148, + "back", + -5.0718536376953125 + ], + [ + 7.557765960693359, + -0.43225860595703125, + "coast", + -2.582498550415039 + ], + [ + 7.934568405151367, + -0.2280263900756836, + "center", + -3.5809097290039062 + ], + [ + 10.127302169799805, + 0.1601114273071289, + "danger", + -5.331487655639648 + ], + [ + 11.332474708557129, + -0.7880191802978516, + "differ", + -7.274898529052734 + ], + [ + 7.007246017456055, + -1.4408683776855469, + "meat", + -1.5075531005859375 + ], + [ + 9.284480094909668, + 0.23317432403564453, + "wing", + -4.597166061401367 + ], + [ + 8.8560791015625, + 0.25047874450683594, + "crowd", + -4.342529296875 + ], + [ + 10.424993515014648, + 0.5428409576416016, + "let", + -7.635217666625977 + ], + [ + 7.918783187866211, + -0.09459304809570312, + "woman", + -3.2115726470947266 + ], + [ + 9.654605865478516, + -1.7598762512207031, + "offer", + -5.732994079589844 + ], + [ + 8.861220359802246, + -1.0324506759643555, + "print", + -5.928215026855469 + ], + [ + 10.204484939575195, + 0.7236909866333008, + "eye", + -4.557300567626953 + ], + [ + 6.992948532104492, + -0.8254165649414062, + "tiny", + -1.9327011108398438 + ], + [ + 9.499813079833984, + -0.19005298614501953, + "post", + -6.082788467407227 + ], + [ + 10.505691528320312, + 0.26645851135253906, + "knew", + -8.122467041015625 + ], + [ + 10.066075325012207, + -2.028360366821289, + "similar", + -5.497772216796875 + ], + [ + 10.590904235839844, + -0.0849761962890625, + "know", + -7.097354888916016 + ], + [ + 7.733543395996094, + -0.6451988220214844, + "shop", + -2.5094966888427734 + ], + [ + 8.605171203613281, + 0.8815364837646484, + "team", + -4.890323638916016 + ], + [ + 7.711299896240234, + -1.2963695526123047, + "plant", + -1.9267044067382812 + ] + ], + "symbolSize": 8.318880958061403, + "type": "scatter" + } + ], + "title": { + "text": "UMAP projection of embedding" + }, + "tooltip": { + "formatter": "GET_THIRD_VALUE", + "trigger": "item" + }, + "visualMap": { + "calculable": true, + "dimension": 3, + "inRange": { + "color": [ + "#440154", + "#482777", + "#3E4989", + "#31688E", + "#26828E", + "#1F9E89", + "#35B779", + "#6CCE59", + "#B4DE2C", + "#FDE725" + ] + }, + "max": -0.5272502899169922, + "min": -9.161514282226562, + "right": 10, + "top": "center" + }, + "xAxis": [ + { + "type": "value" + } + ], + "yAxis": [ + { + "type": "value" + } + ] + }, + "error": null, + "input_metadata": [ + { + "dataframes": { + "df": { + "columns": [ + "embedding", + "word" + ] + } + }, + "other": {}, + "relations": [] + } + ], + "meta": { + "inputs": { + "bundle": { + "name": "bundle", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "View vectors", + "outputs": {}, + "params": { + "label_column": { + "default": "", + "name": "label_column", + "type": { + "type": "" + } + }, + "metric": { + "default": "euclidean", + "name": "metric", + "type": { + "enum": [ + "l1", + "cityblock", + "taxicab", + "manhattan", + "euclidean", + "l2", + "sqeuclidean", + "canberra", + "minkowski", + "chebyshev", + "linf", + "cosine", + "correlation", + "hellinger", + "hamming" + ] + } + }, + "min_dist": { + "default": 0.1, + "name": "min_dist", + "type": { + "type": "" + } + }, + "n_neighbors": { + "default": 15.0, + "name": "n_neighbors", + "type": { + "type": "" + } + }, + "table_name": { + "default": "nodes", + "name": "table_name", + "type": { + "type": "" + } + }, + "vector_column": { + "default": "", + "name": "vector_column", + "type": { + "type": "" + } + } + }, + "type": "visualization" + }, + "params": { + "label_column": "word", + "metric": "cosine", + "min_dist": "0.01", + "n_neighbors": "150", + "table_name": "df", + "vector_column": "embedding" + }, + "status": "done", + "title": "View vectors" + }, + "dragHandle": ".bg-primary", + "height": 604.0, + "id": "View vectors 2", + "position": { + "x": 499.8620912314839, + "y": 640.9734211343721 + }, + "type": "visualization", + "width": 644.0 + }, + { + "data": { + "display": null, + "error": null, + "input_metadata": [], + "meta": { + "inputs": {}, + "name": "Word2vec for the top 1000 words", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": {}, + "position": { + "x": 191.0, + "y": 448.0 + }, + "type": "basic" + }, + "params": {}, + "status": "done", + "title": "Word2vec for the top 1000 words" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Word2vec for the top 1000 words 1", + "position": { + "x": -698.9690287957301, + "y": 468.24776963415917 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + {} + ], + "meta": { + "inputs": { + "df": { + "name": "df", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Take first N", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "n": { + "default": 10.0, + "name": "n", + "type": { + "type": "" + } + } + }, + "position": { + "x": 561.0, + "y": 171.0 + }, + "type": "basic" + }, + "params": { + "n": "50" + }, + "status": "done", + "title": "Take first N" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Take first N 1", + "position": { + "x": 30.0, + "y": 135.0 + }, + "type": "basic", + "width": 200.0 + }, + { + "data": { + "__execution_delay": 0.0, + "collapsed": null, + "display": null, + "error": null, + "input_metadata": [ + {} + ], + "meta": { + "inputs": { + "df": { + "name": "df", + "position": "left", + "type": { + "type": "" + } + } + }, + "name": "Sample N", + "outputs": { + "output": { + "name": "output", + "position": "right", + "type": { + "type": "None" + } + } + }, + "params": { + "n": { + "default": 10.0, + "name": "n", + "type": { + "type": "" + } + } + }, + "position": { + "x": 527.0, + "y": 353.0 + }, + "type": "basic" + }, + "params": { + "n": "501" + }, + "status": "done", + "title": "Sample N" + }, + "dragHandle": ".bg-primary", + "height": 200.0, + "id": "Sample N 1", + "position": { + "x": -46.91306859898353, + "y": 751.6557410556607 + }, + "type": "basic", + "width": 200.0 + } + ] +} diff --git a/examples/fake_data.py b/examples/fake_data.py new file mode 100644 index 0000000000000000000000000000000000000000..85bf8112ee1b6a4cdf9f9f7d6ea0594d353d5144 --- /dev/null +++ b/examples/fake_data.py @@ -0,0 +1,16 @@ +from lynxkite.core.ops import op +from faker import Faker +import pandas as pd + +faker = Faker() + + +@op("LynxKite Graph Analytics", "Fake data") +def fake(*, n=10): + df = pd.DataFrame( + { + "name": [faker.name() for _ in range(n)], + "address": [faker.address() for _ in range(n)], + } + ) + return df diff --git a/examples/requirements.txt b/examples/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..a07e975f8a0c963ead4ac69c33086266463ca91a --- /dev/null +++ b/examples/requirements.txt @@ -0,0 +1 @@ +Faker diff --git a/examples/sql b/examples/sql.lynxkite.json similarity index 100% rename from examples/sql rename to examples/sql.lynxkite.json 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/examples/word2vec.py b/examples/word2vec.py new file mode 100644 index 0000000000000000000000000000000000000000..b12799d6e1204c67535ed64811152e809baf1186 --- /dev/null +++ b/examples/word2vec.py @@ -0,0 +1,26 @@ +from lynxkite.core.ops import op +import staticvectors +import pandas as pd + +ENV = "LynxKite Graph Analytics" + + +@op(ENV, "Word2vec for the top 1000 words", slow=True) +def word2vec_1000(): + model = staticvectors.StaticVectors("neuml/word2vec-quantized") + df = pd.read_csv( + "https://gist.githubusercontent.com/deekayen/4148741/raw/98d35708fa344717d8eee15d11987de6c8e26d7d/1-1000.txt", + names=["word"], + ) + df["embedding"] = model.embeddings(df.word.tolist()).tolist() + return df + + +@op(ENV, "Take first N") +def first_n(df: pd.DataFrame, *, n=10): + return df.head(n) + + +@op(ENV, "Sample N") +def sample_n(df: pd.DataFrame, *, n=10): + return df.sample(n) diff --git a/lynxkite-app/src/lynxkite_app/crdt.py b/lynxkite-app/src/lynxkite_app/crdt.py index d86096ecb584b8d6a402d41ef1597a953963fc1f..9b8e3a4b654a8005f3eb8aa7cf867d9bc30a6330 100644 --- a/lynxkite-app/src/lynxkite_app/crdt.py +++ b/lynxkite-app/src/lynxkite_app/crdt.py @@ -26,11 +26,11 @@ def ws_exception_handler(exception, log): return True -class WebsocketServer(pycrdt_websocket.WebsocketServer): +class WorkspaceWebsocketServer(pycrdt_websocket.WebsocketServer): async def init_room(self, name: str) -> pycrdt_websocket.YRoom: """Initialize a room for the workspace with the given name. - The workspace is loaded from "crdt_data" if it exists there, or from "data", or a new workspace is created. + The workspace is loaded from ".crdt" if it exists there, or from a JSON file, or a new workspace is created. """ crdt_path = pathlib.Path(".crdt") path = crdt_path / f"{name}.crdt" @@ -40,9 +40,7 @@ class WebsocketServer(pycrdt_websocket.WebsocketServer): ydoc["workspace"] = ws = pycrdt.Map() # Replay updates from the store. try: - for update, timestamp in [ - (item[0], item[-1]) async for item in ystore.read() - ]: + for update, timestamp in [(item[0], item[-1]) async for item in ystore.read()]: ydoc.apply_update(update) except pycrdt_websocket.ystore.YDocNotFound: pass @@ -84,14 +82,49 @@ class WebsocketServer(pycrdt_websocket.WebsocketServer): return room +class CodeWebsocketServer(WorkspaceWebsocketServer): + async def init_room(self, name: str) -> pycrdt_websocket.YRoom: + """Initialize a room for a text document with the given name.""" + crdt_path = pathlib.Path(".crdt") + path = crdt_path / f"{name}.crdt" + assert path.is_relative_to(crdt_path) + ystore = pycrdt_websocket.ystore.FileYStore(path) + ydoc = pycrdt.Doc() + ydoc["text"] = text = pycrdt.Text() + # Replay updates from the store. + try: + for update, timestamp in [(item[0], item[-1]) async for item in ystore.read()]: + ydoc.apply_update(update) + except pycrdt_websocket.ystore.YDocNotFound: + pass + if len(text) == 0: + if os.path.exists(name): + with open(name) as f: + text += f.read() + room = pycrdt_websocket.YRoom( + ystore=ystore, ydoc=ydoc, exception_handler=ws_exception_handler + ) + room.text = text + + def on_change(changes): + asyncio.create_task(code_changed(name, changes, text)) + + text.observe(on_change) + return room + + 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 + for p in list(node.data.params): + if p.startswith("_"): + del node.data.params[p] node.position.x = 0 node.position.y = 0 if node.model_extra: @@ -168,9 +201,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 = {} @@ -208,9 +244,7 @@ async def workspace_changed(name: str, changes: pycrdt.MapEvent, ws_crdt: pycrdt await execute(name, ws_crdt, ws_pyd) -async def execute( - name: str, ws_crdt: pycrdt.Map, ws_pyd: workspace.Workspace, delay: int = 0 -): +async def execute(name: str, ws_crdt: pycrdt.Map, ws_pyd: workspace.Workspace, delay: int = 0): """Execute the workspace and update the CRDT object with the results. Args: @@ -230,6 +264,7 @@ async def execute( assert path.is_relative_to(cwd), "Provided workspace path is invalid" # Save user changes before executing, in case the execution fails. workspace.save(ws_pyd, path) + ops.load_user_scripts(name) ws_pyd._crdt = ws_crdt with ws_crdt.doc.transaction(): for nc, np in zip(ws_crdt["nodes"], ws_pyd.nodes): @@ -243,14 +278,21 @@ async def execute( print(f"Finished running {name} in {ws_pyd.env}.") +async def code_changed(name: str, changes: pycrdt.TextEvent, text: pycrdt.Text): + # TODO: Make this more fancy? + with open(name, "w") as f: + f.write(str(text).strip() + "\n") + + @contextlib.asynccontextmanager async def lifespan(app): - global websocket_server - websocket_server = WebsocketServer( - auto_clean_rooms=False, - ) - async with websocket_server: - yield + global ws_websocket_server + global code_websocket_server + ws_websocket_server = WorkspaceWebsocketServer(auto_clean_rooms=False) + code_websocket_server = CodeWebsocketServer(auto_clean_rooms=False) + async with ws_websocket_server: + async with code_websocket_server: + yield print("closing websocket server") @@ -261,5 +303,12 @@ def sanitize_path(path): @router.websocket("/ws/crdt/{room_name}") async def crdt_websocket(websocket: fastapi.WebSocket, room_name: str): room_name = sanitize_path(room_name) - server = pycrdt_websocket.ASGIServer(websocket_server) + server = pycrdt_websocket.ASGIServer(ws_websocket_server) + await server({"path": room_name}, websocket._receive, websocket._send) + + +@router.websocket("/ws/code/crdt/{room_name}") +async def code_crdt_websocket(websocket: fastapi.WebSocket, room_name: str): + room_name = sanitize_path(room_name) + server = pycrdt_websocket.ASGIServer(code_websocket_server) await server({"path": room_name}, websocket._receive, websocket._send) diff --git a/lynxkite-app/src/lynxkite_app/main.py b/lynxkite-app/src/lynxkite_app/main.py index 6f5368ef3f88c2ac13195ca53ee57c48eda85c50..cb41dadbd491599250e74dc7763e37b251025873 100644 --- a/lynxkite-app/src/lynxkite_app/main.py +++ b/lynxkite-app/src/lynxkite_app/main.py @@ -26,6 +26,7 @@ def detect_plugins(): lynxkite_plugins = detect_plugins() +ops.save_catalogs("plugins loaded") app = fastapi.FastAPI(lifespan=crdt.lifespan) app.include_router(crdt.router) @@ -33,11 +34,9 @@ app.add_middleware(GZipMiddleware) @app.get("/api/catalog") -def get_catalog(): - return { - k: {op.name: op.model_dump() for op in v.values()} - for k, v in ops.CATALOGS.items() - } +def get_catalog(workspace: str): + ops.load_user_scripts(workspace) + return {k: {op.name: op.model_dump() for op in v.values()} for k, v in ops.CATALOGS.items()} class SaveRequest(workspace.BaseConfig): @@ -85,6 +84,15 @@ class DirectoryEntry(pydantic.BaseModel): type: str +def _get_path_type(path: pathlib.Path) -> str: + if path.is_dir(): + return "directory" + elif path.suffixes[-2:] == [".lynxkite", ".json"]: + return "workspace" + else: + return "file" + + @app.get("/api/dir/list") def list_dir(path: str): path = data_path / path @@ -93,7 +101,7 @@ def list_dir(path: str): [ DirectoryEntry( name=str(p.relative_to(data_path)), - type="directory" if p.is_dir() else "workspace", + type=_get_path_type(p), ) for p in path.iterdir() if not p.name.startswith(".") diff --git a/lynxkite-app/tests/test_main.py b/lynxkite-app/tests/test_main.py index c9d15c8b7752b8d443f822727a2c40d056b24551..74ebecad95c7a35fd027994237555dc3cbf20e18 100644 --- a/lynxkite-app/tests/test_main.py +++ b/lynxkite-app/tests/test_main.py @@ -22,7 +22,7 @@ def test_detect_plugins_with_plugins(): def test_get_catalog(): - response = client.get("/api/catalog") + response = client.get("/api/catalog?workspace=test") assert response.status_code == 200 @@ -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"}, @@ -58,15 +59,22 @@ def test_save_and_load(): def test_list_dir(): test_dir = pathlib.Path() / str(uuid.uuid4()) test_dir.mkdir(parents=True, exist_ok=True) - test_file = test_dir / "test_file.txt" - test_file.touch() + dir = test_dir / "test_dir" + dir.mkdir(exist_ok=True) + file = test_dir / "test_file.txt" + file.touch() + ws = test_dir / "test_workspace.lynxkite.json" + ws.touch() response = client.get(f"/api/dir/list?path={str(test_dir)}") assert response.status_code == 200 - assert len(response.json()) == 1 - assert response.json()[0]["name"] == f"{test_dir}/test_file.txt" - assert response.json()[0]["type"] == "workspace" - test_file.unlink() - test_dir.rmdir() + assert response.json() == [ + {"name": f"{test_dir}/test_dir", "type": "directory"}, + {"name": f"{test_dir}/test_file.txt", "type": "file"}, + {"name": f"{test_dir}/test_workspace.lynxkite.json", "type": "workspace"}, + ] + file.unlink() + ws.unlink() + dir.rmdir() def test_make_dir(): diff --git a/lynxkite-app/web/eslint.config.js b/lynxkite-app/web/eslint.config.js index f6acaea802c9332a8c48507c09ac0ed023c0b67f..f2e6b5305244cf13b4f487b4f0fdc0713a42a41d 100644 --- a/lynxkite-app/web/eslint.config.js +++ b/lynxkite-app/web/eslint.config.js @@ -19,10 +19,7 @@ export default tseslint.config( }, rules: { ...reactHooks.configs.recommended.rules, - "react-refresh/only-export-components": [ - "warn", - { allowConstantExport: true }, - ], + "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], }, }, ); diff --git a/lynxkite-app/web/index.html b/lynxkite-app/web/index.html index 27509497671372558a63c1aeb5d1af4fabd00c5c..4035409471ca0fa4aba169f71669c1e13b96be2c 100644 --- a/lynxkite-app/web/index.html +++ b/lynxkite-app/web/index.html @@ -4,7 +4,6 @@ - LynxKite 2025
diff --git a/lynxkite-app/web/package-lock.json b/lynxkite-app/web/package-lock.json index f3586f64dceb4f8f03276655eed7a92a2c06a76b..5006fe472db89f74e6fec51e755ffccdb7628d30 100644 --- a/lynxkite-app/web/package-lock.json +++ b/lynxkite-app/web/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@esbuild/linux-x64": "^0.25.0", "@iconify-json/tabler": "^1.2.10", + "@monaco-editor/react": "^4.7.0", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0", "@swc/core": "^1.10.1", @@ -28,6 +29,7 @@ "react-router-dom": "^7.0.2", "swr": "^2.2.5", "unplugin-icons": "^0.21.0", + "y-monaco": "^0.1.6", "y-websocket": "^2.0.4", "yjs": "^13.6.20" }, @@ -1105,6 +1107,29 @@ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "license": "MIT" }, + "node_modules/@monaco-editor/loader": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.5.0.tgz", + "integrity": "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5436,6 +5461,13 @@ "ufo": "^1.5.4" } }, + "node_modules/monaco-editor": { + "version": "0.52.2", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "license": "MIT", + "peer": true + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6437,6 +6469,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7360,6 +7398,23 @@ "yjs": "^13.0.0" } }, + "node_modules/y-monaco": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/y-monaco/-/y-monaco-0.1.6.tgz", + "integrity": "sha512-sYRywMmcylt+Nupl+11AvizD2am06ST8lkVbUXuaEmrtV6Tf+TD4rsEm6u9YGGowYue+Vfg1IJ97SUP2J+PVXg==", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.43" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + }, + "peerDependencies": { + "monaco-editor": ">=0.20.0", + "yjs": "^13.3.1" + } + }, "node_modules/y-protocols": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", diff --git a/lynxkite-app/web/package.json b/lynxkite-app/web/package.json index 6bc7a50736c271492d99e77c598d0f3ddc52228b..a770941db057165d43815ee83bb8404e84fc3c1c 100644 --- a/lynxkite-app/web/package.json +++ b/lynxkite-app/web/package.json @@ -13,6 +13,7 @@ "dependencies": { "@esbuild/linux-x64": "^0.25.0", "@iconify-json/tabler": "^1.2.10", + "@monaco-editor/react": "^4.7.0", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0", "@swc/core": "^1.10.1", @@ -31,6 +32,7 @@ "react-router-dom": "^7.0.2", "swr": "^2.2.5", "unplugin-icons": "^0.21.0", + "y-monaco": "^0.1.6", "y-websocket": "^2.0.4", "yjs": "^13.6.20" }, diff --git a/lynxkite-app/web/playwright.config.ts b/lynxkite-app/web/playwright.config.ts index b0d3e4c31adf4a28eaed19a16dd856d3364f4e5b..7b439d07a6a720684fc4ebe2ff2453c93a7b61c9 100644 --- a/lynxkite-app/web/playwright.config.ts +++ b/lynxkite-app/web/playwright.config.ts @@ -7,6 +7,7 @@ export default defineConfig({ /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, retries: process.env.CI ? 1 : 0, + maxFailures: 5, workers: 1, reporter: process.env.CI ? [["github"], ["html"]] : "html", use: { @@ -24,7 +25,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/Code.tsx b/lynxkite-app/web/src/Code.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a10256184e5796269693721152613be4e60c2c51 --- /dev/null +++ b/lynxkite-app/web/src/Code.tsx @@ -0,0 +1,101 @@ +// Full-page editor for code files. + +import Editor, { type Monaco } from "@monaco-editor/react"; +import type { editor } from "monaco-editor"; +import { useEffect, useRef } from "react"; +import { useParams } from "react-router"; +import { WebsocketProvider } from "y-websocket"; +import * as Y from "yjs"; +// @ts-ignore +import Atom from "~icons/tabler/atom.jsx"; +// @ts-ignore +import Backspace from "~icons/tabler/backspace.jsx"; +// @ts-ignore +import Close from "~icons/tabler/x.jsx"; +import favicon from "./assets/favicon.ico"; +import theme from "./code-theme.ts"; + +export default function Code() { + const { path } = useParams(); + const parentDir = path!.split("/").slice(0, -1).join("/"); + const yDocRef = useRef(); + const wsProviderRef = useRef(); + const monacoBindingRef = useRef(); + const yMonacoRef = useRef(); + const editorRef = useRef(); + useEffect(() => { + const loadMonaco = async () => { + // y-monaco is gigantic. The other Monaco packages are small. + yMonacoRef.current = await import("y-monaco"); + initCRDT(); + }; + loadMonaco(); + }, []); + function beforeMount(monaco: Monaco) { + monaco.editor.defineTheme("lynxkite", theme); + } + function onMount(_editor: editor.IStandaloneCodeEditor) { + editorRef.current = _editor; + initCRDT(); + } + function initCRDT() { + if (!yMonacoRef.current || !editorRef.current) return; + if (yDocRef.current) return; + yDocRef.current = new Y.Doc(); + const text = yDocRef.current.getText("text"); + const proto = location.protocol === "https:" ? "wss:" : "ws:"; + wsProviderRef.current = new WebsocketProvider( + `${proto}//${location.host}/ws/code/crdt`, + path!, + yDocRef.current, + ); + monacoBindingRef.current = new yMonacoRef.current.MonacoBinding( + text, + editorRef.current.getModel()!, + new Set([editorRef.current]), + wsProviderRef.current.awareness, + ); + } + useEffect(() => { + return () => { + yDocRef.current?.destroy(); + wsProviderRef.current?.destroy(); + monacoBindingRef.current?.destroy(); + }; + }); + return ( +
+
+ + + +
{path}
+ +
+ +
+ ); +} diff --git a/lynxkite-app/web/src/Directory.tsx b/lynxkite-app/web/src/Directory.tsx index 7e1115319e26b9548b24de12162b62c7cd16e313..f6c005b4e9fb3be77486193e38ab2a385ea07fd0 100644 --- a/lynxkite-app/web/src/Directory.tsx +++ b/lynxkite-app/web/src/Directory.tsx @@ -15,9 +15,46 @@ import FolderPlus from "~icons/tabler/folder-plus"; // @ts-ignore import Home from "~icons/tabler/home"; // @ts-ignore +import LayoutGrid from "~icons/tabler/layout-grid"; +// @ts-ignore +import LayoutGridAdd from "~icons/tabler/layout-grid-add"; +// @ts-ignore import Trash from "~icons/tabler/trash"; import logo from "./assets/logo.png"; +function EntryCreator(props: { + label: string; + icon: JSX.Element; + onCreate: (name: string) => void; +}) { + const [isCreating, setIsCreating] = useState(false); + return ( + <> + {isCreating ? ( +
{ + e.preventDefault(); + props.onCreate((e.target as HTMLFormElement).entryName.value.trim()); + }} + > + setIsCreating(false)} + placeholder={`${props.label} name`} + /> +
+ ) : ( + + )} + + ); +} + const fetcher = (url: string) => fetch(url).then((res) => res.json()); export default function () { @@ -27,68 +64,51 @@ export default function () { dedupingInterval: 0, }); const navigate = useNavigate(); - const [isCreatingDir, setIsCreatingDir] = useState(false); - const [isCreatingWorkspace, setIsCreatingWorkspace] = useState(false); function link(item: DirectoryEntry) { if (item.type === "directory") { return `/dir/${item.name}`; } - return `/edit/${item.name}`; + if (item.type === "workspace") { + return `/edit/${item.name}`; + } + return `/code/${item.name}`; } function shortName(item: DirectoryEntry) { - return item.name.split("/").pop(); + return item.name + .split("/") + .pop() + ?.replace(/[.]lynxkite[.]json$/, ""); } - function newName(list: DirectoryEntry[], baseName = "Untitled") { - let i = 0; - while (true) { - const name = `${baseName}${i ? ` ${i}` : ""}`; - if (!list.find((item) => item.name === name)) { - return name; - } - i++; - } + function newWorkspaceIn(path: string, workspaceName: string) { + const pathSlash = path ? `${path}/` : ""; + navigate(`/edit/${pathSlash}${workspaceName}.lynxkite.json`, { replace: true }); } - - function newWorkspaceIn( - path: string, - list: DirectoryEntry[], - workspaceName?: string, - ) { + function newCodeFile(path: string, name: string) { const pathSlash = path ? `${path}/` : ""; - const name = workspaceName || newName(list); - navigate(`/edit/${pathSlash}${name}`, { replace: true }); + navigate(`/code/${pathSlash}${name}`, { replace: true }); } - - async function newFolderIn( - path: string, - list: DirectoryEntry[], - folderName?: string, - ) { - const name = folderName || newName(list, "New Folder"); + async function newFolderIn(path: string, folderName: string) { const pathSlash = path ? `${path}/` : ""; - const res = await fetch("/api/dir/mkdir", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ path: pathSlash + name }), + body: JSON.stringify({ path: pathSlash + folderName }), }); if (res.ok) { - navigate(`/dir/${pathSlash}${name}`); + navigate(`/dir/${pathSlash}${folderName}`); } else { alert("Failed to create folder."); } } async function deleteItem(item: DirectoryEntry) { - if (!window.confirm(`Are you sure you want to delete "${item.name}"?`)) - return; + if (!window.confirm(`Are you sure you want to delete "${item.name}"?`)) return; const pathSlash = path ? `${path}/` : ""; - const apiPath = - item.type === "directory" ? "/api/dir/delete" : "/api/delete"; + const apiPath = item.type === "directory" ? "/api/dir/delete" : "/api/delete"; await fetch(apiPath, { method: "POST", headers: { "Content-Type": "application/json" }, @@ -115,89 +135,66 @@ export default function () { {list.data && ( <>
-
- {isCreatingWorkspace && ( - // @ts-ignore -
{ - e.preventDefault(); - newWorkspaceIn( - path || "", - list.data, - ( - e.target as HTMLFormElement - ).workspaceName.value.trim(), - ); - }} - > - -
- )} - -
- -
- {isCreatingDir && ( - // @ts-ignore -
{ - e.preventDefault(); - newFolderIn( - path || "", - list.data, - (e.target as HTMLFormElement).folderName.value.trim(), - ); - }} - > - -
- )} - -
+ { + newWorkspaceIn(path || "", name); + }} + icon={} + label="New workspace" + /> + { + newCodeFile(path || "", name); + }} + icon={} + label="New code file" + /> + { + newFolderIn(path || "", name); + }} + icon={} + label="New folder" + />
- {path && ( + {path ? (
{" "} {path} + {path}
+ ) : ( + LynxKite 2000:MM )} - {list.data.map((item: DirectoryEntry) => ( -
- - {item.type === "directory" ? : } - {shortName(item)} - - -
- ))} + {list.data.map( + (item: DirectoryEntry) => + !shortName(item)?.startsWith("__") && ( +
+ + {item.type === "directory" ? ( + + ) : item.type === "workspace" ? ( + + ) : ( + + )} + {shortName(item)} + + +
+ ), + )} )} {" "} 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/code-theme.ts b/lynxkite-app/web/src/code-theme.ts new file mode 100644 index 0000000000000000000000000000000000000000..f87b908baae0b2004a8bf3e9f4b576a817865f5e --- /dev/null +++ b/lynxkite-app/web/src/code-theme.ts @@ -0,0 +1,38 @@ +// A simple theme using the LynxKite colors. + +import type { editor } from "monaco-editor/esm/vs/editor/editor.api"; + +const theme: editor.IStandaloneThemeData = { + base: "vs-dark", + inherit: true, + rules: [ + { + foreground: "ff8800", + token: "keyword", + }, + { + foreground: "0088ff", + fontStyle: "italic", + token: "comment", + }, + { + foreground: "39bcf3", + token: "string", + }, + { + foreground: "ffc600", + token: "", + }, + ], + colors: { + "editor.foreground": "#FFFFFF", + "editor.background": "#002a4c", + "editor.selectionBackground": "#0050a4", + "editor.lineHighlightBackground": "#1f4662", + "editorCursor.foreground": "#ffc600", + "editorWhitespace.foreground": "#7f7f7fb2", + "editorIndentGuide.background": "#3b5364", + "editorIndentGuide.activeBackground": "#ffc600", + }, +}; +export default theme; diff --git a/lynxkite-app/web/src/index.css b/lynxkite-app/web/src/index.css index 9da6e892bff1e43ddedd36c4ae92a1d426d1845c..dabd851362f7a4184409c8e7c5cd48951fbb93ba 100644 --- a/lynxkite-app/web/src/index.css +++ b/lynxkite-app/web/src/index.css @@ -102,15 +102,14 @@ body { --status-color-1: oklch(75% 0.2 55); --status-color-2: oklch(75% 0.2 55); --status-color-3: oklch(75% 0.2 55); - transition: --status-color-1 0.3s, --status-color-2 0.3s, --status-color-3 - 0.3s; + transition: --status-color-1 0.3s, --status-color-2 0.3s, --status-color-3 0.3s; } .lynxkite-node .title.active { --status-color-1: oklch(75% 0.2 55); --status-color-2: oklch(90% 0.2 55); --status-color-3: oklch(75% 0.1 55); - /* animation: active-node-gradient-animation 2s ease-in-out infinite; */ + animation: active-node-gradient-animation 2s ease-in-out infinite; } .lynxkite-node .title.planned { @@ -256,6 +255,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 { @@ -319,7 +326,14 @@ body { .actions { display: flex; justify-content: space-evenly; + align-items: center; + height: 50px; padding: 5px; + + form, + button { + flex: 1; + } } .actions a { @@ -527,3 +541,25 @@ body { .add-relationship-button:hover { background-color: #218838; } + +.yRemoteSelection { + background-color: rgb(250, 129, 0, 0.5); +} + +.yRemoteSelectionHead { + position: absolute; + border-left: #ff8800 solid 2px; + border-top: #ff8800 solid 2px; + border-bottom: #ff8800 solid 2px; + height: 100%; + box-sizing: border-box; +} + +.yRemoteSelectionHead::after { + position: absolute; + content: " "; + border: 3px solid #ff8800; + border-radius: 4px; + left: -4px; + top: -5px; +} diff --git a/lynxkite-app/web/src/main.tsx b/lynxkite-app/web/src/main.tsx index 9d9eb752e2d437853ec87ff4fe375ef898951971..af03ec06c6b5b70991c475082e183a52db2b3da6 100644 --- a/lynxkite-app/web/src/main.tsx +++ b/lynxkite-app/web/src/main.tsx @@ -3,6 +3,7 @@ import { createRoot } from "react-dom/client"; import "@xyflow/react/dist/style.css"; import "./index.css"; import { BrowserRouter, Route, Routes } from "react-router"; +import Code from "./Code.tsx"; import Directory from "./Directory.tsx"; import Workspace from "./workspace/Workspace.tsx"; @@ -14,6 +15,7 @@ createRoot(document.getElementById("root")!).render( } /> } /> } /> + } /> , diff --git a/lynxkite-app/web/src/workspace/NodeSearch.tsx b/lynxkite-app/web/src/workspace/NodeSearch.tsx index 967e22a5435f9de6ce144897fc8e1937d6a7cc78..b0d80114e6c03d2bc68f68392a2b8fb8f36cafc7 100644 --- a/lynxkite-app/web/src/workspace/NodeSearch.tsx +++ b/lynxkite-app/web/src/workspace/NodeSearch.tsx @@ -30,9 +30,7 @@ export default function (props: { boxes.sort((a, b) => a.item.name.localeCompare(b.item.name)); return boxes; }, [props.boxes]); - const hits: { item: OpsOp }[] = searchText - ? fuse.search(searchText) - : allOps; + const hits: { item: OpsOp }[] = searchText ? fuse.search(searchText) : allOps; const [selectedIndex, setSelectedIndex] = useState(0); useEffect(() => searchBox.current.focus()); function typed(text: string) { @@ -64,10 +62,7 @@ export default function (props: { } return ( -
+
{ @@ -69,11 +64,7 @@ function LynxKiteFlow() { setState(state); const doc = getYjsDoc(state); const proto = location.protocol === "https:" ? "wss:" : "ws:"; - const wsProvider = new WebsocketProvider( - `${proto}//${location.host}/ws/crdt`, - path!, - doc, - ); + const wsProvider = new WebsocketProvider(`${proto}//${location.host}/ws/crdt`, path!, doc); const onChange = (_update: any, origin: any, _doc: any, _tr: any) => { if (origin === wsProvider) { // An update from the CRDT. Apply it to the local state. @@ -165,7 +156,7 @@ function LynxKiteFlow() { const fetcher: Fetcher = (resource: string, init?: RequestInit) => fetch(resource, init).then((res) => res.json()); - const catalog = useSWR("/api/catalog", fetcher); + const catalog = useSWR(`/api/catalog?workspace=${path}`, fetcher); const [suppressSearchUntil, setSuppressSearchUntil] = useState(0); const [nodeSearchSettings, setNodeSearchSettings] = useState( undefined as @@ -190,11 +181,7 @@ function LynxKiteFlow() { useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { // Show the node search dialog on "/". - if ( - event.key === "/" && - !nodeSearchSettings && - !isTypingInFormElement() - ) { + if (event.key === "/" && !nodeSearchSettings && !isTypingInFormElement()) { event.preventDefault(); setNodeSearchSettings({ pos: { x: 100, y: 100 }, @@ -238,11 +225,7 @@ function LynxKiteFlow() { }, [catalog, state, nodeSearchSettings, suppressSearchUntil, closeNodeSearch], ); - function addNode( - node: Partial, - state: { workspace: Workspace }, - nodes: Node[], - ) { + function addNode(node: Partial, state: { workspace: Workspace }, nodes: Node[]) { const title = node.data?.title; let i = 1; node.id = `${title} ${i}`; @@ -260,9 +243,7 @@ function LynxKiteFlow() { data: { meta: meta, title: meta.name, - params: Object.fromEntries( - Object.values(meta.params).map((p) => [p.name, p.default]), - ), + params: Object.fromEntries(Object.values(meta.params).map((p) => [p.name, p.default])), }, }; return node; @@ -310,9 +291,7 @@ function LynxKiteFlow() { try { await axios.post("/api/upload", formData, { onUploadProgress: (progressEvent) => { - const percentCompleted = Math.round( - (100 * progressEvent.loaded) / progressEvent.total!, - ); + const percentCompleted = Math.round((100 * progressEvent.loaded) / progressEvent.total!); if (percentCompleted === 100) setMessage("Processing file..."); else setMessage(`Uploading ${percentCompleted}%`); }, @@ -345,7 +324,8 @@ function LynxKiteFlow() { -
{path}
+
{shortPath}
+ {shortPath}
-
+
1) { return ( - +
); } if (df.data.length) { @@ -60,9 +55,7 @@ export default function NodeWithGraphCreationView(props: any) { const display = props.data.display?.value; const tables = display?.dataframes || {}; const singleTable = tables && Object.keys(tables).length === 1; - const [relations, setRelations] = useState( - relationsToDict(display?.relations) || {}, - ); + const [relations, setRelations] = useState(relationsToDict(display?.relations) || {}); const singleRelation = relations && Object.keys(relations).length === 1; function setParam(name: string, newValue: any, opts: UpdateOptions) { reactFlow.updateNodeData(props.id, { @@ -211,9 +204,7 @@ export default function NodeWithGraphCreationView(props: any) { {tables[relation.source_table] && - tables[relation.df].columns.map((name: string) => ( - @@ -274,10 +265,7 @@ export default function NodeWithGraphCreationView(props: any) {
Relationships -
diff --git a/lynxkite-app/web/src/workspace/nodes/LynxKiteNode.tsx b/lynxkite-app/web/src/workspace/nodes/LynxKiteNode.tsx index 20758cc283135508919cd50d3e7734fa06730f1e..15e05e75b429adf7ffdeaf53780a02feed40332f 100644 --- a/lynxkite-app/web/src/workspace/nodes/LynxKiteNode.tsx +++ b/lynxkite-app/web/src/workspace/nodes/LynxKiteNode.tsx @@ -1,9 +1,4 @@ -import { - Handle, - NodeResizeControl, - type Position, - useReactFlow, -} from "@xyflow/react"; +import { Handle, NodeResizeControl, type Position, useReactFlow } from "@xyflow/react"; // @ts-ignore import ChevronDownRight from "~icons/tabler/chevron-down-right.jsx"; @@ -38,10 +33,8 @@ function getHandles(inputs: object, outputs: object) { } for (const e of handles) { e.offsetPercentage = (100 * (e.index + 1)) / (counts[e.position] + 1); - const simpleHorizontal = - counts.top === 0 && counts.bottom === 0 && handles.length <= 2; - const simpleVertical = - counts.left === 0 && counts.right === 0 && handles.length <= 2; + const simpleHorizontal = counts.top === 0 && counts.bottom === 0 && handles.length <= 2; + const simpleVertical = counts.left === 0 && counts.right === 0 && handles.length <= 2; e.showLabel = !simpleHorizontal && !simpleVertical; } return handles; @@ -71,10 +64,7 @@ export default function LynxKiteNode(props: LynxKiteNodeProps) { }} >
-
+
{data.title} {data.error && ⚠️} {expanded || } @@ -99,14 +89,11 @@ export default function LynxKiteNode(props: LynxKiteNodeProps) { type={handle.type} position={handle.position as Position} style={{ - [handleOffsetDirection[handle.position]]: - `${handle.offsetPercentage}% `, + [handleOffsetDirection[handle.position]]: `${handle.offsetPercentage}% `, }} > {handle.showLabel && ( - - {handle.name.replace(/_/g, " ")} - + {handle.name.replace(/_/g, " ")} )} ))} diff --git a/lynxkite-app/web/src/workspace/nodes/NodeGroupParameter.tsx b/lynxkite-app/web/src/workspace/nodes/NodeGroupParameter.tsx index 28564d40ead0e2644ff4af774ce0cd79d4ae05c0..89cbfb8e12373151c1bc6af52e090756f17664c7 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,14 +32,13 @@ interface NodeGroupParameterProps { export default function NodeGroupParameter({ meta, value, + data, setParam, deleteParam, }: NodeGroupParameterProps) { const selector = meta.selector; const groups = meta.groups; - const [selectedValue, setSelectedValue] = useState( - value || selector.default, - ); + const [selectedValue, setSelectedValue] = useState(value || selector.default); const handleSelectorChange = (value: any, opts?: { delay: number }) => { setSelectedValue(value); @@ -47,9 +47,7 @@ export default function NodeGroupParameter({ useEffect(() => { // Clean possible previous parameters first - Object.values(groups).flatMap((group) => - group.map((entry) => deleteParam(entry.name)), - ); + Object.values(groups).flatMap((group) => group.map((entry) => deleteParam(entry.name))); for (const param of groups[selectedValue]) { setParam(param.name, param.default); } @@ -60,6 +58,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..943360e0ea143717c339218a3203c8ad79955eda 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeParameter.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeParameter.tsx @@ -1,8 +1,186 @@ -const BOOLEAN = ""; +import { useRef } from "react"; +// @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, + inputRef, +}: { + value: string; + onChange: (value: string, options?: { delay: number }) => void; + inputRef?: React.Ref; +}) { + 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 })} + /> + ); +} + +type Bindings = { + [key: string]: { + df: string; + column: string; + }; +}; + +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 dfsRef = useRef({} as { [binding: string]: HTMLSelectElement | null }); + const columnsRef = useRef( + {} as { [binding: string]: HTMLSelectElement | HTMLInputElement | null }, + ); + 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) { + if (!input.dataframes) continue; + 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); + function getMap() { + const map: Bindings = {}; + for (const binding of bindings) { + const df = dfsRef.current[binding]?.value ?? ""; + const column = columnsRef.current[binding]?.value ?? ""; + if (df.length || column.length) { + map[binding] = { df, column }; + } + } + return map; + } return ( - {name.replace(/_/g, " ")} +
+ + {bindings.length > 0 ? ( + bindings.map((binding: string) => ( + + + + + + + )) + ) : ( + + + + )} + +
{binding} + + + + + {variant === "output" ? ( + { + columnsRef.current[binding] = el; + }} + value={v.map?.[binding]?.column} + onChange={(column, options) => { + const map = getMap(); + // At this point the has not been updated yet. We use the value from the event. + const df = dfsRef.current[binding]?.value ?? ""; + map[binding] ??= { df, column }; + map[binding].column = column; + onChange(JSON.stringify({ map }), options); + }} + /> + ) : ( + + )} +
no bindings
); } @@ -10,15 +188,11 @@ interface NodeParameterProps { name: string; value: any; meta: any; + data: any; onChange: (value: any, options?: { delay: number }) => void; } -export default function NodeParameter({ - name, - value, - meta, - onChange, -}: NodeParameterProps) { +export default function NodeParameter({ name, value, meta, data, onChange }: NodeParameterProps) { return ( // biome-ignore lint/a11y/noLabelWithoutControl: Most of the time there is a control. diff --git a/lynxkite-app/web/src/workspace/nodes/NodeWithImage.tsx b/lynxkite-app/web/src/workspace/nodes/NodeWithImage.tsx index d1755aac430a707df81ea8a14e8ec79cbdbc156a..1cd68215ed038ddf6d99deb2b827263d8b3444c7 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeWithImage.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeWithImage.tsx @@ -3,9 +3,7 @@ import NodeWithParams from "./NodeWithParams"; const NodeWithImage = (props: any) => { return ( - {props.data.display && ( - Node Display - )} + {props.data.display && Node Display} ); }; diff --git a/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx b/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx index ef568a41f0cca30dd88a097722d470b4d78d4e5c..17b4b366f03133912ba2c9fadb4fb5b3312b0d86 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeWithParams.tsx @@ -35,11 +35,8 @@ function NodeWithParams(props: any) { return ( - {props.collapsed && ( -
setCollapsed(!collapsed)} - > + {props.collapsed && params.length > 0 && ( +
setCollapsed(!collapsed)}>
)} @@ -49,23 +46,21 @@ function NodeWithParams(props: any) { setParam(name, value, opts || {}) } - deleteParam={(name: string, opts?: UpdateOptions) => - deleteParam(name, opts || {}) - } + deleteParam={(name: string, opts?: UpdateOptions) => deleteParam(name, opts || {})} /> ) : ( - setParam(name, value, opts || {}) - } + onChange={(value: any, opts?: UpdateOptions) => setParam(name, value, opts || {})} /> ), )} diff --git a/lynxkite-app/web/src/workspace/nodes/NodeWithTableView.tsx b/lynxkite-app/web/src/workspace/nodes/NodeWithTableView.tsx index 7b311db28220cc7b07e4545134b9ea20dd935302..490ed239d31484fcbefb718faedbb467f4ee00aa 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeWithTableView.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeWithTableView.tsx @@ -1,3 +1,4 @@ +import { useReactFlow } from "@xyflow/react"; import { useState } from "react"; import React from "react"; import Markdown from "react-markdown"; @@ -14,34 +15,41 @@ function toMD(v: any): string { return JSON.stringify(v); } +type OpenState = { [name: string]: boolean }; + export default function NodeWithTableView(props: any) { - const [open, setOpen] = useState({} as { [name: string]: boolean }); + const reactFlow = useReactFlow(); + const [open, setOpen] = useState((props.data?.params?._tables_open ?? {}) as OpenState); const display = props.data.display?.value; - const single = - display?.dataframes && Object.keys(display?.dataframes).length === 1; + const single = display?.dataframes && Object.keys(display?.dataframes).length === 1; const dfs = Object.entries(display?.dataframes || {}); dfs.sort(); + function setParam(name: string, newValue: any) { + reactFlow.updateNodeData(props.id, (prevData: any) => ({ + ...prevData, + params: { ...prevData.data.params, [name]: newValue }, + })); + } + function toggleTable(name: string) { + setOpen((prevOpen: OpenState) => { + const newOpen = { ...prevOpen, [name]: !prevOpen[name] }; + setParam("_tables_open", newOpen); + return newOpen; + }); + } return ( {display && [ dfs.map(([name, df]: [string, any]) => ( {!single && ( -
setOpen({ ...open, [name]: !open[name] })} - > +
toggleTable(name)}> {name}
)} {(single || open[name]) && (df.data.length > 1 ? ( - +
) : df.data.length ? (
{df.columns.map((c: string, i: number) => ( @@ -60,11 +68,7 @@ export default function NodeWithTableView(props: any) { )), Object.entries(display.others || {}).map(([name, o]) => ( <> -
setOpen({ ...open, [name]: !open[name] })} - > +
toggleTable(name)}> {name}
{open[name] &&
{(o as any).toString()}
} diff --git a/lynxkite-app/web/src/workspace/nodes/NodeWithVisualization.tsx b/lynxkite-app/web/src/workspace/nodes/NodeWithVisualization.tsx index 6c69792e5e0195f9e0501c74dab3f6f78744c9a5..ba9516b29bc2ceda74111d975346a75d3baf90ea 100644 --- a/lynxkite-app/web/src/workspace/nodes/NodeWithVisualization.tsx +++ b/lynxkite-app/web/src/workspace/nodes/NodeWithVisualization.tsx @@ -8,6 +8,10 @@ const NodeWithVisualization = (props: any) => { useEffect(() => { const opts = props.data?.display?.value; if (!opts || !chartsRef.current) return; + if (opts.tooltip?.formatter === "GET_THIRD_VALUE") { + // We can't pass a function from the backend, and can't get good tooltips otherwise. + opts.tooltip.formatter = (params: any) => params.value[2]; + } chartsInstanceRef.current = echarts.init(chartsRef.current, null, { renderer: "canvas", width: "auto", diff --git a/lynxkite-app/web/tests/directory.spec.ts b/lynxkite-app/web/tests/directory.spec.ts index 6177977bbfc7a698387fce18f9ae7dab3c4b7bc6..863633473ec181524761fd2dbce83fba6e938b08 100644 --- a/lynxkite-app/web/tests/directory.spec.ts +++ b/lynxkite-app/web/tests/directory.spec.ts @@ -14,13 +14,6 @@ test.describe("Directory operations", () => { splash = await Splash.open(page); }); - test("Create workspace with default name", async () => { - const workspace = await Workspace.empty(splash.page); - // Not checking for exact match, since there may be pre-existing "Untitled" workspaces - expect(workspace.name).toContain("Untitled"); - await workspace.close(); - }); - test("Create & delete workspace", async () => { const workspaceName = `TestWorkspace-${Date.now()}`; const workspace = await Workspace.empty(splash.page, workspaceName); @@ -40,11 +33,6 @@ test.describe("Directory operations", () => { await splash.deleteEntry(folderName); await expect(splash.getEntry(folderName)).not.toBeVisible(); }); - - test("Create folder with default name", async () => { - await splash.createFolder(); - await expect(splash.currentFolder()).toContainText("Untitled"); - }); }); test.describe diff --git a/lynxkite-app/web/tests/errors.spec.ts b/lynxkite-app/web/tests/errors.spec.ts index 3ba316ac034f5ea6e89e648cbd20d42bf08d6d14..9c725917df724be74f64fcee06495302867fec37 100644 --- a/lynxkite-app/web/tests/errors.spec.ts +++ b/lynxkite-app/web/tests/errors.spec.ts @@ -35,9 +35,7 @@ test("unknown operation", async () => { await graphBox.getByLabel("n", { exact: true }).fill("10"); await workspace.setEnv("LynxScribe"); const csvBox = workspace.getBox("NX › Scale-Free Graph 1"); - await expect(csvBox.locator(".error")).toHaveText( - 'Operation "NX › Scale-Free Graph" not found.', - ); + await expect(csvBox.locator(".error")).toHaveText('Operation "NX › Scale-Free Graph" not found.'); await workspace.setEnv("LynxKite Graph Analytics"); await expect(csvBox.locator(".error")).not.toBeVisible(); }); diff --git a/lynxkite-app/web/tests/graph_creation.spec.ts b/lynxkite-app/web/tests/graph_creation.spec.ts index ca562a54e9dea02b8a32ea3aed02e98e5b5aabfe..879b09bd98a67d84d29ff85c136766ab3cc50014 100644 --- a/lynxkite-app/web/tests/graph_creation.spec.ts +++ b/lynxkite-app/web/tests/graph_creation.spec.ts @@ -5,15 +5,9 @@ import { Splash, Workspace } from "./lynxkite"; let workspace: Workspace; test.beforeEach(async ({ browser }) => { - workspace = await Workspace.empty( - await browser.newPage(), - "graph_creation_spec_test", - ); + workspace = await Workspace.empty(await browser.newPage(), "graph_creation_spec_test"); await workspace.addBox("NX › Scale-Free Graph"); - await workspace - .getBox("NX › Scale-Free Graph 1") - .getByLabel("n", { exact: true }) - .fill("10"); + await workspace.getBox("NX › Scale-Free Graph 1").getByLabel("n", { exact: true }).fill("10"); await workspace.addBox("Create graph"); await workspace.connectBoxes("NX › Scale-Free Graph 1", "Create graph 1"); }); @@ -45,9 +39,7 @@ test("Tables are displayed in the Graph creation box", async () => { test("Adding and removing relationships", async () => { const graphBox = await workspace.getBox("Create graph 1"); - const addRelationshipButton = await graphBox.locator( - ".add-relationship-button", - ); + const addRelationshipButton = await graphBox.locator(".add-relationship-button"); await addRelationshipButton.click(); const formData: Record = { name: "relation_1", @@ -69,10 +61,9 @@ test("Adding and removing relationships", async () => { // check that the relationship has been saved in the backend await workspace.page.reload(); const graphBoxAfterReload = await workspace.getBox("Create graph 1"); - const relationHeader = await graphBoxAfterReload.locator( - ".graph-relations .df-head", - { hasText: "relation_1" }, - ); + const relationHeader = await graphBoxAfterReload.locator(".graph-relations .df-head", { + hasText: "relation_1", + }); await expect(relationHeader).toBeVisible(); await relationHeader.locator("button").click(); // Delete the relationship await expect(relationHeader).not.toBeVisible(); diff --git a/lynxkite-app/web/tests/import.spec.ts b/lynxkite-app/web/tests/import.spec.ts index e699728e5001fe3a06146d4a6ff447f42da0ac03..329b38614e4452bdfd37718f1589da98b333e620 100644 --- a/lynxkite-app/web/tests/import.spec.ts +++ b/lynxkite-app/web/tests/import.spec.ts @@ -7,10 +7,7 @@ import { Splash, Workspace } from "./lynxkite"; let workspace: Workspace; test.beforeEach(async ({ browser }) => { - workspace = await Workspace.empty( - await browser.newPage(), - "import_spec_test", - ); + workspace = await Workspace.empty(await browser.newPage(), "import_spec_test"); }); test.afterEach(async () => { @@ -22,11 +19,7 @@ test.afterEach(async () => { await splash.deleteEntry("import_spec_test"); }); -async function validateImport( - workspace: Workspace, - fileName: string, - fileFormat: string, -) { +async function validateImport(workspace: Workspace, fileName: string, fileFormat: string) { const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const filePath = join(__dirname, "data", fileName); diff --git a/lynxkite-app/web/tests/lynxkite.ts b/lynxkite-app/web/tests/lynxkite.ts index 04f8f4ae326ffa5e7ae11e3438ba0a58f21da612..20a2058df4f88f4e8ee5d280593da4e69854187d 100644 --- a/lynxkite-app/web/tests/lynxkite.ts +++ b/lynxkite-app/web/tests/lynxkite.ts @@ -18,7 +18,7 @@ export class Workspace { } // Starts with a brand new workspace. - static async empty(page: Page, workspaceName?: string): Promise { + static async empty(page: Page, workspaceName: string): Promise { const splash = await Splash.open(page); return await splash.createWorkspace(workspaceName); } @@ -63,10 +63,7 @@ export class Workspace { await this.page.locator(".ws-name").click(); await this.page.keyboard.press("/"); - await this.page - .locator(".node-search") - .getByText(boxName, { exact: true }) - .click(); + await this.page.locator(".node-search").getByText(boxName, { exact: true }).click(); await expect(this.getBoxes()).toHaveCount(allBoxes.length + 1); } @@ -107,9 +104,7 @@ export class Workspace { getBoxHandle(boxId: string, pos?: string) { if (pos) { - return this.page.locator( - `[data-id="${boxId}"] [data-handlepos="${pos}"]`, - ); + return this.page.locator(`[data-id="${boxId}"] [data-handlepos="${pos}"]`); } return this.page.getByTestId(boxId); } @@ -133,11 +128,9 @@ export class Workspace { } else if (offset) { // Without steps the movement is too fast and the box is not dragged. The more steps, // the better the movement is captured - await this.page.mouse.move( - boxCenterX + offset.offsetX, - boxCenterY + offset.offsetY, - { steps: 5 }, - ); + await this.page.mouse.move(boxCenterX + offset.offsetX, boxCenterY + offset.offsetY, { + steps: 5, + }); } await this.page.mouse.up(); } @@ -189,20 +182,12 @@ export class Splash { return this.page.locator(".entry").filter({ hasText: name }).first(); } - async createWorkspace(name?: string) { + async createWorkspace(name: string) { await this.page.getByRole("button", { name: "New workspace" }).click(); - await this.page.locator('input[name="workspaceName"]').click(); - let workspaceName: string; - if (name) { - workspaceName = name; - await this.page.locator('input[name="workspaceName"]').fill(name); - } else { - workspaceName = await this.page - .locator('input[name="workspaceName"]') - .inputValue(); - } - await this.page.locator('input[name="workspaceName"]').press("Enter"); - const ws = new Workspace(this.page, workspaceName); + const nameBox = this.page.locator('input[name="entryName"]'); + await nameBox.fill(name); + await nameBox.press("Enter"); + const ws = new Workspace(this.page, name); await ws.setEnv("LynxKite Graph Analytics"); return ws; } @@ -212,13 +197,11 @@ export class Splash { return new Workspace(this.page, name); } - async createFolder(folderName?: string) { + async createFolder(folderName: string) { await this.page.getByRole("button", { name: "New folder" }).click(); - await this.page.locator('input[name="folderName"]').click(); - if (folderName) { - await this.page.locator('input[name="folderName"]').fill(folderName); - } - await this.page.locator('input[name="folderName"]').press("Enter"); + const nameBox = this.page.locator('input[name="entryName"]'); + await nameBox.fill(folderName); + await nameBox.press("Enter"); } async deleteEntry(entryName: string) { diff --git a/lynxkite-app/web/tsconfig.json b/lynxkite-app/web/tsconfig.json index 1ffef600d959ec9e396d5a260bd3f5b927b2cef8..d32ff682003e0ff5d8a6e6bb3663d4c35a45b116 100644 --- a/lynxkite-app/web/tsconfig.json +++ b/lynxkite-app/web/tsconfig.json @@ -1,7 +1,4 @@ { "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/lynxkite-app/web/vite.config.ts b/lynxkite-app/web/vite.config.ts index 9e94a9ecbd68f8e142bc84890c20b3f53710f4ab..69c5df557bd8fb98f97a7e9392770b98a2b92854 100644 --- a/lynxkite-app/web/vite.config.ts +++ b/lynxkite-app/web/vite.config.ts @@ -5,7 +5,7 @@ import { defineConfig } from "vite"; // https://vite.dev/config/ export default defineConfig({ build: { - chunkSizeWarningLimit: 2048, + chunkSizeWarningLimit: 3000, }, esbuild: { supported: { diff --git a/lynxkite-bio/src/lynxkite_bio/__init__.py b/lynxkite-bio/src/lynxkite_bio/__init__.py index e8aa15d383fdd933ae9529bce24711b3e82eac14..12c6fb19244c6974e867e29d4a2a47e08838514e 100644 --- a/lynxkite-bio/src/lynxkite_bio/__init__.py +++ b/lynxkite-bio/src/lynxkite_bio/__init__.py @@ -1,68 +1,4 @@ """An expansion for `lynxkite-graph-analytics` that provides algorithms for biological applications.""" -from lynxkite_graph_analytics import Bundle, RelationDefinition -from lynxkite.core import ops -import joblib -import numpy as np -import pandas as pd -import rdkit.Chem -import rdkit.Chem.rdFingerprintGenerator -import rdkit.Chem.Fingerprints.ClusterMols -import scipy - -mem = joblib.Memory("joblib-cache") -ENV = "LynxKite Graph Analytics" -op = ops.op_registration(ENV) - - -@op("Parse SMILES") -def parse_smiles(bundle: Bundle, *, table="df", smiles_column="SMILES", save_as="mols"): - """Parse SMILES strings into RDKit molecules.""" - df = bundle.dfs[table] - mols = [rdkit.Chem.MolFromSmiles(smiles) for smiles in df[smiles_column].dropna()] - mols = [mol for mol in mols if mol is not None] - bundle = bundle.copy() - bundle.dfs[table] = df.assign(**{save_as: mols}) - return bundle - - -def _get_similarity_matrix(mols): - mfpgen = rdkit.Chem.rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048) - fps = [(0, mfpgen.GetFingerprint(mol)) for mol in mols] - similarity_matrix = rdkit.Chem.Fingerprints.ClusterMols.GetDistanceMatrix( - fps, metric=rdkit.Chem.DataStructs.TanimotoSimilarity, isSimilarity=1 - ) - return scipy.spatial.distance.squareform(similarity_matrix) - - -@op("Graph from molecule similarity") -def graph_from_similarity( - bundle: Bundle, *, table="df", mols_column="mols", average_degree=10 -): - """Creates edges for pairs of molecules that are the most similar.""" - df = bundle.dfs[table] - mols = df[mols_column] - similarity_matrix = _get_similarity_matrix(mols) - i_idx, j_idx = np.triu_indices_from(similarity_matrix, k=1) - sim_values = similarity_matrix[i_idx, j_idx] - N = int(average_degree * len(mols)) - top_n_idx = np.argsort(sim_values)[-N:] - top_n_pairs = [(i_idx[k], j_idx[k], sim_values[k]) for k in top_n_idx] - edges = pd.DataFrame(top_n_pairs, columns=["source", "target", "similarity"]) - nodes = df.copy() - nodes.index.name = "id" - bundle = Bundle( - dfs={"edges": edges, "nodes": nodes}, - relations=[ - RelationDefinition( - df="edges", - source_column="source", - target_column="target", - source_table="nodes", - target_table="nodes", - source_key="id", - target_key="id", - ) - ], - ) - return bundle +from . import nims # noqa (imported to trigger registration) +from . import rdkit # noqa (imported to trigger registration) diff --git a/lynxkite-bio/src/lynxkite_bio/nims.py b/lynxkite-bio/src/lynxkite_bio/nims.py new file mode 100644 index 0000000000000000000000000000000000000000..6bda4aeb7fec0b1002c8ed380fa0fc516d926930 --- /dev/null +++ b/lynxkite-bio/src/lynxkite_bio/nims.py @@ -0,0 +1,133 @@ +"""Wrappers for BioNeMo NIMs.""" + +from enum import Enum +from lynxkite_graph_analytics import Bundle +from lynxkite.core import ops +import joblib +import os + +NIM_URLS = os.environ.get("NIM_URLS", "http://localhost:8000").split(",") + +mem = joblib.Memory(".joblib-cache") +ENV = "LynxKite Graph Analytics" +op = ops.op_registration(ENV) + + +class MSASearchTypes(Enum): + ALPHAFOLD2 = "ALPHAFOLD2" + ESM2 = "ESM2" + + +class AlignmentFormats(Enum): + FASTA = "fasta" + A3M = "a3m" + STOCKHOLM = "stockholm" + CLUSTAL = "clustal" + PDB = "pdb" + PIR = "pir" + MSF = "msf" + TSV = "tsv" + + +@op("MSA-search") +@mem.cache +def msa_search( + bundle: Bundle, + *, + protein_table: str, + protein_column: str, + e_value: float = 0.0001, + iterations: int = 1, + search_type: MSASearchTypes = MSASearchTypes.ALPHAFOLD2, + output_alignment_formats: list[AlignmentFormats] = [ + AlignmentFormats.FASTA, + AlignmentFormats.A3M, + ], + databases: str = '["Uniref30_2302", "colabfold_envdb_202108", "PDB70_220313"]', +): + bundle = bundle.copy() + return bundle + + +@op("Query OpenFold2") +@mem.cache +def query_openfold2( + bundle: Bundle, + *, + protein_table: str, + protein_column: str, + alignment_table: str, + alignment_column: str, + use_templates: bool = False, + relaxed_prediction: bool = False, + databases: str = '["Uniref30_2302", "colabfold_envdb_202108", "PDB70_220313"]', +): + bundle = bundle.copy() + return bundle + + +@op("View molecules", view="visualization") +def view_molecules( + bundle: Bundle, + *, + molecule_table: str, + molecule_column: str, + color="spectrum", +): + return { + "series": [ + { + "type": "pie", + "radius": ["40%", "70%"], + "itemStyle": { + "borderRadius": 10, + "borderColor": "#fff", + "borderWidth": 2, + }, + "data": [ + {"value": 2, "name": "Hydrogen"}, + {"value": 1, "name": "Sulfur"}, + {"value": 4, "name": "Oxygen"}, + ], + } + ] + } + + +@op("Known drug") +def known_drug(*, drug_name: str): + return Bundle() + + +@op("Query GenMol") +@mem.cache +def query_genmol( + bundle: Bundle, + *, + molecule_table: str, + molecule_column: str, + num_molecules: int = 5, + temperature: float = 1.0, + noise: float = 0.2, + step_size: int = 4, + scoring: str = "QED", +): + bundle = bundle.copy() + return bundle + + +@op("Query DiffDock") +@mem.cache +def query_diffdock( + proteins: Bundle, + ligands: Bundle, + *, + protein_table: str, + protein_column: str, + ligand_table: str, + ligand_column: str, + num_poses=10, + time_divisions=20, + num_steps=18, +): + return proteins diff --git a/lynxkite-bio/src/lynxkite_bio/rdkit.py b/lynxkite-bio/src/lynxkite_bio/rdkit.py new file mode 100644 index 0000000000000000000000000000000000000000..ac6cf2d7aa635e7be2a8f2a282a48ad6015f6755 --- /dev/null +++ b/lynxkite-bio/src/lynxkite_bio/rdkit.py @@ -0,0 +1,66 @@ +"""An expansion for `lynxkite-graph-analytics` that provides algorithms for biological applications.""" + +from lynxkite_graph_analytics import Bundle, RelationDefinition +from lynxkite.core import ops +import joblib +import numpy as np +import pandas as pd +import rdkit.Chem +import rdkit.Chem.rdFingerprintGenerator +import rdkit.Chem.Fingerprints.ClusterMols +import scipy + +mem = joblib.Memory(".joblib-cache") +ENV = "LynxKite Graph Analytics" +op = ops.op_registration(ENV) + + +@op("Parse SMILES") +def parse_smiles(bundle: Bundle, *, table="df", smiles_column="SMILES", save_as="mols"): + """Parse SMILES strings into RDKit molecules.""" + df = bundle.dfs[table] + mols = [rdkit.Chem.MolFromSmiles(smiles) for smiles in df[smiles_column].dropna()] + mols = [mol for mol in mols if mol is not None] + bundle = bundle.copy() + bundle.dfs[table] = df.assign(**{save_as: mols}) + return bundle + + +def _get_similarity_matrix(mols): + mfpgen = rdkit.Chem.rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048) + fps = [(0, mfpgen.GetFingerprint(mol)) for mol in mols] + similarity_matrix = rdkit.Chem.Fingerprints.ClusterMols.GetDistanceMatrix( + fps, metric=rdkit.Chem.DataStructs.TanimotoSimilarity, isSimilarity=1 + ) + return scipy.spatial.distance.squareform(similarity_matrix) + + +@op("Graph from molecule similarity") +def graph_from_similarity(bundle: Bundle, *, table="df", mols_column="mols", average_degree=10): + """Creates edges for pairs of molecules that are the most similar.""" + df = bundle.dfs[table] + mols = df[mols_column] + similarity_matrix = _get_similarity_matrix(mols) + i_idx, j_idx = np.triu_indices_from(similarity_matrix, k=1) + sim_values = similarity_matrix[i_idx, j_idx] + N = int(average_degree * len(mols)) + top_n_idx = np.argsort(sim_values)[-N:] + top_n_pairs = [(i_idx[k], j_idx[k], sim_values[k]) for k in top_n_idx] + edges = pd.DataFrame(top_n_pairs, columns=["source", "target", "similarity"]) + nodes = df.copy() + nodes.index.name = "id" + bundle = Bundle( + dfs={"edges": edges, "nodes": nodes}, + relations=[ + RelationDefinition( + df="edges", + source_column="source", + target_column="target", + source_table="nodes", + target_table="nodes", + source_key="id", + target_key="id", + ) + ], + ) + return bundle diff --git a/lynxkite-core/src/lynxkite/core/executors/one_by_one.py b/lynxkite-core/src/lynxkite/core/executors/one_by_one.py index a4079a120a2d0b762a0b3eb7fd25866f3d0e71ce..e6a450ef6a5ea9968ec4d750c999e44777a7f6b0 100644 --- a/lynxkite-core/src/lynxkite/core/executors/one_by_one.py +++ b/lynxkite-core/src/lynxkite/core/executors/one_by_one.py @@ -167,9 +167,9 @@ async def execute(ws: workspace.Workspace, catalog, cache=None): op = catalog[t.data.title] i = op.inputs[edge.targetHandle] if i.position in "top or bottom": - batch_inputs.setdefault( - (edge.target, edge.targetHandle), [] - ).extend(results) + batch_inputs.setdefault((edge.target, edge.targetHandle), []).extend( + results + ) else: tasks.setdefault(edge.target, []).extend(results) node.publish_result(result) diff --git a/lynxkite-core/src/lynxkite/core/ops.py b/lynxkite-core/src/lynxkite/core/ops.py index 023406649eb056bc83f8091bedb43551917fefd2..61a5fafb49e220e539e1082e68f2d4204b9e327f 100644 --- a/lynxkite-core/src/lynxkite/core/ops.py +++ b/lynxkite-core/src/lynxkite/core/ops.py @@ -1,9 +1,15 @@ """API for implementing LynxKite operations.""" from __future__ import annotations +import asyncio import enum import functools +import importlib import inspect +import pathlib +import subprocess +import traceback +import joblib import types import pydantic import typing @@ -13,8 +19,11 @@ from typing_extensions import Annotated if typing.TYPE_CHECKING: from . import workspace -CATALOGS = {} +Catalog = dict[str, "Op"] +Catalogs = dict[str, Catalog] +CATALOGS: Catalogs = {} EXECUTORS = {} +mem = joblib.Memory(".joblib-cache") typeof = type # We have some arguments called "type". @@ -61,7 +70,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 +115,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 +151,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 +170,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,12 +186,25 @@ 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): +def op(env: str, name: str, *, view="basic", outputs=None, params=None, slow=False): """Decorator for defining an operation.""" def decorator(func): sig = inspect.signature(func) + if slow: + func = mem.cache(func) + func = _global_slow(func) # Positional arguments are inputs. inputs = { name: Input(name=name, type=param.annotation) @@ -193,9 +220,7 @@ def op(env: str, name: str, *, view="basic", outputs=None, params=None): if outputs: _outputs = {name: Output(name=name, type=None) for name in outputs} else: - _outputs = ( - {"output": Output(name="output", type=None)} if view == "basic" else {} - ) + _outputs = {"output": Output(name="output", type=None)} if view == "basic" else {} op = Op( func=func, name=name, @@ -249,12 +274,10 @@ def register_passive_op(env: str, name: str, inputs=[], outputs=["output"], para name=name, params={p.name: p for p in params}, inputs=dict( - (i, Input(name=i, type=None)) if isinstance(i, str) else (i.name, i) - for i in inputs + (i, Input(name=i, type=None)) if isinstance(i, str) else (i.name, i) for i in inputs ), outputs=dict( - (o, Output(name=o, type=None)) if isinstance(o, str) else (o.name, o) - for o in outputs + (o, Output(name=o, type=None)) if isinstance(o, str) else (o.name, o) for o in outputs ), ) CATALOGS.setdefault(env, {}) @@ -286,3 +309,64 @@ def op_registration(env: str): def passive_op_registration(env: str): """Returns a function that can be used to register operations without associated code.""" return functools.partial(register_passive_op, env) + + +def slow(func): + """Decorator for slow, blocking operations. Turns them into separate threads.""" + + @functools.wraps(func) + async def wrapper(*args, **kwargs): + return await asyncio.to_thread(func, *args, **kwargs) + + return wrapper + + +_global_slow = slow # For access inside op(). +CATALOGS_SNAPSHOTS: dict[str, Catalogs] = {} + + +def save_catalogs(snapshot_name: str): + CATALOGS_SNAPSHOTS[snapshot_name] = {k: dict(v) for k, v in CATALOGS.items()} + + +def load_catalogs(snapshot_name: str): + global CATALOGS + snap = CATALOGS_SNAPSHOTS[snapshot_name] + CATALOGS = {k: dict(v) for k, v in snap.items()} + + +def load_user_scripts(workspace: str): + """Reloads the *.py in the workspace's directory and higher-level directories.""" + if "plugins loaded" in CATALOGS_SNAPSHOTS: + load_catalogs("plugins loaded") + cwd = pathlib.Path() + path = cwd / workspace + assert path.is_relative_to(cwd), "Provided workspace path is invalid" + for p in path.parents: + print("checking user scripts in", p) + for f in p.glob("*.py"): + try: + run_user_script(f) + except Exception: + traceback.print_exc() + req = p / "requirements.txt" + if req.exists(): + try: + install_requirements(req) + except Exception: + traceback.print_exc() + if p == cwd: + break + + +def install_requirements(req: pathlib.Path): + cmd = ["uv", "pip", "install", "-r", str(req)] + print(f"Running {' '.join(cmd)}") + subprocess.check_call(cmd) + + +def run_user_script(script_path: pathlib.Path): + print(f"Running {script_path}...") + spec = importlib.util.spec_from_file_location(script_path.stem, str(script_path)) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) diff --git a/lynxkite-core/src/lynxkite/core/workspace.py b/lynxkite-core/src/lynxkite/core/workspace.py index 6721b12e9eed69d4772d732e9d4993bfa285b296..e434fe1127114e859dbd500a87c83b0a6f70c0f7 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): @@ -108,9 +111,7 @@ def save(ws: Workspace, path: str): if dirname: os.makedirs(dirname, exist_ok=True) # Create temp file in the same directory to make sure it's on the same filesystem. - with tempfile.NamedTemporaryFile( - "w", prefix=f".{basename}.", dir=dirname, delete=False - ) as f: + with tempfile.NamedTemporaryFile("w", prefix=f".{basename}.", dir=dirname, delete=False) as f: temp_name = f.name f.write(j) os.replace(temp_name, path) diff --git a/lynxkite-core/tests/test_ops.py b/lynxkite-core/tests/test_ops.py index 6fb5c8b0dc3b3bb73fca7d5f46ea430d15465856..cc895130a84274b7de1f3de2813faadd7d16a066 100644 --- a/lynxkite-core/tests/test_ops.py +++ b/lynxkite-core/tests/test_ops.py @@ -14,9 +14,7 @@ def test_op_decorator_no_params_no_types_default_positions(): "a": ops.Input(name="a", type=inspect._empty, position="left"), "b": ops.Input(name="b", type=inspect._empty, position="left"), } - assert add.__op__.outputs == { - "result": ops.Output(name="result", type=None, position="right") - } + assert add.__op__.outputs == {"result": ops.Output(name="result", type=None, position="right")} assert add.__op__.type == "basic" assert ops.CATALOGS["test"]["add"] == add.__op__ @@ -34,9 +32,7 @@ def test_op_decorator_custom_positions(): "a": ops.Input(name="a", type=inspect._empty, position="right"), "b": ops.Input(name="b", type=inspect._empty, position="top"), } - assert add.__op__.outputs == { - "result": ops.Output(name="result", type=None, position="bottom") - } + assert add.__op__.outputs == {"result": ops.Output(name="result", type=None, position="bottom")} assert add.__op__.type == "basic" assert ops.CATALOGS["test"]["add"] == add.__op__ @@ -76,9 +72,7 @@ def test_op_decorator_with_complex_types(): assert complex_op.__op__.inputs == { "color": ops.Input(name="color", type=Color, position="left"), "color_list": ops.Input(name="color_list", type=list[Color], position="left"), - "color_dict": ops.Input( - name="color_dict", type=dict[str, Color], position="left" - ), + "color_dict": ops.Input(name="color_dict", type=dict[str, Color], position="left"), } assert complex_op.__op__.type == "basic" assert complex_op.__op__.outputs == { diff --git a/lynxkite-graph-analytics/pyproject.toml b/lynxkite-graph-analytics/pyproject.toml index 95ddf6c1b1f94adb3822e5fc9668177cb46f7edf..77f4fc53ae68f4b96a2f01845b747bff13a18eb5 100644 --- a/lynxkite-graph-analytics/pyproject.toml +++ b/lynxkite-graph-analytics/pyproject.toml @@ -14,6 +14,9 @@ dependencies = [ "osmnx>=2.0.1", "pandas>=2.2.3", "polars[gpu]>=1.14.0", + "torch>=2.6.0", + "torch-geometric>=2.6.1", + "cuml-cu12>=25.2.1", ] [project.optional-dependencies] diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/__init__.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/__init__.py index b6a581fc5c149366dca3785dd4d07d5053025262..dee185d63de0c5639f4b56a9bcdb5bcc47f2ebab 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/__init__.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/__init__.py @@ -13,7 +13,8 @@ pd.options.mode.copy_on_write = True # Prepare for Pandas 3.0. from .core import * # noqa (easier access for core classes) from . import lynxkite_ops # noqa (imported to trigger registration) from . import networkx_ops # noqa (imported to trigger registration) -from . import pytorch_model_ops # noqa (imported to trigger registration) +from . import pytorch # noqa (imported to trigger registration) +from . import ml_ops # noqa (imported to trigger registration) if os.environ.get("LYNXKITE_BIONEMO_INSTALLED", "").strip().lower() == "true": from . import bionemo_ops # noqa (imported to trigger registration) diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/bionemo_ops.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/bionemo_ops.py index 9222e650c581fc6e998b3def9b6396e25e79ce6d..1a93d812f79f512f9ccf914deeb841715fcf8929 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/bionemo_ops.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/bionemo_ops.py @@ -40,7 +40,7 @@ from bionemo.scdl.io.single_cell_collection import SingleCellCollection import scanpy -mem = joblib.Memory("joblib-cache") +mem = joblib.Memory(".joblib-cache") op = ops.op_registration(core.ENV) DATA_PATH = Path("/workspace") @@ -89,9 +89,7 @@ def download_cellxgene_dataset( adata.write_h5ad(h5ad_outfile) with tempfile.TemporaryDirectory() as temp_dir: coll = SingleCellCollection(temp_dir) - coll.load_h5ad_multi( - h5ad_outfile.parent, max_workers=max_workers, use_processes=use_mp - ) + coll.load_h5ad_multi(h5ad_outfile.parent, max_workers=max_workers, use_processes=use_mp) coll.flatten(DATA_PATH / save_path, destroy_on_copy=True) return DATA_PATH / save_path @@ -148,9 +146,7 @@ def download_model(*, model_name: str) -> str: @op("BioNeMo > Infer") @mem.cache(verbose=1) -def infer( - dataset_path: str, model_path: str | None = None, *, results_path: str -) -> str: +def infer(dataset_path: str, model_path: str | None = None, *, results_path: str) -> str: """Infer on a dataset.""" # This import is slow, so we only import it when we need it. from bionemo.geneformer.scripts.infer_geneformer import infer_model @@ -175,10 +171,7 @@ def infer( @op("BioNeMo > Load results") def load_results(results_path: str): embeddings = ( - torch.load(f"{results_path}/predictions__rank_0.pt")["embeddings"] - .float() - .cpu() - .numpy() + torch.load(f"{results_path}/predictions__rank_0.pt")["embeddings"].float().cpu().numpy() ) return embeddings @@ -248,9 +241,7 @@ def run_benchmark(data, labels, *, use_pca: bool = False): ] ) else: - pipeline = Pipeline( - [("classifier", RandomForestClassifier(class_weight="balanced"))] - ) + pipeline = Pipeline([("classifier", RandomForestClassifier(class_weight="balanced"))]) # Set up StratifiedKFold to ensure each fold reflects the overall distribution of labels cv = StratifiedKFold(n_splits=5) @@ -258,9 +249,7 @@ def run_benchmark(data, labels, *, use_pca: bool = False): # Define the scoring functions scoring = { "accuracy": make_scorer(accuracy_score), - "precision": make_scorer( - precision_score, average="macro" - ), # 'macro' averages over classes + "precision": make_scorer(precision_score, average="macro"), # 'macro' averages over classes "recall": make_scorer(recall_score, average="macro"), "f1_score": make_scorer(f1_score, average="macro"), # 'roc_auc' requires probability or decision function; hence use multi_class if applicable @@ -298,9 +287,7 @@ def plot_confusion_matrix(benchmark_output, labels): # heatmap has the 0,0 at the bottom left corner num_rows = len(str_labels) heatmap_data = [ - [j, num_rows - i - 1, norm_cm[i][j]] - for i in range(len(labels)) - for j in range(len(labels)) + [j, num_rows - i - 1, norm_cm[i][j]] for i in range(len(labels)) for j in range(len(labels)) ] options = { @@ -332,9 +319,7 @@ def plot_confusion_matrix(benchmark_output, labels): "orient": "vertical", "right": 10, "top": "center", - "inRange": { - "color": ["#E0F7FA", "#81D4FA", "#29B6F6", "#0288D1", "#01579B"] - }, + "inRange": {"color": ["#E0F7FA", "#81D4FA", "#29B6F6", "#0288D1", "#01579B"]}, }, "series": [ { @@ -424,9 +409,7 @@ def accuracy_comparison(benchmark_output10m, benchmark_output100m): { "name": "Error Bars", "type": "errorbar", - "data": [ - [val - err, val + err] for val, err in zip(values, error_bars) - ], + "data": [[val - err, val + err] for val, err in zip(values, error_bars)], "itemStyle": {"color": "#1f77b4"}, }, ], @@ -509,9 +492,7 @@ def f1_comparison(benchmark_output10m, benchmark_output100m): { "name": "Error Bars", "type": "errorbar", - "data": [ - [val - err, val + err] for val, err in zip(values, error_bars) - ], + "data": [[val - err, val + err] for val, err in zip(values, error_bars)], "itemStyle": {"color": "#1f77b4"}, }, ], diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py index db46115e27bebd09316d27951f2b9525c4cfe270..c5aa00cc17a4dd4ce4b1fed45c8b2b8dc31a1911 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/core.py @@ -1,5 +1,6 @@ """Graph analytics executor and data types.""" +import inspect import os from lynxkite.core import ops, workspace import dataclasses @@ -19,12 +20,8 @@ class RelationDefinition: """Defines a set of edges.""" df: str # The DataFrame that contains the edges. - source_column: ( - str # The column in the edge DataFrame that contains the source node ID. - ) - target_column: ( - str # The column in the edge DataFrame that contains the target node ID. - ) + source_column: str # The column in the edge DataFrame that contains the source node ID. + target_column: str # The column in the edge DataFrame that contains the target node ID. source_table: str # The DataFrame that contains the source nodes. target_table: str # The DataFrame that contains the target nodes. source_key: str # The column in the source table that contains the node ID. @@ -42,7 +39,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): @@ -86,11 +83,7 @@ class Bundle: ( e["source"], e["target"], - { - k: e[k] - for k in edges.columns - if k not in ["source", "target"] - }, + {k: e[k] for k in edges.columns if k not in ["source", "target"]}, ) for e in edges.to_records() ] @@ -102,10 +95,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 +109,20 @@ 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 +144,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] @@ -164,23 +178,28 @@ async def execute(ws: workspace.Workspace): # All inputs for this node are ready, we can compute the output. todo.remove(id) progress = True - _execute_node(node, ws, catalog, outputs) + await _execute_node(node, ws, catalog, outputs) -def _execute_node(node, ws, catalog, outputs): +async def await_if_needed(obj): + if inspect.isawaitable(obj): + obj = await obj + return obj + + +async def _execute_node(node, ws, catalog, outputs): params = {**node.data.params} op = catalog.get(node.data.title) if not op: 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 + 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 +213,31 @@ 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) + result.output = await await_if_needed(result.output) + 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 1027168963b639a68701b68ebb85d30fdc9653c9..1efe076770a4cea70a46ad660406c6744a74b3ae 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/lynxkite_ops.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/lynxkite_ops.py @@ -5,6 +5,7 @@ import os import fsspec from lynxkite.core import ops from collections import deque + from . import core import grandcypher import joblib @@ -15,7 +16,7 @@ import polars as pl import json -mem = joblib.Memory("joblib-cache") +mem = joblib.Memory(".joblib-cache") op = ops.op_registration(core.ENV) @@ -31,9 +32,7 @@ class FileFormat(enum.StrEnum): params={ "file_format": ops.ParameterGroup( name="file_format", - selector=ops.Parameter( - name="file_format", type=FileFormat, default=FileFormat.csv - ), + selector=ops.Parameter(name="file_format", type=FileFormat, default=FileFormat.csv), groups={ "csv": [ ops.Parameter.basic("columns", type=str, default=""), @@ -41,9 +40,7 @@ class FileFormat(enum.StrEnum): ], "parquet": [], "json": [], - "excel": [ - ops.Parameter.basic("sheet_name", type=str, default="Sheet1") - ], + "excel": [ops.Parameter.basic("sheet_name", type=str, default="Sheet1")], }, default=FileFormat.csv, ), @@ -64,9 +61,7 @@ def import_file( """ if file_format == "csv": names = kwargs.pop("columns", "") - names = ( - pd.api.extensions.no_default if names == "" else names.split(",") - ) + names = pd.api.extensions.no_default if names == "" else names.split(",") sep = kwargs.pop("separator", "") sep = pd.api.extensions.no_default if sep == "" else sep df = pd.read_csv(file_path, names=names, sep=sep, **kwargs) @@ -87,23 +82,19 @@ def import_parquet(*, filename: str): return pd.read_parquet(filename) -@mem.cache @op("Import CSV") -def import_csv( - *, filename: str, columns: str = "", separator: str = "" -): +@mem.cache +def import_csv(*, filename: str, columns: str = "", separator: str = ""): """Imports a CSV file.""" return pd.read_csv( filename, - names=pd.api.extensions.no_default - if columns == "" - else columns.split(","), + names=pd.api.extensions.no_default if columns == "" else columns.split(","), sep=pd.api.extensions.no_default if separator == "" else separator, ) -@mem.cache @op("Import GraphML") +@mem.cache def import_graphml(*, filename: str): """Imports a GraphML file.""" files = fsspec.open_files(filename, compression="infer") @@ -114,8 +105,8 @@ def import_graphml(*, filename: str): raise ValueError(f"No .graphml file found at {filename}") -@mem.cache @op("Graph from OSM") +@mem.cache def import_osm(*, location: str): import osmnx as ox @@ -141,12 +132,7 @@ def sql(bundle: core.Bundle, *, query: ops.LongStr, save_as: str = "result"): if os.environ.get("NX_CUGRAPH_AUTOCONFIG", "").strip().lower() == "true": with pl.Config() as cfg: cfg.set_verbose(True) - res = ( - pl.SQLContext(bundle.dfs) - .execute(query) - .collect(engine="gpu") - .to_pandas() - ) + res = pl.SQLContext(bundle.dfs).execute(query).collect(engine="gpu").to_pandas() # TODO: Currently `collect()` moves the data from cuDF to Polars. Then we convert it to Pandas, # which (hopefully) puts it back into cuDF. Hopefully we will be able to keep it in cuDF. else: @@ -165,11 +151,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}) @@ -207,9 +193,7 @@ def _map_color(value): colors = cmap.colors[: len(categories)] return [ "#{:02x}{:02x}{:02x}".format(int(r * 255), int(g * 255), int(b * 255)) - for r, g, b in [ - colors[min(len(colors) - 1, categories.get_loc(v))] for v in value - ] + for r, g, b in [colors[min(len(colors) - 1, categories.get_loc(v))] for v in value] ] @@ -246,14 +230,10 @@ def visualize_graph( curveness = 0 # Street maps are better with straight streets. break else: - pos = nx.spring_layout( - graph.to_nx(), iterations=max(1, int(10000 / len(nodes))) - ) + pos = nx.spring_layout(graph.to_nx(), iterations=max(1, int(10000 / len(nodes)))) curveness = 0.3 nodes = nodes.to_records() - edges = core.df_for_frontend( - graph.dfs["edges"].drop_duplicates(["source", "target"]), 10_000 - ) + edges = core.df_for_frontend(graph.dfs["edges"].drop_duplicates(["source", "target"]), 10_000) if color_edges_by: edges["color"] = _map_color(edges[color_edges_by]) edges = edges.to_records() @@ -287,9 +267,7 @@ def visualize_graph( "itemStyle": {"color": n.color} if color_nodes_by else {}, "label": {"show": label_by is not None}, "name": str(getattr(n, label_by, "")) if label_by else None, - "value": str(getattr(n, color_nodes_by, "")) - if color_nodes_by - else None, + "value": str(getattr(n, color_nodes_by, "")) if color_nodes_by else None, } for n in nodes ], @@ -298,9 +276,7 @@ def visualize_graph( "source": str(r.source), "target": str(r.target), "lineStyle": {"color": r.color} if color_edges_by else {}, - "value": str(getattr(r, color_edges_by, "")) - if color_edges_by - else None, + "value": str(getattr(r, color_edges_by, "")) if color_edges_by else None, } for r in edges ], @@ -311,7 +287,8 @@ def visualize_graph( @op("View tables", view="table_view") -def view_tables(bundle: core.Bundle, *, limit: int = 100): +def view_tables(bundle: core.Bundle, *, _tables_open: str = "", limit: int = 100): + _tables_open = _tables_open # The frontend uses this parameter to track which tables are open. return bundle.to_dict(limit=limit) @@ -338,7 +315,11 @@ def create_graph(bundle: core.Bundle, *, relations: str = None) -> core.Bundle: """ bundle = bundle.copy() if not (relations is None or relations.strip() == ""): - bundle.relations = [ - core.RelationDefinition(**r) for r in json.loads(relations).values() - ] + bundle.relations = [core.RelationDefinition(**r) for r in json.loads(relations).values()] return ops.Result(output=bundle, display=bundle.to_dict(limit=100)) + + +@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 diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/ml_ops.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/ml_ops.py new file mode 100644 index 0000000000000000000000000000000000000000..fd9dc91979282fe815fad38c025e000d18360a8a --- /dev/null +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/ml_ops.py @@ -0,0 +1,221 @@ +"""Operations for machine learning.""" + +import enum +import functools +import numpy as np +from . import core +from lynxkite.core import workspace +from .pytorch import pytorch_core +from lynxkite.core import ops +from tqdm import tqdm +import cuml +import joblib +import pandas as pd +import pathlib + + +mem = joblib.Memory(".joblib-cache") +op = ops.op_registration(core.ENV) + + +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("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_core.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_core.ModelMapping): + pass + + +class ModelTrainingInputMapping(pytorch_core.ModelMapping): + pass + + +class ModelOutputMapping(pytorch_core.ModelMapping): + pass + + +@op("Train model") +@ops.slow +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_core.to_tensors(bundle, input_mapping) + t = tqdm(range(epochs), desc="Training model") + losses = [] + for _ in t: + loss = m.train(inputs) + t.set_postfix({"loss": loss}) + losses.append(loss) + m.trained = True + bundle = bundle.copy() + bundle.dfs["training"] = pd.DataFrame({"training_loss": losses}) + bundle.other[model_name] = m + return bundle + + +@op("Model inference") +@ops.slow +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_core.to_tensors(bundle, input_mapping) + outputs = m.inference(inputs) + bundle = bundle.copy() + copied = set() + for k, v in output_mapping.map.items(): + if not v.df or not v.column: + continue + if v.df not in copied: + bundle.dfs[v.df] = bundle.dfs[v.df].copy() + copied.add(v.df) + 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).reset_index() + train = df.drop(test.index).reset_index() + bundle = bundle.copy() + bundle.dfs[f"{table_name}_train"] = train + bundle.dfs[f"{table_name}_test"] = test + return bundle + + +@op("View loss", view="visualization") +def view_loss(bundle: core.Bundle): + loss = bundle.dfs["training"].training_loss.tolist() + v = { + "title": {"text": "Training loss"}, + "xAxis": {"type": "category"}, + "yAxis": {"type": "value"}, + "series": [{"data": loss, "type": "line"}], + } + return v + + +@op("Reduce dimensions") +def reduce_dimensions(bundle: core.Bundle): + return + + +VIRIDIS = [ + "#440154", + "#482777", + "#3E4989", + "#31688E", + "#26828E", + "#1F9E89", + "#35B779", + "#6CCE59", + "#B4DE2C", + "#FDE725", +] + + +class UMAPMetric(enum.Enum): + l1 = "l1" + cityblock = "cityblock" + taxicab = "taxicab" + manhattan = "manhattan" + euclidean = "euclidean" + l2 = "l2" + sqeuclidean = "sqeuclidean" + canberra = "canberra" + minkowski = "minkowski" + chebyshev = "chebyshev" + linf = "linf" + cosine = "cosine" + correlation = "correlation" + hellinger = "hellinger" + hamming = "hamming" + + +@op("View vectors", view="visualization") +def view_vectors( + bundle: core.Bundle, + *, + table_name: str = "nodes", + vector_column: str = "", + label_column: str = "", + n_neighbors: int = 15, + min_dist: float = 0.1, + metric: UMAPMetric = UMAPMetric.euclidean, +): + vec = np.stack(bundle.dfs[table_name][vector_column].to_numpy()) + umap = functools.partial( + cuml.manifold.umap.UMAP, + n_neighbors=n_neighbors, + min_dist=min_dist, + metric=metric.value, + ) + proj = umap(n_components=2).fit_transform(vec) + color = umap(n_components=1).fit_transform(vec) + data = [[*p.tolist(), "", c.item()] for p, c in zip(proj, color)] + if label_column: + for i, row in enumerate(bundle.dfs[table_name][label_column]): + data[i][2] = row + size = 100 / len(data) ** 0.4 + v = { + "title": { + "text": f"UMAP projection of {vector_column}", + }, + "visualMap": { + "min": color[:, 0].min().item(), + "max": color[:, 0].max().item(), + "right": 10, + "top": "center", + "calculable": True, + "dimension": 3, + "inRange": {"color": VIRIDIS}, + }, + "tooltip": {"trigger": "item", "formatter": "GET_THIRD_VALUE"} + if label_column + else {"show": False}, + "xAxis": [{"type": "value"}], + "yAxis": [{"type": "value"}], + "series": [{"type": "scatter", "symbolSize": size, "data": data}], + } + return v diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/networkx_ops.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/networkx_ops.py index d470ab7f5929f977f0f310ec7b1e4e2d5639e4f0..5320b721f8ca6dd1025a950323b1dd89ab2d42ed 100644 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/networkx_ops.py +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/networkx_ops.py @@ -210,9 +210,7 @@ def _get_params(func) -> dict | None: continue params[name] = ops.Parameter.basic( name=name, - default=str(param.default) - if type(param.default) in [str, int, float] - else None, + default=str(param.default) if type(param.default) in [str, int, float] else None, type=_type, ) return params diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/__init__.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5e3686d31113ae7798a63ddb490349e183578067 --- /dev/null +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/__init__.py @@ -0,0 +1,2 @@ +from . import pytorch_core # noqa +from . import pytorch_ops # noqa diff --git a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/pytorch_core.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/pytorch_core.py new file mode 100644 index 0000000000000000000000000000000000000000..17e677a92e6b9582d9b5c71ff599f29f04473b06 --- /dev/null +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/pytorch_core.py @@ -0,0 +1,369 @@ +"""Infrastructure for defining PyTorch models.""" + +import copy +import graphlib + +import pydantic +from lynxkite.core import ops, workspace +import torch +import torch_geometric.nn as pyg_nn +import dataclasses +from .. import core + +ENV = "PyTorch model" + + +def op(name, **kwargs): + _op = ops.op(ENV, name, **kwargs) + + def decorator(func): + _op(func) + op = func.__op__ + for p in op.inputs.values(): + p.position = "bottom" + for p in op.outputs.values(): + p.position = "top" + return func + + return decorator + + +def reg(name, inputs=[], outputs=None, params=[]): + if outputs is None: + outputs = inputs + return ops.register_passive_op( + ENV, + name, + inputs=[ops.Input(name=name, position="bottom", type="tensor") for name in inputs], + outputs=[ops.Output(name=name, position="top", type="tensor") for name in outputs], + params=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) + + +@dataclasses.dataclass +class Layer: + """Temporary data structure used by ModelBuilder.""" + + module: torch.nn.Module + origin_id: str + inputs: list[str] + outputs: list[str] + + def for_sequential(self): + """The layer signature for pyg.nn.Sequential.""" + # "nothing" is used as a bogus input if an operation has no inputs. + # The module in turn needs to take one argument, but it will always be None. + inputs = ", ".join(self.inputs) or "nothing" + outputs = ", ".join(self.outputs) + return self.module, f"{inputs} -> {outputs}" + + +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_parameters: dict[str, any] + optimizer: torch.optim.Optimizer | None = None + source_workspace: str | None = None + trained: bool = False + + def __post_init__(self): + self._make_optimizer() + + def num_parameters(self) -> int: + return sum(p.numel() for p in self.model.parameters()) + + def _forward(self, inputs: dict[str, torch.Tensor]) -> dict[str, torch.Tensor]: + output = self.model(nothing=None, **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 = self.loss(nothing=None, **values) + loss.backward() + self.optimizer.step() + return loss.item() + + def _make_optimizer(self): + # We need to make a new optimizer when the model is copied. (It's tied to its parameters.) + p = self.optimizer_parameters + o = getattr(torch.optim, p["type"].name) + self.optimizer = o(self.model.parameters(), lr=p["lr"]) + + def copy(self): + """Returns a copy of the model.""" + c = dataclasses.replace( + self, + model=copy.deepcopy(self.model), + ) + c._make_optimizer() + c.optimizer.load_state_dict(self.optimizer.state_dict()) + 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) -> ModelConfig: + """Builds the model described in the workspace.""" + builder = ModelBuilder(ws) + return builder.build_model() + + +class ModelBuilder: + """The state shared between methods that are used to build the model.""" + + def __init__(self, ws: workspace.Workspace): + self.catalog = ops.CATALOGS[ENV] + optimizers = [] + self.nodes: dict[str, workspace.WorkspaceNode] = {} + repeats: list[str] = [] + for node in ws.nodes: + self.nodes[node.id] = node + if node.data.title == "Optimizer": + optimizers.append(node.id) + elif node.data.title == "Repeat": + repeats.append(node.id) + self.nodes[f"START {node.id}"] = node + self.nodes[f"END {node.id}"] = node + assert optimizers, "No optimizer found." + assert len(optimizers) == 1, f"More than one optimizer found: {optimizers}" + [self.optimizer] = optimizers + self.dependencies = {n: [] for n in self.nodes} + self.in_edges: dict[str, dict[str, list[tuple[str, str]]]] = {n: {} for n in self.nodes} + self.out_edges: dict[str, dict[str, list[tuple[str, str]]]] = {n: {} for n in self.nodes} + for e in ws.edges: + self.dependencies[e.target].append(e.source) + self.in_edges.setdefault(e.target, {}).setdefault(e.targetHandle, []).append( + (e.source, e.sourceHandle) + ) + self.out_edges.setdefault(e.source, {}).setdefault(e.sourceHandle, []).append( + (e.target, e.targetHandle) + ) + # Split repeat boxes into start and end, and insert them into the flow. + # TODO: Think about recursive repeats. + for repeat in repeats: + if not self.out_edges[repeat] or not self.in_edges[repeat]: + continue + start_id = f"START {repeat}" + end_id = f"END {repeat}" + # repeat -> first <- real_input + # ...becomes... + # real_input -> start -> first + first, firsth = self.out_edges[repeat]["output"][0] + [(real_input, real_inputh)] = [ + k for k in self.in_edges[first][firsth] if k != (repeat, "output") + ] + self.dependencies[first].remove(repeat) + self.dependencies[first].append(start_id) + self.dependencies[start_id] = [real_input] + self.out_edges[real_input][real_inputh] = [ + k if k != (first, firsth) else (start_id, "input") + for k in self.out_edges[real_input][real_inputh] + ] + self.in_edges[start_id] = {"input": [(real_input, real_inputh)]} + self.out_edges[start_id] = {"output": [(first, firsth)]} + self.in_edges[first][firsth] = [(start_id, "output")] + # repeat <- last -> real_output + # ...becomes... + # last -> end -> real_output + [(last, lasth)] = self.in_edges[repeat]["input"] + del self.dependencies[repeat] + self.dependencies[end_id] = [last] + real_edges = [e for e in self.out_edges[last][lasth] if e != (repeat, "input")] + self.out_edges[last][lasth] = [(end_id, "input")] + self.in_edges[end_id] = {"input": [(last, lasth)]} + self.out_edges[end_id] = {"output": []} # Populated below. + for real_output, real_outputh in real_edges: + self.dependencies[real_output].append(end_id) + self.in_edges[real_output][real_outputh] = [ + k if k != (last, lasth) else (end_id, "output") + for k in self.in_edges[real_output][real_outputh] + ] + self.out_edges[end_id]["output"].append((real_output, real_outputh)) + self.inv_dependencies = {n: [] for n in self.nodes} + for k, v in self.dependencies.items(): + for i in v: + self.inv_dependencies[i].append(k) + self.layers: list[Layer] = [] + # Clean up disconnected nodes. + disconnected = set() + for node_id in self.nodes: + op = self.catalog[self.nodes[node_id].data.title] + if len(self.in_edges[node_id]) != len(op.inputs): + disconnected.add(node_id) + disconnected |= self.all_upstream(node_id) + for node_id in disconnected: + del self.dependencies[node_id] + del self.in_edges[node_id] + del self.out_edges[node_id] + del self.inv_dependencies[node_id] + del self.nodes[node_id] + + def all_upstream(self, node: str) -> set[str]: + """Returns all nodes upstream of a node.""" + deps = set() + for dep in self.dependencies[node]: + deps.add(dep) + deps.update(self.all_upstream(dep)) + return deps + + def all_downstream(self, node: str) -> set[str]: + """Returns all nodes downstream of a node.""" + deps = set() + for dep in self.inv_dependencies[node]: + deps.add(dep) + deps.update(self.all_downstream(dep)) + return deps + + def run_node(self, node_id: str) -> None: + """Adds the layer(s) produced by this node to self.layers.""" + node = self.nodes[node_id] + t = node.data.title + op = self.catalog[t] + p = op.convert_params(node.data.params) + match t: + case "Repeat": + if node_id.startswith("END "): + repeat_id = node_id.removeprefix("END ") + start_id = f"START {repeat_id}" + [last_output] = self.in_edges[node_id]["input"] + after_start = self.all_downstream(start_id) + after_end = self.all_downstream(node_id) + before_end = self.all_upstream(node_id) + affected_nodes = after_start - after_end - {node_id} + repeated_nodes = after_start & before_end + assert affected_nodes == repeated_nodes, ( + f"edges leave repeated section '{repeat_id}':\n{affected_nodes - repeated_nodes}" + ) + repeated_layers = [e for e in self.layers if e.origin_id in repeated_nodes] + assert p["times"] >= 1, f"Cannot repeat {repeat_id} {p['times']} times." + for i in range(p["times"] - 1): + # Copy repeat section's output to repeat section's input. + self.layers.append( + Layer( + torch.nn.Identity(), + origin_id=node_id, + inputs=[_to_id(*last_output)], + outputs=[_to_id(start_id, "output")], + ) + ) + # Repeat the layers in the section. + for layer in repeated_layers: + if p["same_weights"]: + self.layers.append(layer) + else: + self.run_node(layer.origin_id) + self.layers.append(self.run_op(node_id, op, p)) + case "Optimizer" | "Input: tensor" | "Input: graph edges" | "Input: sequential": + return + case _: + self.layers.append(self.run_op(node_id, op, p)) + + def run_op(self, node_id: str, op: ops.Op, params) -> Layer: + """Returns the layer produced by this op.""" + inputs = [_to_id(*i) for n in op.inputs for i in self.in_edges[node_id][n]] + outputs = [_to_id(node_id, n) for n in op.outputs] + if op.func == ops.no_op: + module = torch.nn.Identity() + else: + module = op.func(*inputs, **params) + return Layer(module, node_id, inputs, outputs) + + def build_model(self) -> ModelConfig: + # Walk the graph in topological order. + ts = graphlib.TopologicalSorter(self.dependencies) + for node_id in ts.static_order(): + self.run_node(node_id) + return self.get_config() + + def get_config(self) -> ModelConfig: + # Split the design into model and loss. + model_nodes = set() + for node_id in self.nodes: + if self.nodes[node_id].data.title == "Output": + model_nodes.add(node_id) + model_nodes |= self.all_upstream(node_id) + assert model_nodes, "The model definition must have at least one Output node." + layers = [] + loss_layers = [] + for layer in self.layers: + if layer.origin_id in model_nodes: + layers.append(layer) + else: + loss_layers.append(layer) + used_in_model = set(input for layer in layers for input in layer.inputs) + used_in_loss = set(input for layer in loss_layers for input in layer.inputs) + made_in_model = set(output for layer in layers for output in layer.outputs) + made_in_loss = set(output for layer in loss_layers for output in layer.outputs) + layers = [layer.for_sequential() for layer in layers] + loss_layers = [layer.for_sequential() for layer in loss_layers] + cfg = {} + 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)] = self.in_edges[self.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: {loss_layers}" + # Create optimizer. + op = self.catalog["Optimizer"] + cfg["optimizer_parameters"] = op.convert_params(self.nodes[self.optimizer].data.params) + 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/src/lynxkite_graph_analytics/pytorch/pytorch_ops.py b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/pytorch_ops.py new file mode 100644 index 0000000000000000000000000000000000000000..d40f5fdfa557d9b4a0140c5ea64ef8f618204875 --- /dev/null +++ b/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch/pytorch_ops.py @@ -0,0 +1,183 @@ +"""Boxes for defining PyTorch models.""" + +import enum +from lynxkite.core import ops +from lynxkite.core.ops import Parameter as P +import torch +import torch_geometric.nn as pyg_nn +from .pytorch_core import op, reg, ENV + +reg("Input: tensor", outputs=["output"], params=[P.basic("name")]) +reg("Input: graph edges", outputs=["edges"]) +reg("Input: sequential", outputs=["y"]) +reg("Output", inputs=["x"], outputs=["x"], params=[P.basic("name")]) + + +@op("LSTM") +def lstm(x, *, input_size=1024, hidden_size=1024, dropout=0.0): + return torch.nn.LSTM(input_size, hidden_size, dropout=0.0) + + +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", + ], + ), + ], +) + + +@op("Attention", outputs=["outputs", "weights"]) +def attention(query, key, value, *, embed_dim=1024, num_heads=1, dropout=0.0): + return torch.nn.MultiHeadAttention(embed_dim, num_heads, dropout=dropout, need_weights=True) + + +@op("LayerNorm", outputs=["outputs", "weights"]) +def layernorm(x, *, normalized_shape=""): + normalized_shape = [int(s.strip()) for s in normalized_shape.split(",")] + return torch.nn.LayerNorm(normalized_shape) + + +@op("Dropout", outputs=["outputs", "weights"]) +def dropout(x, *, p=0.0): + return torch.nn.Dropout(p) + + +@op("Linear") +def linear(x, *, output_dim=1024): + return pyg_nn.Linear(-1, output_dim) + + +class ActivationTypes(enum.Enum): + ReLU = "ReLU" + Leaky_ReLU = "Leaky ReLU" + Tanh = "Tanh" + Mish = "Mish" + + +@op("Activation") +def activation(x, *, type: ActivationTypes = ActivationTypes.ReLU): + return getattr(torch.nn.functional, type.name.lower().replace(" ", "_")) + + +@op("MSE loss") +def mse_loss(x, y): + return torch.nn.functional.mse_loss + + +@op("Constant vector") +def constant_vector(*, value=0, size=1): + return lambda _: torch.full((size,), value) + + +@op("Softmax") +def softmax(x, *, dim=1): + return torch.nn.Softmax(dim=dim) + + +@op("Concatenate") +def concatenate(a, b): + return lambda a, b: torch.concatenate(*torch.broadcast_tensors(a, b)) + + +reg( + "Graph conv", + inputs=["x", "edges"], + outputs=["x"], + params=[P.options("type", ["GCNConv", "GATConv", "GATv2Conv", "SAGEConv"])], +) + +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"], + outputs=[], + params=[ + P.options( + "type", + [ + "AdamW", + "Adafactor", + "Adagrad", + "SGD", + "Lion", + "Paged AdamW", + "Galore AdamW", + ], + ), + P.basic("lr", 0.001), + ], +) + +ops.register_passive_op( + ENV, + "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), + ops.Parameter.basic("same_weights", False, 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 _set_handle_positions(op): + op: ops.Op = op.__op__ + for v in op.outputs.values(): + v.position = "top" + for v in op.inputs.values(): + v.position = "bottom" + + +def _register_simple_pytorch_layer(func): + op = ops.op(ENV, func.__name__.title())(lambda input: func) + _set_handle_positions(op) + + +def _register_two_tensor_function(func): + op = ops.op(ENV, func.__name__.title())(lambda a, b: func) + _set_handle_positions(op) + + +SIMPLE_FUNCTIONS = [ + torch.sin, + torch.cos, + torch.log, + torch.exp, +] +TWO_TENSOR_FUNCTIONS = [ + torch.multiply, + torch.add, + torch.subtract, +] + + +for f in SIMPLE_FUNCTIONS: + _register_simple_pytorch_layer(f) +for f in TWO_TENSOR_FUNCTIONS: + _register_two_tensor_function(f) 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 deleted file mode 100644 index e70dc0287005a89c268d44ee011a55f4431a206c..0000000000000000000000000000000000000000 --- a/lynxkite-graph-analytics/src/lynxkite_graph_analytics/pytorch_model_ops.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Boxes for defining PyTorch models.""" - -from lynxkite.core import ops -from lynxkite.core.ops import Parameter as P - -ENV = "PyTorch model" - - -def reg(name, inputs=[], outputs=None, params=[]): - if outputs is None: - outputs = inputs - return ops.register_passive_op( - ENV, - name, - inputs=[ - ops.Input(name=name, position="bottom", type="tensor") for name in inputs - ], - outputs=[ - ops.Output(name=name, position="top", type="tensor") for name in outputs - ], - params=params, - ) - - -reg("Input: features", 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("Attention", inputs=["q", "k", "v"], outputs=["x"]) -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( - "Graph conv", - inputs=["x", "edges"], - outputs=["x"], - params=[P.options("type", ["GCNConv", "GATConv", "GATv2Conv", "SAGEConv"])], -) -reg( - "Activation", - inputs=["x"], - params=[P.options("type", ["ReLU", "LeakyReLU", "Tanh", "Mish"])], -) -reg("Supervised loss", inputs=["x", "y"], outputs=["loss"]) -reg("Triplet loss", inputs=["x", "x_pos", "x_neg"], outputs=["loss"]) -reg( - "Optimizer", - inputs=["loss"], - outputs=[], - params=[ - P.options( - "type", - [ - "AdamW", - "Adafactor", - "Adagrad", - "SGD", - "Lion", - "Paged AdamW", - "Galore AdamW", - ], - ), - P.basic("lr", 0.001), - ], -) - -ops.register_passive_op( - ENV, - "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)], -) 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..587ad9329128cc97b3fd670f4f1f882f9157d751 --- /dev/null +++ b/lynxkite-graph-analytics/tests/test_pytorch_model_ops.py @@ -0,0 +1,122 @@ +from lynxkite.core import workspace +from lynxkite_graph_analytics.pytorch import pytorch_core +import torch +import pytest + + +def make_ws(env, nodes: dict[str, dict], edges: list[tuple[str, str]]): + ws = workspace.Workspace(env=env) + for id, data in nodes.items(): + title = data["title"] + del data["title"] + ws.nodes.append( + workspace.WorkspaceNode( + id=id, + type="basic", + data=workspace.WorkspaceNodeData(title=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 + + +def summarize_layers(m: pytorch_core.ModelConfig) -> str: + return "".join(str(e)[0] for e in m.model) + + +def summarize_connections(m: pytorch_core.ModelConfig) -> str: + return " ".join( + "".join(n[0] for n in c.param_names) + "->" + "".join(n[0] for n in c.return_names) + for c in m.model._children + ) + + +async def test_build_model(): + ws = make_ws( + pytorch_core.ENV, + { + "input": {"title": "Input: tensor"}, + "lin": {"title": "Linear", "output_dim": 4}, + "act": {"title": "Activation", "type": "Leaky_ReLU"}, + "output": {"title": "Output"}, + "label": {"title": "Input: tensor"}, + "loss": {"title": "MSE loss"}, + "optim": {"title": "Optimizer", "type": "SGD", "lr": 0.1}, + }, + [ + ("input:output", "lin:x"), + ("lin:output", "act:x"), + ("act:output", "output:x"), + ("output:x", "loss:x"), + ("label:output", "loss:y"), + ("loss:output", "optim:loss"), + ], + ) + x = torch.rand(100, 4) + y = x + 1 + m = pytorch_core.build_model(ws) + for i in range(1000): + loss = m.train({"input_output": x, "label_output": y}) + assert loss < 0.1 + o = m.inference({"input_output": x[:1]}) + error = torch.nn.functional.mse_loss(o["output_x"], x[:1] + 1) + assert error < 0.1 + + +async def test_build_model_with_repeat(): + def repeated_ws(times): + return make_ws( + pytorch_core.ENV, + { + "input": {"title": "Input: tensor"}, + "lin": {"title": "Linear", "output_dim": 8}, + "act": {"title": "Activation", "type": "Leaky_ReLU"}, + "output": {"title": "Output"}, + "label": {"title": "Input: tensor"}, + "loss": {"title": "MSE loss"}, + "optim": {"title": "Optimizer", "type": "SGD", "lr": 0.1}, + "repeat": {"title": "Repeat", "times": times, "same_weights": False}, + }, + [ + ("input:output", "lin:x"), + ("lin:output", "act:x"), + ("act:output", "output:x"), + ("output:x", "loss:x"), + ("label:output", "loss:y"), + ("loss:output", "optim:loss"), + ("repeat:output", "lin:x"), + ("act:output", "repeat:input"), + ], + ) + + # 1 repetition + m = pytorch_core.build_model(repeated_ws(1)) + assert summarize_layers(m) == "ILS S->l l->a a->E E->o o->o" + + # 2 repetitions + m = pytorch_core.build_model(repeated_ws(2)) + assert summarize_layers(m) == "ILS S->l l->a a->S S->l l->a a->E E->o o->o" + + # 3 repetitions + m = pytorch_core.build_model(repeated_ws(3)) + assert summarize_layers(m) == "ILS S->l l->a a->S S->l l->a a->S S->l l->a a->E E->o o->o" + + +if __name__ == "__main__": + pytest.main() diff --git a/lynxkite-graph-analytics/uv.lock b/lynxkite-graph-analytics/uv.lock index b4fb75927cca52c0357ef1270f9e38bbe491119d..4ba0b9cfca0ed3f206f2b11152b101bbc784f12c 100644 --- a/lynxkite-graph-analytics/uv.lock +++ b/lynxkite-graph-analytics/uv.lock @@ -9,6 +9,110 @@ 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 = "cachetools" +version = "5.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 }, +] + [[package]] name = "certifi" version = "2025.1.31" @@ -66,6 +170,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, ] +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992 }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -126,30 +251,111 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/31/1ae946f11dfbd229222e6d6ad8e7bd1891d3d48bde5fbf7a0beb9491f8e3/contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", size = 236668 }, ] +[[package]] +name = "cuda-bindings" +version = "12.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/45/4db82dec1cec4579cd9c41fe171f7580b5b65aa0556baa0f60cff893674a/cuda_bindings-12.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435f48a20acc9a89889784e4e7c333765bc40c6ae202101bde27b4abf7ba0233", size = 10991437 }, + { url = "https://files.pythonhosted.org/packages/9a/cc/27485aa29bbaadcc9eca07aaea1198807d7c2171550c290533a039d4efee/cuda_bindings-12.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33182c8aadf1c4ecf5e2672b5f0023f3be06011c22c916663eae6f33b1af90ff", size = 11331750 }, + { url = "https://files.pythonhosted.org/packages/8e/71/b04b633274819037021d1b5fd73cb112433aba0f3c0831b0aa560dd21328/cuda_bindings-12.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:70272dfe67d8cfbde34d7cd54b1754e8224924183392c59d64e623cdfab59e7e", size = 11089043 }, + { url = "https://files.pythonhosted.org/packages/3c/16/621f2ff6e4c6a0c1d57f5a0a373d1fb9d10eb9a7f05052cc64eba2e7dab2/cuda_bindings-12.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0865c9b75ee8f0535044c3f0f06ca34a37131192b573ab59e20a9e058da1ead4", size = 10904424 }, + { url = "https://files.pythonhosted.org/packages/59/11/aee1afd60a5d6af67994dd88697912be22366a6e548e52e6cd2defdbe678/cuda_bindings-12.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e6a889c87238e6cd55e9b25ce4fd1d90fe2d4169982860fed5f0bc3230795e", size = 11235285 }, + { url = "https://files.pythonhosted.org/packages/c1/c7/eedad18aeb461e9a3c1f8e2ea856caa50202a572b024912cb561f847a054/cuda_bindings-12.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d0123d841cb3053d227e18b08ea7680d0b5ca64fab4664a2b80b7c83c8edf1ee", size = 11224401 }, + { url = "https://files.pythonhosted.org/packages/4e/82/dc34a092d9111524eea70671d41d72dd3a5452ef70c424680bee1daf9c45/cuda_bindings-12.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e264ea93027c7448b9efa134729c12217ca9096051114ee7a9425d49b5a14222", size = 10722116 }, + { url = "https://files.pythonhosted.org/packages/78/f2/b5c3f07f743e74c1f5c42bb2fc6e735f3adac8b526f60ef731d861663dd9/cuda_bindings-12.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:099f27e79e754346fa51517168787cda395fb437b31fbf20771c002f30adc0c9", size = 11039795 }, + { url = "https://files.pythonhosted.org/packages/d5/89/d1f3c70651cdeb7c276c0503aea34c1d0c22f8bc66de73887f5ce40c600a/cuda_bindings-12.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:630290148879b47f5e34629ee15061414caaf2f73ea284175a73b30427ad94fd", size = 11190771 }, +] + [[package]] name = "cuda-python" -version = "12.6.0" +version = "12.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-bindings" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/2c/02bb311b996ffb91d05f8c1fb79131bf50855f7410dd33d09f800fe78c58/cuda_python-12.8.0-py3-none-any.whl", hash = "sha256:3fca3a03c247d6aa1c414989dfe0dd21e9500307b8573f72216ed57d99344c5a", size = 11930 }, +] + +[[package]] +name = "cudf-cu12" +version = "25.2.2" source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "cuda-python" }, + { name = "cupy-cuda12x" }, + { name = "fsspec" }, + { name = "libcudf-cu12" }, + { name = "numba" }, + { name = "numba-cuda" }, + { name = "numpy" }, + { name = "nvtx" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, + { name = "pylibcudf-cu12" }, + { name = "pynvjitlink-cu12" }, + { name = "rich" }, + { name = "rmm-cu12" }, + { name = "typing-extensions" }, +] wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/84/0b9ba455780219c930017c7e479edb6b4f038199c6842efe3a96fd3d68d2/cuda_python-12.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11fae55fd27977f787eae6c447ad08155c5aff81eff246079f2c01759ec7cac3", size = 24613998 }, - { url = "https://files.pythonhosted.org/packages/ca/1f/ef67d7988816c4cf403e6cea7f35e19bac5bcadcd4b67665b3bc138cde6b/cuda_python-12.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dea2aedc5fbe1f89635b1b8f7c7a90b498da27a69e0ca0e1e46d1f78939b39", size = 24988739 }, - { url = "https://files.pythonhosted.org/packages/fe/38/68d6d3aa34f79526eebd3aef4700cc0b7b64d40b8800d2c16f90862cf8e2/cuda_python-12.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:12b6f4136a4161ba97507dd5a371469471ea0b3f53e1b745979fcb77b4644526", size = 10002325 }, - { url = "https://files.pythonhosted.org/packages/ca/27/d8743b4ab32b35845ae647e91e25e0783495c3d8f76ef0ebec4267d93ac0/cuda_python-12.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78063e643cbde653d8d541f14fd591fc1d631e3010fdda8ab1132d95bc29a693", size = 23902462 }, - { url = "https://files.pythonhosted.org/packages/e7/15/f2e6cd28c5523c638ebd704c3268abb60e684506c1f4813e3dd4dcad167f/cuda_python-12.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb755a0825c42ff75d6b113c852b3b9ab580f1a6cde4cb19b57d0495925cd5cc", size = 24167826 }, - { url = "https://files.pythonhosted.org/packages/65/d7/aef9de64f2df946637d1e7fc202598ec44f2a4206fe1dfd39661e28612ea/cuda_python-12.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:932681507b0f2005e67fb296db242562670a1f311bc61b9a2dc437c2f7046737", size = 10127468 }, + { url = "https://files.pythonhosted.org/packages/3f/fb/bc8b621c8edeecb0ffd52dc6944e8d25b46c0dc6ccf3db8d3c03da686b37/cudf_cu12-25.2.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86ddc0566cb041b8c911a3b1bcc2dcd2603cad9bce34617bffd627f79a34b019", size = 2217845 }, + { url = "https://files.pythonhosted.org/packages/0d/e3/4aa41c9ba569217c9df47ef955b837cd159b512cb533679f9f90c0698a1f/cudf_cu12-25.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6eba6199c657989acdb163743f54b440bbc4ea974a5eaf8e9026054c4d91c217", size = 2236659 }, + { url = "https://files.pythonhosted.org/packages/d7/2e/abc96abc0d72c4da9f21c50d37c4e8e82577f43ab53407478b11c1e28763/cudf_cu12-25.2.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:58321bd37fbe8bf50880a11ec95eb369805edb4752629cda24f0f1232cb65a70", size = 2203248 }, + { url = "https://files.pythonhosted.org/packages/24/e5/d3d27ac8de60771aef0bcb7918e8851a51af8e9a4377652ff909f13756eb/cudf_cu12-25.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc69bc9573273c7248f2ea5ddefeba5675aa3a5b48301d7c7ff542676e1a5ad9", size = 2222278 }, ] [[package]] name = "cudf-polars-cu12" -version = "24.12.0" +version = "25.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "polars" }, { name = "pylibcudf-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/6e/3d0b2d19ac853347f435f49815d471d461315d8f6e74f165624f16ddc7db/cudf_polars_cu12-24.12.0-py3-none-any.whl", hash = "sha256:3d2058f75251fd4921618bb1d4cfba0c99b670a12756df0d3f51559aca2298fa", size = 79456 }, + { url = "https://files.pythonhosted.org/packages/71/d3/0f92c7738679221d10c48eb98c5caff44cf144a7c57fea4d12d26f38c1d9/cudf_polars_cu12-25.2.2-py3-none-any.whl", hash = "sha256:e2f65462945117fffa3d473ad0335ae38abe28ea5db96926759bf29b84847c84", size = 91557 }, +] + +[[package]] +name = "cuml-cu12" +version = "25.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-python" }, + { name = "cudf-cu12" }, + { name = "cupy-cuda12x" }, + { name = "cuvs-cu12" }, + { name = "dask-cuda" }, + { name = "dask-cudf-cu12" }, + { name = "joblib" }, + { name = "libcuml-cu12" }, + { name = "numba" }, + { name = "numpy" }, + { 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-cufft-cu12" }, + { 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 = "packaging" }, + { name = "pylibraft-cu12" }, + { name = "raft-dask-cu12" }, + { name = "rapids-dask-dependency" }, + { name = "rmm-cu12" }, + { name = "scipy" }, + { name = "treelite" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/00/00/971e68a11b5d4b05c7829e7686b34adf1d311e97d88aca54b85929a50853/cuml_cu12-25.2.1.tar.gz", hash = "sha256:a6ed878506d8f074bec920d1334b7c63cb423657c0c938420c1760b3dc211f1d", size = 2480 } [[package]] name = "cupy-cuda12x" @@ -168,6 +374,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/11/8bc53cab1466605ba88ba3c7243078a784ee2cd8974f5602a491882af9af/cupy_cuda12x-13.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:88ef1478f00ae252da0026e7f04f70c9bb6a2dc130ba5f1e5bc5e8069a928bf5", size = 69499349 }, ] +[[package]] +name = "cuvs-cu12" +version = "25.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-python" }, + { name = "libcuvs-cu12" }, + { name = "numpy" }, + { name = "pylibraft-cu12" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/40/627b4d6e91559f0476d28418d10035df566bc705f417f2191df1be45c411/cuvs_cu12-25.2.1.tar.gz", hash = "sha256:1c10ea83305a3e98f2b8146a9c17c3f07b0792215433e215ac805557858069b5", size = 1009 } + [[package]] name = "cycler" version = "0.12.1" @@ -177,6 +395,110 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, ] +[[package]] +name = "dask" +version = "2024.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "cloudpickle" }, + { name = "fsspec" }, + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "packaging" }, + { name = "partd" }, + { name = "pyyaml" }, + { name = "toolz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/19/1d1e57c0fa24dfd241bbec46d4b70c37ec15e8071a7e06d43d327c8dafbb/dask-2024.12.1.tar.gz", hash = "sha256:bac809af21c2dd7eb06827bccbfc612504f3ee6435580e548af912828f823195", size = 10693689 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/5a/cdc78a77bb1c7290fd1ccfe6001437f99a2af63e28343299abd09336236e/dask-2024.12.1-py3-none-any.whl", hash = "sha256:1f32acddf1a6994e3af6734756f0a92467c47050bc29f3555bb9b140420e8e19", size = 1269300 }, +] + +[[package]] +name = "dask-cuda" +version = "25.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "numba" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pynvml" }, + { name = "rapids-dask-dependency" }, + { name = "zict" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/72/40f0f160ef058cc8c98582744b4053cc4f05d1330dfc2904873bdccd205c/dask_cuda-25.2.0-py3-none-any.whl", hash = "sha256:17c5edfcd5b5d1687d49a2b5447aab14f721d87667cd69f93adfa1e706c310dc", size = 133884 }, +] + +[[package]] +name = "dask-cudf-cu12" +version = "25.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cudf-cu12" }, + { name = "cupy-cuda12x" }, + { name = "fsspec" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pynvml" }, + { name = "rapids-dask-dependency" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/f6/99c80cbdadc1468e0f051d780c98aa334e05ec0512cb5928a3a290f16e7c/dask_cudf_cu12-25.2.2-py3-none-any.whl", hash = "sha256:fba686f509577ceee1db76292cd6f7ec540e449a121c5041efccc041bde40c8a", size = 50433 }, +] + +[[package]] +name = "dask-expr" +version = "1.1.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dask" }, + { name = "pandas" }, + { name = "pyarrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/d3/50af8a5826231a804b0286704ed7be494d685337e159bf600cb396fcfcf9/dask_expr-1.1.21.tar.gz", hash = "sha256:eb45de8e6fea1ce2608a431b4e03a484592defb1796665530c91386ffac581d3", size = 223929 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/99/60c73ccb5a272ff396bc766bfa3c9caa71484424983f0334070263a16581/dask_expr-1.1.21-py3-none-any.whl", hash = "sha256:2c2a9a0b0e66b26cf918679988f97e947bc936544f3a106102055adb9a9edeba", size = 244297 }, +] + +[[package]] +name = "distributed" +version = "2024.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "cloudpickle" }, + { name = "dask" }, + { name = "jinja2" }, + { name = "locket" }, + { name = "msgpack" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "sortedcontainers" }, + { name = "tblib" }, + { name = "toolz" }, + { name = "tornado" }, + { name = "urllib3" }, + { name = "zict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/ce/0ca6d4e1da90f5b3af135b3abbf0487b2602d046cc090b793869928880b5/distributed-2024.12.1.tar.gz", hash = "sha256:438aa3ae48bfac9c2bb2ad03f9d47899286f9cb3db8a627b3b8c0de9e26f53dd", size = 1115786 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/90/82171cc7fe1c6d10bac57587c7ac012be80412ad06ef8c4952c5f067f869/distributed-2024.12.1-py3-none-any.whl", hash = "sha256:87e31abaa0ee3dc517b44fec4993d4b5d92257f926a8d2a12d52c005227154e7", size = 1022935 }, +] + +[[package]] +name = "distributed-ucxx-cu12" +version = "0.42.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numba" }, + { name = "rapids-dask-dependency" }, + { name = "ucxx-cu12" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/dc/56aae5fe60d70c13be293468da14b2cb367a6ce9df726c6ace896145ae0d/distributed_ucxx_cu12-0.42.0.tar.gz", hash = "sha256:8e1e5370edcf9d9fd51cc0b00048cf887ec7ef9ae956f0d02840256ee8e1f10c", size = 997 } + [[package]] name = "fastrlock" version = "0.8.3" @@ -205,6 +527,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 +569,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" @@ -293,6 +678,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] +[[package]] +name = "importlib-metadata" +version = "8.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580", size = 55767 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971 }, +] + [[package]] name = "iniconfig" version = "2.0.0" @@ -302,6 +699,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" @@ -388,26 +797,105 @@ wheels = [ [[package]] name = "libcudf-cu12" -version = "24.12.0" +version = "25.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "libkvikio-cu12" }, { name = "nvidia-nvcomp-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/ea/efccbbeb4012cdd247e3d12ed19c4cd70a770e6c22c1456d8cb569818083/libcudf_cu12-24.12.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:1e78a247f31c6045221f3142a5fd15210d53c91043c5a4e260b67b5ddff43164", size = 454436993 }, - { url = "https://files.pythonhosted.org/packages/88/93/dc3a27c3904aa12a32def0df330f15a85d0f01e0420b18bc0efa8b3245ba/libcudf_cu12-24.12.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:47b7537a314b4462c24938f4e9118ea65bfe2de7440e99ecf278a38a14abf9ab", size = 457847164 }, + { url = "https://files.pythonhosted.org/packages/8d/a8/808da99b2defef2aeb6c69b15b7e16b21d87972720157a894d2a9a0f01be/libcudf_cu12-25.2.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:0e3107f2705741d044e652bfded04f7494cccf8915a359d9bd6f2ff56b2aad79", size = 554719861 }, + { url = "https://files.pythonhosted.org/packages/9c/15/0b100e035206d63e7423f02aa290e561e37727e67a4103a12e0dbd94426c/libcudf_cu12-25.2.2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:4b5506ed8be1279127d95e76346fcc7d32ec05ecde5e522f7feef8464597146b", size = 557700158 }, +] + +[[package]] +name = "libcugraph-cu12" +version = "25.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "libraft-cu12" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/90/11/326b7639b6a3145ad38a7cf6b44c0d789a3f34bdc0619b3da6611354476e/libcugraph_cu12-25.2.0.tar.gz", hash = "sha256:ef737ad1774d0b58d8fba448db2758c129e35208b014315afe1c31689ada765a", size = 4023 } + +[[package]] +name = "libcuml-cu12" +version = "25.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "libcuvs-cu12" }, + { name = "libraft-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-cufft-cu12" }, + { 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'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/2c/082f021de508c2615285e3ba3f2975fb1b0a19de3582a8a8644bc69ccaa2/libcuml_cu12-25.2.1.tar.gz", hash = "sha256:344358186ecceef06cc39fa85c6ee520d3f3da8af5cfea607d953defe0e6807b", size = 4052 } + +[[package]] +name = "libcuvs-cu12" +version = "25.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "libraft-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'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/84/c2eb279ed5f7c1c57c7f0bfaf73da4e0b8e45e647dba93584e1e43e75e6f/libcuvs_cu12-25.2.1.tar.gz", hash = "sha256:67bab4b782a0652085d0f6596c4b6f871c22b2f07cdbfc65d10e7a72c83ba066", size = 4889 } [[package]] name = "libkvikio-cu12" -version = "24.12.1" +version = "25.2.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/46/612e6ddcc7aec02ed56c1d5292ccf843c7dc7554157aea349daa1d7bfa59/libkvikio_cu12-25.2.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:88e84c0ee869f43d2e312fe36010e719646083c4ebe527bb6da59a8062bdf09f", size = 1945856 }, + { url = "https://files.pythonhosted.org/packages/d8/cc/4937ed94b05b1f5bee16e8acf5f54e8fb649ebb52223cf9934c9f60e65d5/libkvikio_cu12-25.2.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:592a60b49c3a9b390ca2e6bf7466c5996f3b92bc99ccd4691cdba48a68c84503", size = 2066825 }, +] + +[[package]] +name = "libraft-cu12" +version = "25.2.0" +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'" }, + { 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'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/be/74b62697ffeafb10ceddeba3d7d6220d3376fbfd3d81b22d3e0babe2d08d/libraft_cu12-25.2.0.tar.gz", hash = "sha256:f96ff997b143588153224dad68a273b84b2bfce701783077b06dd628962f3812", size = 5471 } + +[[package]] +name = "libucx-cu12" +version = "1.18.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/17/8dbef99dc5a73dbf56dea090ba1c345cc4343bf8d13f331a8091d0e1c362/libkvikio_cu12-24.12.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:7ed5d27263204a237ea7a14ce176ed885888c8daf47341ae0fbcecd55fb2c694", size = 1875299 }, - { url = "https://files.pythonhosted.org/packages/0a/31/3be8facaf2f15849629a030e8fb1696ec80228270860b9ffd869a17a6a71/libkvikio_cu12-24.12.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:c4f333dbbffc35ba94a028db3b24ddb1c3dfddff9c6fb0f17488dc662a86f481", size = 1989095 }, + { url = "https://files.pythonhosted.org/packages/5b/34/0ac6ad57b0e7e4daed86e7d98f7cd184b74a14289aea7a13d6f13419fbce/libucx_cu12-1.18.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:7e66279f725e91162a07623982a4e26c0aa7752ac54a96b6d7628d7a72c11d9f", size = 26825933 }, + { url = "https://files.pythonhosted.org/packages/92/c8/d6722cceb53350857aaf0acec32d48011196383eecc35ed366939ac5c17e/libucx_cu12-1.18.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:212a90ced46b237e4df05ce7f6c5df95189900ab9b15f13398656c4fcc48fdb3", size = 27526849 }, ] +[[package]] +name = "libucxx-cu12" +version = "0.42.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "libucx-cu12" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/82/ab6cedf3b0201f2637f25657cc90d6cc38ae48a1f2d2a5149281707457f2/libucxx_cu12-0.42.0.tar.gz", hash = "sha256:30a557b89d7129d0f6665991a9aebcaff10349bb5490487a76d691b3843e5eea", size = 2981 } + [[package]] name = "llvmlite" version = "0.43.0" @@ -426,6 +914,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/94/dea10e263655ce78d777e78d904903faae39d1fc440762be4a9dc46bed49/llvmlite-0.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a2872ee80dcf6b5dbdc838763d26554c2a18aa833d31a2635bff16aafefb9c9", size = 28107442 }, ] +[[package]] +name = "locket" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/83/97b29fe05cb6ae28d2dbd30b81e2e402a3eed5f460c26e9eaa5895ceacf5/locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", size = 4350 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3", size = 4398 }, +] + [[package]] name = "lynxkite-core" version = "0.1.0" @@ -439,6 +936,7 @@ name = "lynxkite-graph-analytics" version = "0.1.0" source = { virtual = "." } dependencies = [ + { name = "cuml-cu12" }, { name = "fsspec" }, { name = "grand-cypher" }, { name = "joblib" }, @@ -448,6 +946,8 @@ dependencies = [ { name = "osmnx" }, { name = "pandas" }, { name = "polars", extra = ["gpu"] }, + { name = "torch" }, + { name = "torch-geometric" }, ] [package.optional-dependencies] @@ -461,6 +961,7 @@ gpu = [ [package.metadata] requires-dist = [ + { name = "cuml-cu12", specifier = ">=25.2.1" }, { name = "fsspec", specifier = ">=2025.2.0" }, { name = "grand-cypher", specifier = ">=0.12.0" }, { name = "joblib", specifier = ">=1.4.2" }, @@ -473,6 +974,68 @@ 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 = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[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 +1081,134 @@ 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 = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[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 = "msgpack" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803 }, + { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343 }, + { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408 }, + { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096 }, + { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671 }, + { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414 }, + { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759 }, + { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405 }, + { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041 }, + { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538 }, + { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871 }, + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, + { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, + { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, + { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, + { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, + { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, + { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, + { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, + { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, + { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, + { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, + { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, +] + +[[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" @@ -557,6 +1248,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ca/bd/0fe29fcd1b6a8de479a4ed25c6e56470e467e3611c079d55869ceef2b6d1/numba-0.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:f75262e8fe7fa96db1dca93d53a194a38c46da28b112b8a4aca168f0df860347", size = 2707588 }, ] +[[package]] +name = "numba-cuda" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numba" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/89/47a112d3b8ab614745614dc87cb4e1eee91670709ec2073841b1011ad8ea/numba_cuda-0.2.0.tar.gz", hash = "sha256:173991a47b4e29b1b242eac836668b72bba1d9b58634882d24354149ced62db5", size = 356951 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/88/0c0858a71fec5f34d0ffc3d14528e2c7d6624e48457ab760238a7d633158/numba_cuda-0.2.0-py3-none-any.whl", hash = "sha256:3493e3d63344186ff1b1b82aa4ec08ba3b75d87ef08eb28d5d10268c3a38558f", size = 443741 }, +] + [[package]] name = "numpy" version = "2.0.2" @@ -587,32 +1290,149 @@ wheels = [ [[package]] name = "nvidia-cublas-cu12" -version = "12.8.3.14" +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/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 }, + { 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-curand-cu12" -version = "10.3.9.55" +name = "nvidia-cublas-cu12" +version = "12.8.3.14" source = { registry = "https://pypi.org/simple" } -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 }, +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'" }, + { 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/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 }, + { url = "https://files.pythonhosted.org/packages/f6/ee/3f3f8e9874f0be5bbba8fb4b62b3de050156d159f8b6edc42d6f1074113b/nvidia_cufft_cu12-11.2.1.3-py3-none-win_amd64.whl", hash = "sha256:d802f4954291101186078ccbe22fc285a902136f974d369540fd4a5333d1440b", size = 210576476 }, +] + +[[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 +1440,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,26 +1476,80 @@ 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-ml-py" +version = "12.570.86" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/6e/7b0c9b88c7d520fb8639024a1a3b6dd1db03bf2c17ae85040c8758d2eb6f/nvidia_ml_py-12.570.86.tar.gz", hash = "sha256:0508d4a0c7b6d015cf574530b95a62ed4fc89da3b8b47e1aefe6777db170ec8b", size = 43147 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/a8/ec37169be4e2b7063b9076ed3fe0661e87335fbca665eed3f48c415cb234/nvidia_ml_py-12.570.86-py3-none-any.whl", hash = "sha256:58907de35a845abd13dcb227f18298f3b5dd94a72d04c9e594e77711e95c0b51", size = 44442 }, +] + +[[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" +version = "4.2.0.11" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/51/17e3acc3b53e5a6d97db7ed79035e8b5f13aefa1f5a8e703287418eac2b4/nvidia_nvcomp_cu12-4.1.0.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:3bff6267fa6aae59a98155262e5e9da6142e798dac5afd01f7389b23bce89803", size = 28724365 }, - { url = "https://files.pythonhosted.org/packages/f6/3e/c90004db47c527c4f253c1c866facefbd2a5059ba50035a6967712b3b125/nvidia_nvcomp_cu12-4.1.0.6-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:aaff831f0fdbf20631df32e411ede37ddf5fd7297f78e77346441cd0d72cb787", size = 28944826 }, - { 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 }, + { url = "https://files.pythonhosted.org/packages/18/12/f355ef1dec6fd53515c172207e68cdd84d68384fdc867abb950b3516e2b7/nvidia_nvcomp_cu12-4.2.0.11-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:944c45b20841a44d482ab83006ac086b5ced6ed8ba8ee4b89a78b0c0c7969e16", size = 46157956 }, + { url = "https://files.pythonhosted.org/packages/9f/67/4b11212e528994b1f7fa05b603c696f5a3a7c473e5d4ced9022af37b85d6/nvidia_nvcomp_cu12-4.2.0.11-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:e0f7fb7a21386b776a90ab163e76ae8c87ba89dcbcd85365dababf33bb78be03", size = 46289919 }, +] + +[[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" @@ -667,7 +1564,7 @@ wheels = [ [[package]] name = "nx-cugraph-cu12" -version = "24.12.0" +version = "25.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cupy-cuda12x" }, @@ -675,7 +1572,7 @@ dependencies = [ { name = "numpy" }, { name = "pylibcugraph-cu12" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/a1/e968a05bc2980fa4ad66b3fe8e5411a48c3079f6faa4d4ed89d29d82a956/nx_cugraph_cu12-24.12.0.tar.gz", hash = "sha256:a21b60b57cad982678570a69cbbe6d58fb171b12e8c99b296f68bf89ac517813", size = 5259 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/0b/b826645a292a54fc1f3ffcaa85150cd263eca617633516d7d41a5e2ef2ef/nx_cugraph_cu12-25.2.0.tar.gz", hash = "sha256:56ae0faba0d1c23c93ab1402a31e9d55c493ed00f4142cd3726bddd69d26abb7", size = 5417 } [[package]] name = "osmnx" @@ -744,6 +1641,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, ] +[[package]] +name = "partd" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "locket" }, + { name = "toolz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/3a/3f06f34820a31257ddcabdfafc2672c5816be79c7e353b02c1f318daa7d4/partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c", size = 21029 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905 }, +] + [[package]] name = "pillow" version = "11.1.0" @@ -804,15 +1714,16 @@ wheels = [ [[package]] name = "polars" -version = "1.14.0" +version = "1.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/10/5c/3376329b60b960cf0e615d6a2e13d57a59809665ee87960ad2edefd77a4e/polars-1.14.0.tar.gz", hash = "sha256:e34fbeca4664fba754a12d0a66b36569c4c9e5a0116108d9362067a0ca596b4d", size = 4147056 } +sdist = { url = "https://files.pythonhosted.org/packages/98/49/3733f0a34fd2504264579bad2c66021e175ab548b21767340721e10a1dcf/polars-1.21.0.tar.gz", hash = "sha256:7692d0fe0fb4faac18ef9423de55789e289f4d3f26d42519bd23ef8afb672d62", size = 4323012 } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/77/cee560ffa16842787f9524afeedc82c04dceb50ac42ab2ef6d3c2840a602/polars-1.14.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f346177c6f3442e8e61eadc4830d588348bf3383b0100d1c942b5615813be16e", size = 34292998 }, - { url = "https://files.pythonhosted.org/packages/3c/ae/f084dbb5d80599d7bbabbc21aa42a129d7ac55afafa70190987a525c9694/polars-1.14.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:588b5622b3a73be874a8e432d45c8a122662c09ce5ba2d5e5966f6dacce2b914", size = 30178132 }, - { url = "https://files.pythonhosted.org/packages/dd/3a/f03ee80d8dba47b3fc10d02191ee1690b8d4791626da5ea0a29435bd9b24/polars-1.14.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bc46ad6ceeec5d9d881f09c7c1811844e851980735f8455981cdea456e08f5c", size = 35522548 }, - { url = "https://files.pythonhosted.org/packages/47/a0/71f9a9a207820fee6aa09fc21d88961eeb9772fb39b6b9922ad4cdb42df3/polars-1.14.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:3fc0cf084f848799379e8eba14733ae0e9d66a0fa8ec41719df82ed29c827003", size = 31893694 }, - { url = "https://files.pythonhosted.org/packages/9c/84/4310aa0d4b526a60ee6e88e50514123682696bf37bc5f6c9298f6902e411/polars-1.14.0-cp39-abi3-win_amd64.whl", hash = "sha256:5ca507d162f88a44e1a945feecfa474fda0b66f378336d69b9ee23917da670c3", size = 35280144 }, + { url = "https://files.pythonhosted.org/packages/d4/c3/976f0251e96c957143905530b236f1e278b28a8eb5850eab94595bf5d220/polars-1.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:063f8807f633f8fd15458a43971d930f6ee568b8e95936d7736c9054fc4f6f52", size = 31015281 }, + { url = "https://files.pythonhosted.org/packages/94/33/c55c19dde172e34dd7a5074a1dcac6472074236131698269db236550283e/polars-1.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:519863e0990e3323e7a32fc66bac3ad9da51938a1ffce6c09a92e0b1adb026a5", size = 28033973 }, + { url = "https://files.pythonhosted.org/packages/da/72/b108cd7e063f03f5b029edbd73ca514291dd3e3d88617965d09df64d71ba/polars-1.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbecddca35c57efde99070517db5d2c63d4c6d0e3c992123ba3be93e86e7bfac", size = 31641844 }, + { url = "https://files.pythonhosted.org/packages/ac/0a/1df51a9e09fb9974a511eb098e13afed916e8643556799799884f22c7869/polars-1.21.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:d9ce8e6f0d8140e67b0f7c276d22bb5f3345ce7412558643c8b5c270db254b64", size = 29005158 }, + { url = "https://files.pythonhosted.org/packages/90/4b/f75f0eb9527c943440c6ed90be7e97146a00699fee69f9d5aff577f15659/polars-1.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:c4517abb008af890e4ca8fb6bb0372868381017af0ecadf9d062e2f91f50b276", size = 31729901 }, + { url = "https://files.pythonhosted.org/packages/e6/a0/d48548f4c9e139b02eacfc074bfd02d98d9bb5f9bf9c03ec5649a481d8ff/polars-1.21.0-cp39-abi3-win_arm64.whl", hash = "sha256:6bb0ba805defb05b76fdca392e48d84d1f16403de5be25d4dd8cdc7fccfd4251", size = 28179572 }, ] [package.optional-dependencies] @@ -820,6 +1731,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" @@ -855,9 +1854,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/11/fabf6ecabb1fe5b7d96889228ca2a9158c4c3bb732e3b8ee3f7f6d40b703/pyarrow-18.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:b76130d835261b38f14fc41fdfb39ad8d672afb84c447126b84d5472244cfaba", size = 40043567 }, ] +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + [[package]] name = "pylibcudf-cu12" -version = "24.12.0" +version = "25.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-python" }, @@ -869,40 +1877,61 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/0f/5a78a8bb72726de1ea50735c2e02588564542b8a0ad1069a067d9fe8e301/pylibcudf_cu12-24.12.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c61587a6d9e9f392745b9b238f3eebcfacbbf21e3c7d9fedf7a1a672284fcce", size = 36400678 }, - { url = "https://files.pythonhosted.org/packages/98/c9/66fe3954244f809b5b9a201e33d7cf8c663b09b0911443374b01333fe28a/pylibcudf_cu12-24.12.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6459baed065bc76fbc7ef34e14912982971c1a9d4bffb2699909d78a95b0b8a3", size = 37259282 }, - { url = "https://files.pythonhosted.org/packages/fa/1b/5f43e550262de73dfab17bbc8b2ee3f0add116be28c7ed6ba61a53135859/pylibcudf_cu12-24.12.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd130e347c28716912b89a1f7ff653ca6e202bfbc79f5abbedd7918bb9124f34", size = 36317440 }, - { url = "https://files.pythonhosted.org/packages/8e/2c/653ca775cefafeea2158d0c94296e6b78e050af2892f89fe21697bb737af/pylibcudf_cu12-24.12.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e2bb951f1a2fddf1976b84aa4e6d1280689da22014d6d1d5f48364cc1b32e2d", size = 37180377 }, + { url = "https://files.pythonhosted.org/packages/96/94/ba384eb6082d8bf7c19514b9fb34e4b336138623a92a7c189db726d15429/pylibcudf_cu12-25.2.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbff8fe9a23a7fc0286e987b6178576da2c80184496c9afcfccf492c0a3c060c", size = 27009994 }, + { url = "https://files.pythonhosted.org/packages/00/4b/8b2bdcbfa03ad69ce003ef52a993d04bcfb684a488afa4fd463efa15a66b/pylibcudf_cu12-25.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:556596ed1ab44f58874f11ee6f67ff38eb41add5f0fd024321ac426e4a6cebea", size = 27288907 }, + { url = "https://files.pythonhosted.org/packages/22/7a/2f19c2b2702e24bdd075798a6720026f1a22ac23ad8bb17caace449cf6eb/pylibcudf_cu12-25.2.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d00a14e6c351ae49c3efd1a2105259371f3618fa32aea7132b90338695ee3f3", size = 26936415 }, + { url = "https://files.pythonhosted.org/packages/06/6a/4b965daf69f83fe05643777211765e5a55585e5cec36d517cc16f2888c85/pylibcudf_cu12-25.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eadd02e3e09c99c31ca1cc97bbd793dff65059a827183349d0c7163408b2f309", size = 27219017 }, ] [[package]] name = "pylibcugraph-cu12" -version = "24.12.0" +version = "25.2.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 = "cupy-cuda12x" }, + { name = "libcugraph-cu12" }, + { name = "numpy" }, { name = "pylibraft-cu12" }, { name = "rmm-cu12" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/0f/10642063a2b228a3e9e192f5fbb1e9cf2b3914025bcb3f77fbf93d97b9b4/pylibcugraph_cu12-24.12.0.tar.gz", hash = "sha256:f8943c94db9333c53193fc575dd426f50dbdefe26c96c6715d5bbebd130b3a86", size = 3773 } +sdist = { url = "https://files.pythonhosted.org/packages/f5/0d/9b6c989bb8ec0264a18161c11757e007a232bae7905988a7fff990356233/pylibcugraph_cu12-25.2.0.tar.gz", hash = "sha256:e4668a60778e39b59101fb10a8e3f871cfff47eadd9f80ae79a488c1f1432cf6", size = 4105 } [[package]] name = "pylibraft-cu12" -version = "24.12.0" +version = "25.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-python" }, + { name = "libraft-cu12" }, { name = "numpy" }, - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-curand-cu12" }, - { name = "nvidia-cusolver-cu12" }, - { name = "nvidia-cusparse-cu12" }, { 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 } +sdist = { url = "https://files.pythonhosted.org/packages/4c/0b/6b79491e9c9bbe56d1e267a849e12ec2d362b47d94d75010b0d54dc9d427/pylibraft_cu12-25.2.0.tar.gz", hash = "sha256:4566673cfe68252b9ead0626f1fb7d17679cce1329d233fff4b6bb19ae97daa7", size = 5586 } + +[[package]] +name = "pynvjitlink-cu12" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/56/eba6e673c76e2d9ee8dbcf54fee8869fd4292544d74faa087819ec7f39d4/pynvjitlink_cu12-0.5.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c9909c34f904d593eab972e837d2bd4a7862fc942fca070437ff96c05989a41", size = 43946901 }, + { url = "https://files.pythonhosted.org/packages/33/0d/e68b14275b846566ed5a788b08c65223af8d25fd0cd20451248a4844be8c/pynvjitlink_cu12-0.5.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecc4d37eea1665eec8993ae59d5ba53a63cc0a7418f7831ea015f188acb6bb7e", size = 46197988 }, + { url = "https://files.pythonhosted.org/packages/4b/47/8ea4d75f26ec28613e0ccf05110cbcfcdb521600cc0d85132bc848aa37c0/pynvjitlink_cu12-0.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:867256718d887a5d8875a71e126a832977e92e7801ce4cf3c631d957f868b0c2", size = 43947722 }, + { url = "https://files.pythonhosted.org/packages/f4/3b/18481e2df36e17c0b94b74e0604fb0b8c4d7ca24f9a8b0df6f289858351b/pynvjitlink_cu12-0.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d3870af99e96e0c7b1354d6e1f18a94ad0c265e93e9503d324c6163ef00c2b1", size = 46197994 }, + { url = "https://files.pythonhosted.org/packages/a4/7b/5dee3271543345cea49dbe113a4f39abb0b1f6324dbb2fe3e8ec10e7b1b1/pynvjitlink_cu12-0.5.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c097175f3be9de061db5875cc12d627f4e66b40366839f7b1abe3ca45d8b8a9", size = 43947564 }, + { url = "https://files.pythonhosted.org/packages/38/21/cd93d3e2a88e9d751b36a3572f89241e4c65ce3b461c3d2caeb3961701d4/pynvjitlink_cu12-0.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a43a521821b906428d69ae90cb5ead8d014f7bf50a8f72b122a58392949534ba", size = 46197920 }, +] + +[[package]] +name = "pynvml" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-ml-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/6f/6b5880ed0239e85b9a39aed103b65b2ef81425beef9f45e5c035bf008330/pynvml-12.0.0.tar.gz", hash = "sha256:299ce2451a6a17e6822d6faee750103e25b415f06f59abb8db65d30f794166f5", size = 33636 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/df/f7cf07a65a96dd11d71f346f9c2863accdd4784da83af7181b067d556cbc/pynvml-12.0.0-py3-none-any.whl", hash = "sha256:fdff84b62a27dbe98e08e1a647eb77342bef1aebe0878bcd15e99a83fcbecb9e", size = 26560 }, +] [[package]] name = "pyogrio" @@ -1021,6 +2050,84 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 }, ] +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284 }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748 }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941 }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "raft-dask-cu12" +version = "25.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dask-cuda" }, + { name = "distributed-ucxx-cu12" }, + { name = "libraft-cu12" }, + { name = "pylibraft-cu12" }, + { name = "rapids-dask-dependency" }, + { name = "ucx-py-cu12" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/44/65d1c705c0f714574dceea9441b3031d1d6cafa861497af6343803439ae2/raft_dask_cu12-25.2.0.tar.gz", hash = "sha256:a0bc5144420700493fab3d2cd8d52a7cb6a48110e55ecde1bbabc386b1e033bc", size = 5571 } + +[[package]] +name = "rapids-dask-dependency" +version = "25.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dask" }, + { name = "dask-expr" }, + { name = "distributed" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/fa/e6a11730aceae4a061e0854a3b7f9c3d9736d924c7cb71567d3e9eb75c4c/rapids_dask_dependency-25.2.0-py3-none-any.whl", hash = "sha256:ead0d7a4c2ddb1f075a4324eb2b8b7e4c448197e47f116ace8b0e1f84b27d473", size = 22325 }, +] + [[package]] name = "requests" version = "2.32.3" @@ -1036,20 +2143,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "rich" +version = "14.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, +] + [[package]] name = "rmm-cu12" -version = "24.12.1" +version = "25.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-python" }, - { name = "numba" }, { name = "numpy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/c3/b08d5282116dd930e68a0ccbdecd750880efc451e0d2150e764793f03070/rmm_cu12-24.12.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d509d735201d1b0bc05b3e148e23a6216eabcfec67006a4e9311b6c25766023f", size = 1933478 }, - { url = "https://files.pythonhosted.org/packages/c7/ce/c32c1a95d53b1a22aeb258af7afa68a73a995c6c2f533fb774d2078d3cca/rmm_cu12-24.12.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1d6b166aaf9b81495ff33f2fe5a29ad12dc1ed6089daf9f387160e7734fc901", size = 1984701 }, - { url = "https://files.pythonhosted.org/packages/c2/4b/32f7920f130536e7e1a8ea7feb591cab7fcb85aaff28311c4e8057ec23da/rmm_cu12-24.12.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:317a6641fb37f3efa6e8eb76eeb568970a8c439e0090529520861fd139ef6f0c", size = 1923807 }, - { url = "https://files.pythonhosted.org/packages/1d/f2/56faa578aefdab498f6eb73dde3316f99390769786e0cdbb6c7a6abbbf86/rmm_cu12-24.12.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9460a386e34f1921c8d06204f320d705511de899ababb45302d314da036da5a", size = 1975053 }, + { url = "https://files.pythonhosted.org/packages/63/a5/45fdee9553ccffd56f99a95687d33c135bb57bb469271456fff000fe16f5/rmm_cu12-25.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e8b31026270a74da5f13c1e2a6125373f2ddb9b098c21f071b691c6074a3554", size = 2344243 }, + { url = "https://files.pythonhosted.org/packages/14/a3/469177e708c8e04fede1631b91a983b9ee89f6bee3a32eefe7a230dc33e6/rmm_cu12-25.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18ea9e4f7fb742ee5d14d74c4b9f4cc9fa50808fdae6c36cdb1280e980eedb63", size = 2375854 }, + { url = "https://files.pythonhosted.org/packages/43/30/9b09065db0cc3ad717d210dc135e27a71081e654020adaf48269653ef869/rmm_cu12-25.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be465a577bd94b3aaf53eecc98dbdacc27b739c570efc7d9df14e8cafe4846b2", size = 2335092 }, + { url = "https://files.pythonhosted.org/packages/3a/38/a3e92263f5399913c1877b04d4e3d27089432878166b299d2ad093072363/rmm_cu12-25.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42728ce9060af54f5890ee4bf2432a3ecebf7198827939deca6ff37455a17f9c", size = 2366234 }, ] [[package]] @@ -1099,6 +2218,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 +2265,164 @@ 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 = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, +] + +[[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 = "tblib" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/95/4b3044ec4bf248186769629bbfb495a458deb6e4c1f9eff7f298ae1e336e/tblib-3.1.0.tar.gz", hash = "sha256:06404c2c9f07f66fee2d7d6ad43accc46f9c3361714d9b8426e7f47e595cd652", size = 30766 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl", hash = "sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e", size = 12552 }, +] + +[[package]] +name = "toolz" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383 }, +] + +[[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 = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + +[[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 = "treelite" +version = "4.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/46/9e4ff3f11f04d31eb8b9bef1eb3b140d7ce272bbeb6ea1804c5ea7ea3299/treelite-4.4.1.tar.gz", hash = "sha256:de9c28ff481317d9f4286ea781ba404e2506caa6995cdcb1867a7036124263de", size = 109293 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/66/64850a5ec924a14e9517daaa21eb081a5883bb01ef16ffe3e08fda24d43f/treelite-4.4.1-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:876ecdbb20783c2f7cfa483996bcc450db6b931184cc1bf22bad28d7f069bfe7", size = 733602 }, + { url = "https://files.pythonhosted.org/packages/19/e2/1d7ae9bd1eabe68e237ebd394ef673b9f39172f352a1b9bb3befeddeee59/treelite-4.4.1-py3-none-macosx_12_0_arm64.whl", hash = "sha256:1473d7bb3e1e0eb525265a38cacb3f01e4c2136a1c85f40b512316b5776eb97f", size = 631437 }, + { url = "https://files.pythonhosted.org/packages/aa/6d/0def3f702f0d3a10f4ba9b161bed68551094fc6dda0a89e61a40ea2425c5/treelite-4.4.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ffc80da72201399ebe48944d231083cf190918297c37fd43814bb9635890cebc", size = 904552 }, + { url = "https://files.pythonhosted.org/packages/16/4c/9cfa4cfac89944066bcc042546782235544f5427a257c1f5bfd1700b0838/treelite-4.4.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b3299e6c3bc3afa51641b651d8c3b2084ceec44d1913de89bfa7e98d4caf7607", size = 922796 }, + { url = "https://files.pythonhosted.org/packages/8f/d2/9b7467b797493b06cc66b44a37053894b94af6ad2fbad1f6f4879b14213f/treelite-4.4.1-py3-none-win_amd64.whl", hash = "sha256:77b5c9b7f80fdab2efa43b4ace2fb76d61d584f7af7373c406dea95c230464f9", size = 502713 }, +] + +[[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" @@ -1155,6 +2441,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a6/ab/7e5f53c3b9d14972843a647d8d7a853969a58aecc7559cb3267302c94774/tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd", size = 346586 }, ] +[[package]] +name = "ucx-py-cu12" +version = "0.42.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "libucx-cu12" }, + { name = "numpy" }, + { name = "pynvml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/be/fd582bb3deeacca492afdb95e765f49c8f689a5eddd907cbcac3e08ffdde/ucx_py_cu12-0.42.0.tar.gz", hash = "sha256:a09d2fcd0716d16125979f51d0564a3af720e4f0cf011ed9d5c4510ca77e4316", size = 1366 } + +[[package]] +name = "ucxx-cu12" +version = "0.42.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "libucxx-cu12" }, + { name = "numpy" }, + { name = "pynvml" }, + { name = "rmm-cu12" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/1e/6fca7a2c32d42ef3f7dcd9b5052904974a62874deb64350e0c649e9b1d05/ucxx_cu12-0.42.0.tar.gz", hash = "sha256:42fe90c6f2ae5c4feb61c610661fda53c89646c9e0a3c3b5ae92c96637fc9902", size = 3196 } + [[package]] name = "urllib3" version = "2.3.0" @@ -1163,3 +2472,83 @@ 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 }, +] + +[[package]] +name = "zict" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/ac/3c494dd7ec5122cff8252c1a209b282c0867af029f805ae9befd73ae37eb/zict-3.0.0.tar.gz", hash = "sha256:e321e263b6a97aafc0790c3cfb3c04656b7066e6738c37fffcca95d803c9fba5", size = 33238 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl", hash = "sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae", size = 43332 }, +] + +[[package]] +name = "zipp" +version = "3.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, +] diff --git a/lynxkite-lynxscribe/README.md b/lynxkite-lynxscribe/README.md index bf7d73667d0711bc546bd3586a9f5141b53f8b52..95e52eb7900d7e753cd28006052762f4818ee52a 100644 --- a/lynxkite-lynxscribe/README.md +++ b/lynxkite-lynxscribe/README.md @@ -16,11 +16,16 @@ Run tests with: uv run pytest ``` -The LLM agent flow examples use local models. +The LLM agent flow examples can use local models. ```bash uv pip install infinity-emb[all] infinity_emb v2 --model-id michaelfeil/bge-small-en-v1.5 uv pip install "sglang[all]>=0.4.2.post2" --find-links https://flashinfer.ai/whl/cu124/torch2.5/flashinfer/ python -m sglang.launch_server --model-path SultanR/SmolTulu-1.7b-Instruct --port 8080 +export LLM_BASE_URL='http://localhost:8080/v1' +export LLM_MODEL='SultanR/SmolTulu-1.7b-Instruct' +export EMBEDDING_BASE_URL='http://localhost:7997/' +export EMBEDDING_MODEL='michaelfeil/bge-small-en-v1.5' +lynxkite ``` diff --git a/lynxkite-lynxscribe/src/lynxkite_lynxscribe/llm_ops.py b/lynxkite-lynxscribe/src/lynxkite_lynxscribe/llm_ops.py index 3031d55cea92355664e178330b75dbccb33d7aed..aaa80db1481b2d4c5048979395f4b1a995128c94 100644 --- a/lynxkite-lynxscribe/src/lynxkite_lynxscribe/llm_ops.py +++ b/lynxkite-lynxscribe/src/lynxkite_lynxscribe/llm_ops.py @@ -6,6 +6,7 @@ as an "agentic logic flow". It might just get deleted. (This is why the dependencies are left hanging.) """ +import os from lynxkite.core import ops import enum import jinja2 @@ -20,13 +21,18 @@ LLM_CACHE = {} ENV = "LLM logic" one_by_one.register(ENV) op = ops.op_registration(ENV) +LLM_BASE_URL = os.environ.get("LLM_BASE_URL", None) +EMBEDDING_BASE_URL = os.environ.get("EMBEDDING_BASE_URL", None) +LLM_MODEL = os.environ.get("LLM_MODEL", "gpt-4o-mini-2024-07-18") +EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "text-embedding-3-small") def chat(*args, **kwargs): import openai - chat_client = openai.OpenAI(base_url="http://localhost:8080/v1") - key = json.dumps({"method": "chat", "args": args, "kwargs": kwargs}) + chat_client = openai.OpenAI(base_url=LLM_BASE_URL) + kwargs.setdefault("model", LLM_MODEL) + key = json.dumps({"method": "chat", "base_url": LLM_BASE_URL, "args": args, "kwargs": kwargs}) if key not in LLM_CACHE: completion = chat_client.chat.completions.create(*args, **kwargs) LLM_CACHE[key] = [c.message.content for c in completion.choices] @@ -36,8 +42,16 @@ def chat(*args, **kwargs): def embedding(*args, **kwargs): import openai - embedding_client = openai.OpenAI(base_url="http://localhost:7997/") - key = json.dumps({"method": "embedding", "args": args, "kwargs": kwargs}) + embedding_client = openai.OpenAI(base_url=EMBEDDING_BASE_URL) + kwargs.setdefault("model", EMBEDDING_MODEL) + key = json.dumps( + { + "method": "embedding", + "base_url": EMBEDDING_BASE_URL, + "args": args, + "kwargs": kwargs, + } + ) if key not in LLM_CACHE: res = embedding_client.embeddings.create(*args, **kwargs) [data] = res.data @@ -105,17 +119,14 @@ def add_neighbors(nodes, edges, item): @op("Create prompt") def create_prompt(input, *, save_as="prompt", template: ops.LongStr): - assert template, ( - "Please specify the template. Refer to columns using the Jinja2 syntax." - ) + assert template, "Please specify the template. Refer to columns using the Jinja2 syntax." t = jinja.from_string(template) prompt = t.render(**input) return {**input, save_as: prompt} @op("Ask LLM") -def ask_llm(input, *, model: str, accepted_regex: str = None, max_tokens: int = 100): - assert model, "Please specify the model." +def ask_llm(input, *, accepted_regex: str = None, max_tokens: int = 100): assert "prompt" in input, "Please create the prompt first." options = {} if accepted_regex: @@ -123,7 +134,6 @@ def ask_llm(input, *, model: str, accepted_regex: str = None, max_tokens: int = "regex": accepted_regex, } results = chat( - model=model, max_tokens=max_tokens, messages=[ {"role": "user", "content": input["prompt"]}, @@ -212,10 +222,9 @@ def rag( results = [db[int(r)] for r in results["ids"][0]] return {**input, "rag": results, "_collection": collection} if engine == RagEngine.Custom: - model = "michaelfeil/bge-small-en-v1.5" chat = input[input_field] - embeddings = [embedding(input=[r[db_field]], model=model) for r in db] - q = embedding(input=[chat], model=model) + embeddings = [embedding(input=[r[db_field]]) for r in db] + q = embedding(input=[chat]) def cosine_similarity(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000000000000000000000000000000000000..71de868235494b222a9d12a06aa937ea71a98a4c --- /dev/null +++ b/ruff.toml @@ -0,0 +1 @@ +line-length = 100