real-ladybug 0.0.1.dev1__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of real-ladybug might be problematic. Click here for more details.
- real_ladybug/__init__.py +83 -0
- real_ladybug/_lbug.cp312-win_amd64.pyd +0 -0
- real_ladybug/_lbug.exp +0 -0
- real_ladybug/_lbug.lib +0 -0
- real_ladybug/async_connection.py +226 -0
- real_ladybug/connection.py +323 -0
- real_ladybug/constants.py +7 -0
- real_ladybug/database.py +307 -0
- real_ladybug/prepared_statement.py +51 -0
- real_ladybug/py.typed +0 -0
- real_ladybug/query_result.py +511 -0
- real_ladybug/torch_geometric_feature_store.py +185 -0
- real_ladybug/torch_geometric_graph_store.py +131 -0
- real_ladybug/torch_geometric_result_converter.py +282 -0
- real_ladybug/types.py +39 -0
- real_ladybug-0.0.1.dev1.dist-info/METADATA +88 -0
- real_ladybug-0.0.1.dev1.dist-info/RECORD +114 -0
- real_ladybug-0.0.1.dev1.dist-info/WHEEL +5 -0
- real_ladybug-0.0.1.dev1.dist-info/licenses/LICENSE +21 -0
- real_ladybug-0.0.1.dev1.dist-info/top_level.txt +3 -0
- real_ladybug-0.0.1.dev1.dist-info/zip-safe +1 -0
- real_ladybug-source/scripts/antlr4/hash.py +2 -0
- real_ladybug-source/scripts/antlr4/keywordhandler.py +47 -0
- real_ladybug-source/scripts/collect-extensions.py +68 -0
- real_ladybug-source/scripts/collect-single-file-header.py +126 -0
- real_ladybug-source/scripts/export-dbs.py +101 -0
- real_ladybug-source/scripts/export-import-test.py +345 -0
- real_ladybug-source/scripts/extension/purge-beta.py +34 -0
- real_ladybug-source/scripts/generate-cpp-docs/collect_files.py +122 -0
- real_ladybug-source/scripts/generate-tinysnb.py +34 -0
- real_ladybug-source/scripts/get-clangd-diagnostics.py +233 -0
- real_ladybug-source/scripts/migrate-lbug-db.py +308 -0
- real_ladybug-source/scripts/multiplatform-test-helper/collect-results.py +71 -0
- real_ladybug-source/scripts/multiplatform-test-helper/notify-discord.py +68 -0
- real_ladybug-source/scripts/pip-package/package_tar.py +90 -0
- real_ladybug-source/scripts/pip-package/setup.py +130 -0
- real_ladybug-source/scripts/run-clang-format.py +408 -0
- real_ladybug-source/scripts/setup-extension-repo.py +67 -0
- real_ladybug-source/scripts/test-simsimd-dispatch.py +45 -0
- real_ladybug-source/scripts/update-nightly-build-version.py +81 -0
- real_ladybug-source/third_party/brotli/scripts/dictionary/step-01-download-rfc.py +16 -0
- real_ladybug-source/third_party/brotli/scripts/dictionary/step-02-rfc-to-bin.py +34 -0
- real_ladybug-source/third_party/brotli/scripts/dictionary/step-03-validate-bin.py +35 -0
- real_ladybug-source/third_party/brotli/scripts/dictionary/step-04-generate-java-literals.py +85 -0
- real_ladybug-source/third_party/pybind11/tools/codespell_ignore_lines_from_errors.py +35 -0
- real_ladybug-source/third_party/pybind11/tools/libsize.py +36 -0
- real_ladybug-source/third_party/pybind11/tools/make_changelog.py +63 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/__init__.py +83 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/async_connection.py +226 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/connection.py +323 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/constants.py +7 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/database.py +307 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/prepared_statement.py +51 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/py.typed +0 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/query_result.py +511 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_feature_store.py +185 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_graph_store.py +131 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_result_converter.py +282 -0
- real_ladybug-source/tools/python_api/build/real_ladybug/types.py +39 -0
- real_ladybug-source/tools/python_api/src_py/__init__.py +83 -0
- real_ladybug-source/tools/python_api/src_py/async_connection.py +226 -0
- real_ladybug-source/tools/python_api/src_py/connection.py +323 -0
- real_ladybug-source/tools/python_api/src_py/constants.py +7 -0
- real_ladybug-source/tools/python_api/src_py/database.py +307 -0
- real_ladybug-source/tools/python_api/src_py/prepared_statement.py +51 -0
- real_ladybug-source/tools/python_api/src_py/py.typed +0 -0
- real_ladybug-source/tools/python_api/src_py/query_result.py +511 -0
- real_ladybug-source/tools/python_api/src_py/torch_geometric_feature_store.py +185 -0
- real_ladybug-source/tools/python_api/src_py/torch_geometric_graph_store.py +131 -0
- real_ladybug-source/tools/python_api/src_py/torch_geometric_result_converter.py +282 -0
- real_ladybug-source/tools/python_api/src_py/types.py +39 -0
- real_ladybug-source/tools/python_api/test/conftest.py +230 -0
- real_ladybug-source/tools/python_api/test/disabled_test_extension.py +73 -0
- real_ladybug-source/tools/python_api/test/ground_truth.py +430 -0
- real_ladybug-source/tools/python_api/test/test_arrow.py +694 -0
- real_ladybug-source/tools/python_api/test/test_async_connection.py +159 -0
- real_ladybug-source/tools/python_api/test/test_blob_parameter.py +145 -0
- real_ladybug-source/tools/python_api/test/test_connection.py +49 -0
- real_ladybug-source/tools/python_api/test/test_database.py +234 -0
- real_ladybug-source/tools/python_api/test/test_datatype.py +372 -0
- real_ladybug-source/tools/python_api/test/test_df.py +564 -0
- real_ladybug-source/tools/python_api/test/test_dict.py +112 -0
- real_ladybug-source/tools/python_api/test/test_exception.py +54 -0
- real_ladybug-source/tools/python_api/test/test_fsm.py +227 -0
- real_ladybug-source/tools/python_api/test/test_get_header.py +49 -0
- real_ladybug-source/tools/python_api/test/test_helper.py +8 -0
- real_ladybug-source/tools/python_api/test/test_issue.py +147 -0
- real_ladybug-source/tools/python_api/test/test_iteration.py +96 -0
- real_ladybug-source/tools/python_api/test/test_networkx.py +437 -0
- real_ladybug-source/tools/python_api/test/test_parameter.py +340 -0
- real_ladybug-source/tools/python_api/test/test_prepared_statement.py +117 -0
- real_ladybug-source/tools/python_api/test/test_query_result.py +54 -0
- real_ladybug-source/tools/python_api/test/test_query_result_close.py +44 -0
- real_ladybug-source/tools/python_api/test/test_scan_pandas.py +676 -0
- real_ladybug-source/tools/python_api/test/test_scan_pandas_pyarrow.py +714 -0
- real_ladybug-source/tools/python_api/test/test_scan_polars.py +165 -0
- real_ladybug-source/tools/python_api/test/test_scan_pyarrow.py +167 -0
- real_ladybug-source/tools/python_api/test/test_timeout.py +11 -0
- real_ladybug-source/tools/python_api/test/test_torch_geometric.py +640 -0
- real_ladybug-source/tools/python_api/test/test_torch_geometric_remote_backend.py +111 -0
- real_ladybug-source/tools/python_api/test/test_udf.py +207 -0
- real_ladybug-source/tools/python_api/test/test_version.py +6 -0
- real_ladybug-source/tools/python_api/test/test_wal.py +80 -0
- real_ladybug-source/tools/python_api/test/type_aliases.py +10 -0
- real_ladybug-source/tools/rust_api/update_version.py +47 -0
- real_ladybug-source/tools/shell/test/conftest.py +218 -0
- real_ladybug-source/tools/shell/test/test_helper.py +60 -0
- real_ladybug-source/tools/shell/test/test_shell_basics.py +325 -0
- real_ladybug-source/tools/shell/test/test_shell_commands.py +656 -0
- real_ladybug-source/tools/shell/test/test_shell_control_edit.py +438 -0
- real_ladybug-source/tools/shell/test/test_shell_control_search.py +468 -0
- real_ladybug-source/tools/shell/test/test_shell_esc_edit.py +232 -0
- real_ladybug-source/tools/shell/test/test_shell_esc_search.py +162 -0
- real_ladybug-source/tools/shell/test/test_shell_flags.py +645 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import multiprocessing
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import torch
|
|
9
|
+
from torch_geometric.data.graph_store import EdgeAttr, EdgeLayout, GraphStore
|
|
10
|
+
|
|
11
|
+
from .connection import Connection
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
from torch_geometric.typing import EdgeTensorType
|
|
17
|
+
|
|
18
|
+
from .database import Database
|
|
19
|
+
|
|
20
|
+
if sys.version_info >= (3, 10):
|
|
21
|
+
from typing import TypeAlias
|
|
22
|
+
else:
|
|
23
|
+
from typing_extensions import TypeAlias
|
|
24
|
+
|
|
25
|
+
StoreKeyType: TypeAlias = tuple[tuple[str], Any, bool]
|
|
26
|
+
|
|
27
|
+
REL_BATCH_SIZE = 1000000
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class Rel: # noqa: D101
|
|
32
|
+
edge_type: tuple[str, ...]
|
|
33
|
+
layout: str
|
|
34
|
+
is_sorted: bool
|
|
35
|
+
size: tuple[int, ...]
|
|
36
|
+
materialized: bool = False
|
|
37
|
+
edge_index: EdgeTensorType | None = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class LbugGraphStore(GraphStore): # type: ignore[misc]
|
|
41
|
+
"""Graph store compatible with `torch_geometric`."""
|
|
42
|
+
|
|
43
|
+
def __init__(self, db: Database, num_threads: int | None = None):
|
|
44
|
+
super().__init__()
|
|
45
|
+
self.db = db
|
|
46
|
+
self.connection: Connection | None = None
|
|
47
|
+
self.store: dict[StoreKeyType, Rel] = {}
|
|
48
|
+
if num_threads is None:
|
|
49
|
+
num_threads = multiprocessing.cpu_count()
|
|
50
|
+
self.num_threads = num_threads
|
|
51
|
+
self.__populate_edge_attrs()
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def key(attr: EdgeAttr) -> tuple[tuple[str], Any, bool]: # noqa: D102
|
|
55
|
+
return attr.edge_type, attr.layout.value, attr.is_sorted
|
|
56
|
+
|
|
57
|
+
def _put_edge_index(self, edge_index: EdgeTensorType, edge_attr: EdgeAttr) -> None:
|
|
58
|
+
key = self.key(edge_attr)
|
|
59
|
+
if key in self.store:
|
|
60
|
+
self.store[key].edge_index = edge_index
|
|
61
|
+
self.store[key].materialized = True
|
|
62
|
+
self.store[key].size = edge_attr.size
|
|
63
|
+
else:
|
|
64
|
+
self.store[key] = Rel(key[0], key[1], key[2], edge_attr.size, True, edge_index)
|
|
65
|
+
|
|
66
|
+
def _get_edge_index(self, edge_attr: EdgeAttr) -> EdgeTensorType | None:
|
|
67
|
+
if edge_attr.layout.value == EdgeLayout.COO.value: # noqa: SIM102
|
|
68
|
+
# We always return a sorted COO edge index, if the request is
|
|
69
|
+
# for an unsorted COO edge index, we change the is_sorted flag
|
|
70
|
+
# to True and return the sorted COO edge index.
|
|
71
|
+
if edge_attr.is_sorted is False:
|
|
72
|
+
edge_attr.is_sorted = True
|
|
73
|
+
|
|
74
|
+
key = self.key(edge_attr)
|
|
75
|
+
if key in self.store:
|
|
76
|
+
rel = self.store[self.key(edge_attr)]
|
|
77
|
+
if not rel.materialized and rel.layout != EdgeLayout.COO.value:
|
|
78
|
+
msg = "Only COO layout is supported"
|
|
79
|
+
raise ValueError(msg)
|
|
80
|
+
|
|
81
|
+
if rel.layout == EdgeLayout.COO.value:
|
|
82
|
+
self.__get_edge_coo_from_database(self.key(edge_attr))
|
|
83
|
+
return rel.edge_index
|
|
84
|
+
else:
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
def _remove_edge_index(self, edge_attr: EdgeAttr) -> None:
|
|
88
|
+
key = self.key(edge_attr)
|
|
89
|
+
if key in self.store:
|
|
90
|
+
del self.store[key]
|
|
91
|
+
|
|
92
|
+
def get_all_edge_attrs(self) -> list[EdgeAttr]:
|
|
93
|
+
"""Return all EdgeAttr from the store values."""
|
|
94
|
+
return [EdgeAttr(rel.edge_type, rel.layout, rel.is_sorted, rel.size) for rel in self.store.values()]
|
|
95
|
+
|
|
96
|
+
def __get_edge_coo_from_database(self, key: StoreKeyType) -> None:
|
|
97
|
+
if not self.connection:
|
|
98
|
+
self.connection = Connection(self.db, self.num_threads)
|
|
99
|
+
|
|
100
|
+
rel = self.store[key]
|
|
101
|
+
if rel.layout != EdgeLayout.COO.value:
|
|
102
|
+
msg = "Only COO layout is supported"
|
|
103
|
+
raise ValueError(msg)
|
|
104
|
+
if rel.materialized:
|
|
105
|
+
return
|
|
106
|
+
|
|
107
|
+
edge_type = rel.edge_type
|
|
108
|
+
num_edges = self.connection._connection.get_num_rels(edge_type[1])
|
|
109
|
+
result = np.empty(2 * num_edges, dtype=np.int64)
|
|
110
|
+
self.connection._connection.get_all_edges_for_torch_geometric(
|
|
111
|
+
result, edge_type[0], edge_type[1], edge_type[2], REL_BATCH_SIZE
|
|
112
|
+
)
|
|
113
|
+
edge_list = torch.from_numpy(result)
|
|
114
|
+
edge_list = edge_list.reshape((2, edge_list.shape[0] // 2))
|
|
115
|
+
rel.edge_index = edge_list
|
|
116
|
+
rel.materialized = True
|
|
117
|
+
|
|
118
|
+
def __populate_edge_attrs(self) -> None:
|
|
119
|
+
if not self.connection:
|
|
120
|
+
self.connection = Connection(self.db, self.num_threads)
|
|
121
|
+
rel_tables = self.connection._get_rel_table_names()
|
|
122
|
+
for rel_table in rel_tables:
|
|
123
|
+
edge_type = (rel_table["src"], rel_table["name"], rel_table["dst"])
|
|
124
|
+
size = self.__get_size(edge_type)
|
|
125
|
+
rel = Rel(edge_type, EdgeLayout.COO.value, True, size, False, None)
|
|
126
|
+
self.store[self.key(EdgeAttr(edge_type, EdgeLayout.COO, True))] = rel
|
|
127
|
+
|
|
128
|
+
def __get_size(self, edge_type: tuple[str, ...]) -> tuple[int, int]:
|
|
129
|
+
num_nodes = self.connection._connection.get_num_nodes # type: ignore[union-attr]
|
|
130
|
+
src_count, dst_count = num_nodes(edge_type[0]), num_nodes(edge_type[-1])
|
|
131
|
+
return (src_count, dst_count)
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import warnings
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
from .types import Type
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
import torch_geometric.data as geo
|
|
10
|
+
|
|
11
|
+
from .query_result import QueryResult
|
|
12
|
+
|
|
13
|
+
from .constants import ID, LABEL, SRC, DST
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TorchGeometricResultConverter:
|
|
17
|
+
"""Convert graph results to `torch_geometric`."""
|
|
18
|
+
|
|
19
|
+
def __init__(self, query_result: QueryResult):
|
|
20
|
+
self.query_result = query_result
|
|
21
|
+
self.nodes_dict: dict[str, Any] = {}
|
|
22
|
+
self.edges_dict: dict[str, Any] = {}
|
|
23
|
+
self.edges_properties: dict[str | tuple[str, str], dict[str, Any]] = {}
|
|
24
|
+
self.rels: dict[tuple[Any, ...], dict[str, Any]] = {}
|
|
25
|
+
self.nodes_property_names_dict: dict[str, Any] = {}
|
|
26
|
+
self.table_to_label_dict: dict[int, str] = {}
|
|
27
|
+
self.internal_id_to_pos_dict: dict[tuple[int, int], int | None] = {}
|
|
28
|
+
self.pos_to_primary_key_dict: dict[str, Any] = {}
|
|
29
|
+
self.warning_messages: set[str] = set()
|
|
30
|
+
self.unconverted_properties: dict[str, Any] = {}
|
|
31
|
+
self.properties_to_extract = self.query_result._get_properties_to_extract()
|
|
32
|
+
|
|
33
|
+
def __get_node_property_names(self, table_name: str) -> dict[str, Any]:
|
|
34
|
+
if table_name in self.nodes_property_names_dict:
|
|
35
|
+
return self.nodes_property_names_dict[table_name]
|
|
36
|
+
results = self.query_result.connection._get_node_property_names(table_name)
|
|
37
|
+
self.nodes_property_names_dict[table_name] = results
|
|
38
|
+
return results
|
|
39
|
+
|
|
40
|
+
def __populate_nodes_dict_and_deduplicte_edges(self) -> None:
|
|
41
|
+
self.query_result.reset_iterator()
|
|
42
|
+
while self.query_result.has_next():
|
|
43
|
+
row = self.query_result.get_next()
|
|
44
|
+
for i in self.properties_to_extract:
|
|
45
|
+
column_type, _ = self.properties_to_extract[i]
|
|
46
|
+
if column_type == Type.NODE.value:
|
|
47
|
+
node = row[i]
|
|
48
|
+
label = node[LABEL]
|
|
49
|
+
nid = node[ID]
|
|
50
|
+
self.table_to_label_dict[nid["table"]] = label
|
|
51
|
+
|
|
52
|
+
if (nid["table"], nid["offset"]) in self.internal_id_to_pos_dict:
|
|
53
|
+
continue
|
|
54
|
+
|
|
55
|
+
node_property_names = self.__get_node_property_names(label)
|
|
56
|
+
|
|
57
|
+
pos, primary_key = self.__extract_properties_from_node(node, label, node_property_names)
|
|
58
|
+
|
|
59
|
+
self.internal_id_to_pos_dict[nid["table"], nid["offset"]] = pos
|
|
60
|
+
if label not in self.pos_to_primary_key_dict:
|
|
61
|
+
self.pos_to_primary_key_dict[label] = {}
|
|
62
|
+
self.pos_to_primary_key_dict[label][pos] = primary_key
|
|
63
|
+
|
|
64
|
+
elif column_type == Type.REL.value:
|
|
65
|
+
src = row[i][SRC]
|
|
66
|
+
dst = row[i][DST]
|
|
67
|
+
self.rels[src["table"], src["offset"], dst["table"], dst["offset"]] = row[i]
|
|
68
|
+
|
|
69
|
+
def __extract_properties_from_node(
|
|
70
|
+
self,
|
|
71
|
+
node: dict[str, Any],
|
|
72
|
+
label: str,
|
|
73
|
+
node_property_names: dict[str, Any],
|
|
74
|
+
) -> tuple[int | None, Any]:
|
|
75
|
+
pos = None
|
|
76
|
+
import torch
|
|
77
|
+
|
|
78
|
+
for prop_name in node_property_names:
|
|
79
|
+
# Read primary key
|
|
80
|
+
if node_property_names[prop_name]["is_primary_key"]:
|
|
81
|
+
primary_key = node[prop_name]
|
|
82
|
+
|
|
83
|
+
# If property is already marked as unconverted, then add it directly without further checks
|
|
84
|
+
if label in self.unconverted_properties and prop_name in self.unconverted_properties[label]:
|
|
85
|
+
pos = self.__add_unconverted_property(node, label, prop_name)
|
|
86
|
+
continue
|
|
87
|
+
|
|
88
|
+
# Mark properties that are not supported by torch_geometric as unconverted
|
|
89
|
+
if node_property_names[prop_name]["type"] not in [Type.INT64.value, Type.DOUBLE.value, Type.BOOL.value]:
|
|
90
|
+
self.warning_messages.add(
|
|
91
|
+
"Property {}.{} of type {} is not supported by torch_geometric. The property is marked as unconverted.".format(
|
|
92
|
+
label, prop_name, node_property_names[prop_name]["type"]
|
|
93
|
+
)
|
|
94
|
+
)
|
|
95
|
+
self.__mark_property_unconverted(label, prop_name)
|
|
96
|
+
pos = self.__add_unconverted_property(node, label, prop_name)
|
|
97
|
+
continue
|
|
98
|
+
if node[prop_name] is None:
|
|
99
|
+
self.warning_messages.add(
|
|
100
|
+
f"Property {label}.{prop_name} has a null value. torch_geometric does not support null values. The property is marked as unconverted."
|
|
101
|
+
)
|
|
102
|
+
self.__mark_property_unconverted(label, prop_name)
|
|
103
|
+
pos = self.__add_unconverted_property(node, label, prop_name)
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
if node_property_names[prop_name]["dimension"] == 0:
|
|
107
|
+
curr_value = node[prop_name]
|
|
108
|
+
else:
|
|
109
|
+
try:
|
|
110
|
+
if node_property_names[prop_name]["type"] == Type.INT64.value:
|
|
111
|
+
curr_value = torch.LongTensor(node[prop_name])
|
|
112
|
+
elif node_property_names[prop_name]["type"] == Type.DOUBLE.value:
|
|
113
|
+
curr_value = torch.FloatTensor(node[prop_name])
|
|
114
|
+
elif node_property_names[prop_name]["type"] == Type.BOOL.value:
|
|
115
|
+
curr_value = torch.BoolTensor(node[prop_name])
|
|
116
|
+
except ValueError:
|
|
117
|
+
self.warning_messages.add(
|
|
118
|
+
f"Property {label}.{prop_name} cannot be converted to Tensor (likely due to nested list of variable length). The property is marked as unconverted."
|
|
119
|
+
)
|
|
120
|
+
self.__mark_property_unconverted(label, prop_name)
|
|
121
|
+
pos = self.__add_unconverted_property(node, label, prop_name)
|
|
122
|
+
continue
|
|
123
|
+
|
|
124
|
+
# Check if the shape of the property is consistent
|
|
125
|
+
if label in self.nodes_dict and prop_name in self.nodes_dict[label]: # noqa: SIM102
|
|
126
|
+
# If the shape is inconsistent, then mark the property as unconverted
|
|
127
|
+
if curr_value.shape != self.nodes_dict[label][prop_name][0].shape:
|
|
128
|
+
self.warning_messages.add(
|
|
129
|
+
f"Property {label}.{prop_name} has an inconsistent shape. The property is marked as unconverted."
|
|
130
|
+
)
|
|
131
|
+
self.__mark_property_unconverted(label, prop_name)
|
|
132
|
+
pos = self.__add_unconverted_property(node, label, prop_name)
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
# Create the dictionary for the label if it does not exist
|
|
136
|
+
if label not in self.nodes_dict:
|
|
137
|
+
self.nodes_dict[label] = {}
|
|
138
|
+
if prop_name not in self.nodes_dict[label]:
|
|
139
|
+
self.nodes_dict[label][prop_name] = []
|
|
140
|
+
|
|
141
|
+
# Add the property to the dictionary
|
|
142
|
+
self.nodes_dict[label][prop_name].append(curr_value)
|
|
143
|
+
|
|
144
|
+
# The pos will be overwritten for each property, but
|
|
145
|
+
# it should be the same for all properties
|
|
146
|
+
pos = len(self.nodes_dict[label][prop_name]) - 1
|
|
147
|
+
return pos, primary_key
|
|
148
|
+
|
|
149
|
+
def __add_unconverted_property(self, node: dict[str, Any], label: str, prop_name: str) -> int:
|
|
150
|
+
self.unconverted_properties[label][prop_name].append(node[prop_name])
|
|
151
|
+
return len(self.unconverted_properties[label][prop_name]) - 1
|
|
152
|
+
|
|
153
|
+
def __mark_property_unconverted(self, label: str, prop_name: str) -> None:
|
|
154
|
+
import torch
|
|
155
|
+
|
|
156
|
+
if label not in self.unconverted_properties:
|
|
157
|
+
self.unconverted_properties[label] = {}
|
|
158
|
+
if prop_name not in self.unconverted_properties[label]:
|
|
159
|
+
if label in self.nodes_dict and prop_name in self.nodes_dict[label]:
|
|
160
|
+
self.unconverted_properties[label][prop_name] = self.nodes_dict[label][prop_name]
|
|
161
|
+
del self.nodes_dict[label][prop_name]
|
|
162
|
+
if len(self.nodes_dict[label]) == 0:
|
|
163
|
+
del self.nodes_dict[label]
|
|
164
|
+
for i in range(len(self.unconverted_properties[label][prop_name])):
|
|
165
|
+
# If the property is a tensor, convert it back to list (consistent with the original type)
|
|
166
|
+
if torch.is_tensor(self.unconverted_properties[label][prop_name][i]): # type: ignore[no-untyped-call]
|
|
167
|
+
self.unconverted_properties[label][prop_name][i] = self.unconverted_properties[label][
|
|
168
|
+
prop_name
|
|
169
|
+
][i].tolist()
|
|
170
|
+
else:
|
|
171
|
+
self.unconverted_properties[label][prop_name] = []
|
|
172
|
+
|
|
173
|
+
def __populate_edges_dict(self) -> None:
|
|
174
|
+
# Post-process edges, map internal ids to positions
|
|
175
|
+
for r in self.rels:
|
|
176
|
+
src_pos = self.internal_id_to_pos_dict[r[0], r[1]]
|
|
177
|
+
dst_pos = self.internal_id_to_pos_dict[r[2], r[3]]
|
|
178
|
+
src_label = self.table_to_label_dict[r[0]]
|
|
179
|
+
dst_label = self.table_to_label_dict[r[2]]
|
|
180
|
+
if src_label not in self.edges_dict:
|
|
181
|
+
self.edges_dict[src_label] = {}
|
|
182
|
+
if dst_label not in self.edges_dict[src_label]:
|
|
183
|
+
self.edges_dict[src_label][dst_label] = []
|
|
184
|
+
self.edges_dict[src_label][dst_label].append((src_pos, dst_pos))
|
|
185
|
+
curr_edge_properties = self.rels[r]
|
|
186
|
+
if (src_label, dst_label) not in self.edges_properties:
|
|
187
|
+
self.edges_properties[src_label, dst_label] = {}
|
|
188
|
+
for prop_name in curr_edge_properties:
|
|
189
|
+
if prop_name in [SRC, DST, ID]:
|
|
190
|
+
continue
|
|
191
|
+
if prop_name not in self.edges_properties[src_label, dst_label]:
|
|
192
|
+
self.edges_properties[src_label, dst_label][prop_name] = []
|
|
193
|
+
self.edges_properties[src_label, dst_label][prop_name].append(curr_edge_properties[prop_name])
|
|
194
|
+
|
|
195
|
+
def __print_warnings(self) -> None:
|
|
196
|
+
for message in self.warning_messages:
|
|
197
|
+
warnings.warn(message, stacklevel=2)
|
|
198
|
+
|
|
199
|
+
def __convert_to_torch_geometric(
|
|
200
|
+
self,
|
|
201
|
+
) -> tuple[
|
|
202
|
+
geo.Data | geo.HeteroData,
|
|
203
|
+
dict[str, Any],
|
|
204
|
+
dict[str, Any],
|
|
205
|
+
dict[str | tuple[str, str], dict[str, Any]],
|
|
206
|
+
]:
|
|
207
|
+
import torch
|
|
208
|
+
import torch_geometric
|
|
209
|
+
|
|
210
|
+
if len(self.nodes_dict) == 0:
|
|
211
|
+
self.warning_messages.add("No nodes found or all node properties are not converted.")
|
|
212
|
+
|
|
213
|
+
# If there is only one node type, then convert to torch_geometric.data.Data
|
|
214
|
+
# Otherwise, convert to torch_geometric.data.HeteroData
|
|
215
|
+
if len(self.nodes_dict) == 1:
|
|
216
|
+
data = torch_geometric.data.Data()
|
|
217
|
+
is_hetero = False
|
|
218
|
+
else:
|
|
219
|
+
data = torch_geometric.data.HeteroData()
|
|
220
|
+
is_hetero = True
|
|
221
|
+
|
|
222
|
+
# Convert nodes to tensors
|
|
223
|
+
converted: torch.Tensor
|
|
224
|
+
for label in self.nodes_dict:
|
|
225
|
+
for prop_name in self.nodes_dict[label]:
|
|
226
|
+
prop_type = self.nodes_property_names_dict[label][prop_name]["type"]
|
|
227
|
+
prop_dimension = self.nodes_property_names_dict[label][prop_name]["dimension"]
|
|
228
|
+
if prop_dimension == 0:
|
|
229
|
+
if prop_type == Type.INT64.value:
|
|
230
|
+
converted = torch.LongTensor(self.nodes_dict[label][prop_name])
|
|
231
|
+
elif prop_type == Type.BOOL.value:
|
|
232
|
+
converted = torch.BoolTensor(self.nodes_dict[label][prop_name])
|
|
233
|
+
elif prop_type == Type.DOUBLE.value:
|
|
234
|
+
converted = torch.FloatTensor(self.nodes_dict[label][prop_name])
|
|
235
|
+
else:
|
|
236
|
+
converted = torch.stack(self.nodes_dict[label][prop_name], dim=0)
|
|
237
|
+
if is_hetero:
|
|
238
|
+
data[label][prop_name] = converted
|
|
239
|
+
else:
|
|
240
|
+
data[prop_name] = converted
|
|
241
|
+
|
|
242
|
+
# Convert edges to tensors
|
|
243
|
+
for src_label in self.edges_dict:
|
|
244
|
+
for dst_label in self.edges_dict[src_label]:
|
|
245
|
+
edge_idx = torch.tensor(self.edges_dict[src_label][dst_label], dtype=torch.long).t().contiguous()
|
|
246
|
+
if is_hetero:
|
|
247
|
+
data[src_label, dst_label].edge_index = edge_idx
|
|
248
|
+
else:
|
|
249
|
+
data.edge_index = edge_idx
|
|
250
|
+
|
|
251
|
+
pos_to_primary_key_dict: dict[str, Any] = (
|
|
252
|
+
self.pos_to_primary_key_dict[label] if not is_hetero else self.pos_to_primary_key_dict
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
if is_hetero:
|
|
256
|
+
unconverted_properties = self.unconverted_properties
|
|
257
|
+
edge_properties = self.edges_properties
|
|
258
|
+
else:
|
|
259
|
+
if len(self.unconverted_properties) == 0:
|
|
260
|
+
unconverted_properties = {}
|
|
261
|
+
else:
|
|
262
|
+
unconverted_properties = self.unconverted_properties[next(iter(self.unconverted_properties))]
|
|
263
|
+
if len(self.edges_properties) == 0:
|
|
264
|
+
edge_properties = {}
|
|
265
|
+
else:
|
|
266
|
+
edge_properties = self.edges_properties[next(iter(self.edges_properties))] # type: ignore[assignment]
|
|
267
|
+
return data, pos_to_primary_key_dict, unconverted_properties, edge_properties
|
|
268
|
+
|
|
269
|
+
def get_as_torch_geometric(
|
|
270
|
+
self,
|
|
271
|
+
) -> tuple[
|
|
272
|
+
geo.Data | geo.HeteroData,
|
|
273
|
+
dict[str, Any],
|
|
274
|
+
dict[str, Any],
|
|
275
|
+
dict[str | tuple[str, str], dict[str, Any]],
|
|
276
|
+
]:
|
|
277
|
+
"""Convert graph data to `torch_geometric`."""
|
|
278
|
+
self.__populate_nodes_dict_and_deduplicte_edges()
|
|
279
|
+
self.__populate_edges_dict()
|
|
280
|
+
result = self.__convert_to_torch_geometric()
|
|
281
|
+
self.__print_warnings()
|
|
282
|
+
return result
|
real_ladybug/types.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Type(Enum):
|
|
5
|
+
"""The type of a value in the database."""
|
|
6
|
+
|
|
7
|
+
ANY = "ANY"
|
|
8
|
+
NODE = "NODE"
|
|
9
|
+
REL = "REL"
|
|
10
|
+
RECURSIVE_REL = "RECURSIVE_REL"
|
|
11
|
+
SERIAL = "SERIAL"
|
|
12
|
+
BOOL = "BOOL"
|
|
13
|
+
INT64 = "INT64"
|
|
14
|
+
INT32 = "INT32"
|
|
15
|
+
INT16 = "INT16"
|
|
16
|
+
INT8 = "INT8"
|
|
17
|
+
UINT64 = "UINT64"
|
|
18
|
+
UINT32 = "UINT32"
|
|
19
|
+
UINT16 = "UINT16"
|
|
20
|
+
UINT8 = "UINT8"
|
|
21
|
+
INT128 = "INT128"
|
|
22
|
+
DOUBLE = "DOUBLE"
|
|
23
|
+
FLOAT = "FLOAT"
|
|
24
|
+
DATE = "DATE"
|
|
25
|
+
TIMESTAMP = "TIMESTAMP"
|
|
26
|
+
TIMSTAMP_TZ = "TIMESTAMP_TZ"
|
|
27
|
+
TIMESTAMP_NS = "TIMESTAMP_NS"
|
|
28
|
+
TIMESTAMP_MS = "TIMESTAMP_MS"
|
|
29
|
+
TIMESTAMP_SEC = "TIMESTAMP_SEC"
|
|
30
|
+
INTERVAL = "INTERVAL"
|
|
31
|
+
INTERNAL_ID = "INTERNAL_ID"
|
|
32
|
+
STRING = "STRING"
|
|
33
|
+
BLOB = "BLOB"
|
|
34
|
+
UUID = "UUID"
|
|
35
|
+
LIST = "LIST"
|
|
36
|
+
ARRAY = "ARRAY"
|
|
37
|
+
STRUCT = "STRUCT"
|
|
38
|
+
MAP = "MAP"
|
|
39
|
+
UNION = "UNION"
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: real_ladybug
|
|
3
|
+
Version: 0.0.1.dev1
|
|
4
|
+
Summary: Highly scalable, extremely fast, easy-to-use embeddable graph database
|
|
5
|
+
Home-page: https://github.com/lbugdb/lbug
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://lbugdb.com/
|
|
8
|
+
Project-URL: Documentation, https://docs.ladybugdb.com/
|
|
9
|
+
Project-URL: Repository, https://github.com/lbugdb/lbug
|
|
10
|
+
Project-URL: Changelog, https://github.com/LadybugDB/ladybug/releases
|
|
11
|
+
Keywords: graph,database
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Dynamic: license-file
|
|
15
|
+
|
|
16
|
+
<div align="center">
|
|
17
|
+
<picture>
|
|
18
|
+
<!-- <source srcset="https://ladybugdb.com/img/lbug-logo-dark.png" media="(prefers-color-scheme: dark)"> -->
|
|
19
|
+
<img src="https://ladybugdb.com/logo.png" height="100" alt="Ladybug Logo">
|
|
20
|
+
</picture>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<br>
|
|
24
|
+
|
|
25
|
+
<p align="center">
|
|
26
|
+
<a href="https://github.com/LadybugDB/ladybug/actions">
|
|
27
|
+
<img src="https://github.com/LadybugDB/ladybug/actions/workflows/ci-workflow.yml/badge.svg?branch=master" alt="Github Actions Badge"></a>
|
|
28
|
+
<a href="https://discord.gg/VtX2gw9Rug">
|
|
29
|
+
<img src="https://img.shields.io/discord/1196510116388806837?logo=discord" alt="discord" /></a>
|
|
30
|
+
<a href="https://twitter.com/lbugdb">
|
|
31
|
+
<img src="https://img.shields.io/badge/follow-@lbugdb-1DA1F2?logo=twitter" alt="twitter"></a>
|
|
32
|
+
</p>
|
|
33
|
+
|
|
34
|
+
# Ladybug
|
|
35
|
+
Ladybug is an embedded graph database built for query speed and scalability. Ladybug is optimized for handling complex analytical workloads
|
|
36
|
+
on very large databases and provides a set of retrieval features, such as a full text search and vector indices. Our core feature set includes:
|
|
37
|
+
|
|
38
|
+
- Flexible Property Graph Data Model and Cypher query language
|
|
39
|
+
- Embeddable, serverless integration into applications
|
|
40
|
+
- Native full text search and vector index
|
|
41
|
+
- Columnar disk-based storage
|
|
42
|
+
- Columnar sparse row-based (CSR) adjacency list/join indices
|
|
43
|
+
- Vectorized and factorized query processor
|
|
44
|
+
- Novel and very fast join algorithms
|
|
45
|
+
- Multi-core query parallelism
|
|
46
|
+
- Serializable ACID transactions
|
|
47
|
+
- Wasm (WebAssembly) bindings for fast, secure execution in the browser
|
|
48
|
+
|
|
49
|
+
Ladybug is being developed by [LadybugDB Developers](https://github.com/LadybugDB) and
|
|
50
|
+
is available under a permissible license. So try it out and help us make it better! We welcome your feedback and feature requests.
|
|
51
|
+
|
|
52
|
+
The database was formerly known as [Kuzu](https://github.com/kuzudb/kuzu).
|
|
53
|
+
|
|
54
|
+
## Installation
|
|
55
|
+
|
|
56
|
+
> [!WARNING]
|
|
57
|
+
> Many of these binary installation methods are not functional yet. We need to work through package names, availability and convention issues.
|
|
58
|
+
> For now, use the build from source method.
|
|
59
|
+
|
|
60
|
+
| Language | Installation |
|
|
61
|
+
| -------- |------------------------------------------------------------------------|
|
|
62
|
+
| Python | `pip install lbug` |
|
|
63
|
+
| NodeJS | `npm install lbug` |
|
|
64
|
+
| Rust | `cargo add lbug` |
|
|
65
|
+
| Go | `go get github.com/lbugdb/go-lbug` |
|
|
66
|
+
| Swift | [lbug-swift](https://github.com/lbugdb/lbug-swift) |
|
|
67
|
+
| Java | [Maven Central](https://central.sonatype.com/artifact/com.lbugdb/lbug) |
|
|
68
|
+
| C/C++ | [precompiled binaries](https://github.com/LadybugDB/ladybug/releases/latest) |
|
|
69
|
+
| CLI | [precompiled binaries](https://github.com/LadybugDB/ladybug/releases/latest) |
|
|
70
|
+
|
|
71
|
+
To learn more about installation, see our [Installation](https://docs.ladybugdb.com/installation) page.
|
|
72
|
+
|
|
73
|
+
## Getting Started
|
|
74
|
+
|
|
75
|
+
Refer to our [Getting Started](https://docs.ladybugdb.com/get-started/) page for your first example.
|
|
76
|
+
|
|
77
|
+
## Build from Source
|
|
78
|
+
|
|
79
|
+
You can build from source using the instructions provided in the [developer guide](https://kuzudb.github.io/docs/developer-guide/).
|
|
80
|
+
|
|
81
|
+
## Contributing
|
|
82
|
+
We welcome contributions to Ladybug. If you are interested in contributing to Ladybug, please read our [Contributing Guide](CONTRIBUTING.md).
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
By contributing to Ladybug, you agree that your contributions will be licensed under the [MIT License](LICENSE).
|
|
86
|
+
|
|
87
|
+
## Contact
|
|
88
|
+
You can contact us at [social@ladybugdb.com](mailto:social@ladybugdb.com) or [join our Discord community](https://discord.com/invite/hXyHmvW3Vy).
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
real_ladybug/__init__.py,sha256=lcW8k4wxuQisQ7in7YRy8B60JoevKfThSBwAlp3kT-8,2244
|
|
2
|
+
real_ladybug/_lbug.cp312-win_amd64.pyd,sha256=bfIZdP_5_oBSWlIIJoXNz8apkfPgbxpuoe4fi7ExLOA,12823040
|
|
3
|
+
real_ladybug/_lbug.exp,sha256=5oJeeOMaNc9CG6oHY8atT0oUxswmiG6N8STL59oqslo,1113740
|
|
4
|
+
real_ladybug/_lbug.lib,sha256=pKlf-7jIsOCGaAPpSPsDW3ujG8fh97Vj98cjcJEuvKo,1874300
|
|
5
|
+
real_ladybug/async_connection.py,sha256=_64aLqmE9MkMAOy7qh99WY5urYbSDZcsLesqlVFiyUs,7465
|
|
6
|
+
real_ladybug/connection.py,sha256=IrPjgz1odgsS4dlFZign9ccU6AQHT96bwDoZqxYJW_I,10379
|
|
7
|
+
real_ladybug/constants.py,sha256=IzrMthj1ekgloHGqaI_F-hGLLUK8vHbUvH59Cl7YxJE,133
|
|
8
|
+
real_ladybug/database.py,sha256=cuNAR3kyiS4HRUtElh-MdceWmpsF7Kuj2McOLWjen4c,11156
|
|
9
|
+
real_ladybug/prepared_statement.py,sha256=5m_ZZ5Sdqpo-SxnG6RZEsxIu3hfXxl-ave06OSGXz7E,1397
|
|
10
|
+
real_ladybug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
+
real_ladybug/query_result.py,sha256=VCe4JVT5vvnFoqZSJ-qsRk8aylH7Nd1lYuJXiJ_Ql_A,16690
|
|
12
|
+
real_ladybug/torch_geometric_feature_store.py,sha256=ek_R6bLi8u8vM8lL-qn-qS5cDak_2AhxwtYLFnUzjjM,7586
|
|
13
|
+
real_ladybug/torch_geometric_graph_store.py,sha256=8IdZy_D3Pc9le_rJo1cn_hBqqmRZNHeWc8fV1mMcwQs,4893
|
|
14
|
+
real_ladybug/torch_geometric_result_converter.py,sha256=L1KG9DnfgrMVpRIvU80Jzry1FahP6cCBMlxZroBk2CA,13476
|
|
15
|
+
real_ladybug/types.py,sha256=T5i3eO5Gj4vRo0g2U3FJD1mSZXLoV37gXHQGaCxMEmU,839
|
|
16
|
+
real_ladybug-0.0.1.dev1.dist-info/licenses/LICENSE,sha256=x6ySSxUOwYqdnHE2qM1TO8-jMQnqe0t3EuqVKiRRhrA,1072
|
|
17
|
+
real_ladybug-source/scripts/collect-extensions.py,sha256=jdV2KPAS8TYg2tJTcJWla1QeIGQihmVS21C5JusGtDM,2182
|
|
18
|
+
real_ladybug-source/scripts/collect-single-file-header.py,sha256=fP92v5MUrHBeIX20ollI8Hhjt2Qe0iDcvQqPzt2UNW0,4677
|
|
19
|
+
real_ladybug-source/scripts/export-dbs.py,sha256=YPOz4ST80_-YEQuxedVLu5MXU3qdp3_fqVmNHsesYwc,3331
|
|
20
|
+
real_ladybug-source/scripts/export-import-test.py,sha256=BF0Mk3EN66D4FlzNHLbtjhFLvx3zLX9u2OafQjjbG9g,11624
|
|
21
|
+
real_ladybug-source/scripts/generate-tinysnb.py,sha256=5hhO8nwqf7hRGRR80y9chvLA0iI9STG4Co7GZNAO-Ag,1023
|
|
22
|
+
real_ladybug-source/scripts/get-clangd-diagnostics.py,sha256=qh-S0mn27yMvXGU4MJ92GY3nn6rd3GoJya8etEx1n9s,6998
|
|
23
|
+
real_ladybug-source/scripts/migrate-lbug-db.py,sha256=UnNMEtVTXwFVinW53YWuDYIANcbmtcqNoTwyAvIee7E,11513
|
|
24
|
+
real_ladybug-source/scripts/run-clang-format.py,sha256=qKr6YxDuFSPRvl86PMEjmkc72_CMIwFDZAMR-DcUd5Q,12359
|
|
25
|
+
real_ladybug-source/scripts/setup-extension-repo.py,sha256=jsDvrulaGJRmP2VJm4yjlnEzKQFoD2BtIFldEhNtEJ0,2141
|
|
26
|
+
real_ladybug-source/scripts/test-simsimd-dispatch.py,sha256=uakf0oSCcmVBO0mOksY1yTzxQn4qqHOYMu3jCZeJq1o,1438
|
|
27
|
+
real_ladybug-source/scripts/update-nightly-build-version.py,sha256=cbND07czA1sSi0ikpXATQ-KGy8orCxhcB-SrpbToeh0,3615
|
|
28
|
+
real_ladybug-source/scripts/antlr4/hash.py,sha256=ExtbZ7b3_3ZKAu0oct_q8LowcaqfYNn3oRknfSBY8Jo,126
|
|
29
|
+
real_ladybug-source/scripts/antlr4/keywordhandler.py,sha256=xxbGSflUnI-yYJ78MY6h94UVddd8oj6KhMJPlxToAXE,1657
|
|
30
|
+
real_ladybug-source/scripts/extension/purge-beta.py,sha256=yx_wu873gG1l9SAtGdge4Jid_oXXc-FXk_4Z9HFxNZQ,948
|
|
31
|
+
real_ladybug-source/scripts/generate-cpp-docs/collect_files.py,sha256=R8HxDCHxw0q1eOQtAzU-YUBy92aOVBFwhUYJikdNW8Q,4738
|
|
32
|
+
real_ladybug-source/scripts/multiplatform-test-helper/collect-results.py,sha256=lhVKdT5zjfJpk29QCsMnF-wWsHjAv7pSABjFlBxmQVA,2254
|
|
33
|
+
real_ladybug-source/scripts/multiplatform-test-helper/notify-discord.py,sha256=WEK8vCzDSF_DpsacRhCMun9E7pkMAqkNmko0FaBicSs,2207
|
|
34
|
+
real_ladybug-source/scripts/pip-package/package_tar.py,sha256=pfmifd4ak6naJ_JVNU4sEIbIuvta_QGMFqhWWbe25j0,3543
|
|
35
|
+
real_ladybug-source/scripts/pip-package/setup.py,sha256=FlAH3RCuWh_4ehcufmKKnXABiHmgR0KFZdiAosd3ju4,5147
|
|
36
|
+
real_ladybug-source/third_party/brotli/scripts/dictionary/step-01-download-rfc.py,sha256=AL67WCT8tszzxfQ-kJ_V_4eS_9cwB_Slj_zIL8kDbCw,375
|
|
37
|
+
real_ladybug-source/third_party/brotli/scripts/dictionary/step-02-rfc-to-bin.py,sha256=-8qEs10jTUa6lTYkWoWhD6o3GztZKN_UA7h0Paq4TJw,882
|
|
38
|
+
real_ladybug-source/third_party/brotli/scripts/dictionary/step-03-validate-bin.py,sha256=Y9xwtVwaxxmt337q_02qTbD1lVl_aUEZYIeZW7alfhY,875
|
|
39
|
+
real_ladybug-source/third_party/brotli/scripts/dictionary/step-04-generate-java-literals.py,sha256=IyBqPr0oG2TyUaBCKO5BE27OGg5fq1q2cn1qDdC8LnY,2214
|
|
40
|
+
real_ladybug-source/third_party/pybind11/tools/codespell_ignore_lines_from_errors.py,sha256=rf-frzFTrUyfZ9PsnJbbhirTRGOaL48gXDhH-ba68e0,1040
|
|
41
|
+
real_ladybug-source/third_party/pybind11/tools/libsize.py,sha256=3MBZDCi0-kdKei_6RcTbmVJgtmT4udB-WIF-mOPLBD4,1031
|
|
42
|
+
real_ladybug-source/third_party/pybind11/tools/make_changelog.py,sha256=nvL4LRhLsDMe7y2U9tvN0s8qCidXVoliW6yd5zAzDB8,1282
|
|
43
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/__init__.py,sha256=lcW8k4wxuQisQ7in7YRy8B60JoevKfThSBwAlp3kT-8,2244
|
|
44
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/async_connection.py,sha256=_64aLqmE9MkMAOy7qh99WY5urYbSDZcsLesqlVFiyUs,7465
|
|
45
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/connection.py,sha256=IrPjgz1odgsS4dlFZign9ccU6AQHT96bwDoZqxYJW_I,10379
|
|
46
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/constants.py,sha256=IzrMthj1ekgloHGqaI_F-hGLLUK8vHbUvH59Cl7YxJE,133
|
|
47
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/database.py,sha256=cuNAR3kyiS4HRUtElh-MdceWmpsF7Kuj2McOLWjen4c,11156
|
|
48
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/prepared_statement.py,sha256=5m_ZZ5Sdqpo-SxnG6RZEsxIu3hfXxl-ave06OSGXz7E,1397
|
|
49
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/query_result.py,sha256=VCe4JVT5vvnFoqZSJ-qsRk8aylH7Nd1lYuJXiJ_Ql_A,16690
|
|
51
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_feature_store.py,sha256=ek_R6bLi8u8vM8lL-qn-qS5cDak_2AhxwtYLFnUzjjM,7586
|
|
52
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_graph_store.py,sha256=8IdZy_D3Pc9le_rJo1cn_hBqqmRZNHeWc8fV1mMcwQs,4893
|
|
53
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_result_converter.py,sha256=L1KG9DnfgrMVpRIvU80Jzry1FahP6cCBMlxZroBk2CA,13476
|
|
54
|
+
real_ladybug-source/tools/python_api/build/real_ladybug/types.py,sha256=T5i3eO5Gj4vRo0g2U3FJD1mSZXLoV37gXHQGaCxMEmU,839
|
|
55
|
+
real_ladybug-source/tools/python_api/src_py/__init__.py,sha256=lcW8k4wxuQisQ7in7YRy8B60JoevKfThSBwAlp3kT-8,2244
|
|
56
|
+
real_ladybug-source/tools/python_api/src_py/async_connection.py,sha256=_64aLqmE9MkMAOy7qh99WY5urYbSDZcsLesqlVFiyUs,7465
|
|
57
|
+
real_ladybug-source/tools/python_api/src_py/connection.py,sha256=IrPjgz1odgsS4dlFZign9ccU6AQHT96bwDoZqxYJW_I,10379
|
|
58
|
+
real_ladybug-source/tools/python_api/src_py/constants.py,sha256=IzrMthj1ekgloHGqaI_F-hGLLUK8vHbUvH59Cl7YxJE,133
|
|
59
|
+
real_ladybug-source/tools/python_api/src_py/database.py,sha256=cuNAR3kyiS4HRUtElh-MdceWmpsF7Kuj2McOLWjen4c,11156
|
|
60
|
+
real_ladybug-source/tools/python_api/src_py/prepared_statement.py,sha256=5m_ZZ5Sdqpo-SxnG6RZEsxIu3hfXxl-ave06OSGXz7E,1397
|
|
61
|
+
real_ladybug-source/tools/python_api/src_py/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
62
|
+
real_ladybug-source/tools/python_api/src_py/query_result.py,sha256=VCe4JVT5vvnFoqZSJ-qsRk8aylH7Nd1lYuJXiJ_Ql_A,16690
|
|
63
|
+
real_ladybug-source/tools/python_api/src_py/torch_geometric_feature_store.py,sha256=ek_R6bLi8u8vM8lL-qn-qS5cDak_2AhxwtYLFnUzjjM,7586
|
|
64
|
+
real_ladybug-source/tools/python_api/src_py/torch_geometric_graph_store.py,sha256=8IdZy_D3Pc9le_rJo1cn_hBqqmRZNHeWc8fV1mMcwQs,4893
|
|
65
|
+
real_ladybug-source/tools/python_api/src_py/torch_geometric_result_converter.py,sha256=L1KG9DnfgrMVpRIvU80Jzry1FahP6cCBMlxZroBk2CA,13476
|
|
66
|
+
real_ladybug-source/tools/python_api/src_py/types.py,sha256=T5i3eO5Gj4vRo0g2U3FJD1mSZXLoV37gXHQGaCxMEmU,839
|
|
67
|
+
real_ladybug-source/tools/python_api/test/conftest.py,sha256=RDVltlqGKLyCdDJ4CxH-qBwxQN86Mui3FwT7mBgOOho,6922
|
|
68
|
+
real_ladybug-source/tools/python_api/test/disabled_test_extension.py,sha256=6eS1J9lzTjM-LBOz-x6qmPaaEjvOy-nhJDm0G-a4xwc,2571
|
|
69
|
+
real_ladybug-source/tools/python_api/test/ground_truth.py,sha256=jEaE0mF5nXiaTmtURURIHjg970hNLtmbQd_b4h6lPWM,14487
|
|
70
|
+
real_ladybug-source/tools/python_api/test/test_arrow.py,sha256=WHTFMCM94t4ATiV5xTy8TTzZu6Jd5zKAhE7Ko_igOqc,25670
|
|
71
|
+
real_ladybug-source/tools/python_api/test/test_async_connection.py,sha256=VNLKkWZuQfoqQu2OmVI4aO57DvKYJAY-lgCF_PLkqrY,5532
|
|
72
|
+
real_ladybug-source/tools/python_api/test/test_blob_parameter.py,sha256=3Ld4_qyfa1_qYs8jHuZV8zjNPA3hQr3ePIz1opLiw0I,4528
|
|
73
|
+
real_ladybug-source/tools/python_api/test/test_connection.py,sha256=hNWWUXbSmnsACIrxUsPQZ97yh4W67z-bEHj90N5cLs0,1477
|
|
74
|
+
real_ladybug-source/tools/python_api/test/test_database.py,sha256=_ewKmTHsVgInyVWOQphvOKxfpsChcjEmmz6j70EyaTU,8985
|
|
75
|
+
real_ladybug-source/tools/python_api/test/test_datatype.py,sha256=DWgfZEFzOpJWKeYfCIFdDErxaVBD2sUHwI3bgGqn51g,12831
|
|
76
|
+
real_ladybug-source/tools/python_api/test/test_df.py,sha256=-__k7KWwQD0Hz1CEP4nGAhSaECODsjl_V6_KHS2Uoyg,20777
|
|
77
|
+
real_ladybug-source/tools/python_api/test/test_dict.py,sha256=FgfRvhUUOIvbXBXMfvp3BYWko_8L2jJA5fIoRCkWgEg,3850
|
|
78
|
+
real_ladybug-source/tools/python_api/test/test_exception.py,sha256=-kZet73Nx5V6wzZM-67MxCbXP7qTSD86KsoIK6BozM4,2066
|
|
79
|
+
real_ladybug-source/tools/python_api/test/test_fsm.py,sha256=ZnLH_MwWqf5JpXocTi1cqAf6hwOqHmK2Zt6EZHm4rIo,9185
|
|
80
|
+
real_ladybug-source/tools/python_api/test/test_get_header.py,sha256=dBr6qQLKnZ2Rs2GfXqgCgDhyzwwvDCR_j33VFQKr92Q,1944
|
|
81
|
+
real_ladybug-source/tools/python_api/test/test_helper.py,sha256=qV4oDZjVTfmhlp2xcye2Dhx1_q3Chtv4f2EMf-wx6IU,222
|
|
82
|
+
real_ladybug-source/tools/python_api/test/test_issue.py,sha256=X3wCoLRFtAN7ktw6oiZS9j26Vk3BNJpLa_hIGZ9kbT8,4810
|
|
83
|
+
real_ladybug-source/tools/python_api/test/test_iteration.py,sha256=wtOB6bFQSUDageDgOtG4sXGP0Py6NUuMP9vVIm3kKp8,2919
|
|
84
|
+
real_ladybug-source/tools/python_api/test/test_networkx.py,sha256=qZewLif-Oz08_SpRQej60i_tXBqyoGgcfKPdTmBaE3s,13608
|
|
85
|
+
real_ladybug-source/tools/python_api/test/test_parameter.py,sha256=strs22Pd8dS14aDsnSnLyaaA8_O9QugeWKaQo2cx1G8,12486
|
|
86
|
+
real_ladybug-source/tools/python_api/test/test_prepared_statement.py,sha256=vINOcbcPvRiRboiqmUFH5lryZZS_hxJQay6BM6kXB2w,4150
|
|
87
|
+
real_ladybug-source/tools/python_api/test/test_query_result.py,sha256=p9Rupb1iMubodsVFUUrBKws7mnCCSCjqYM3ad6nrI7E,1774
|
|
88
|
+
real_ladybug-source/tools/python_api/test/test_query_result_close.py,sha256=85UEZcniJPwhNmrLPU6MTDt2Q5s4UeTioAFw-Kp7PPI,1346
|
|
89
|
+
real_ladybug-source/tools/python_api/test/test_scan_pandas.py,sha256=74XZswgLxZCpNsA9ucZo729Sk9pOEXchMaRaLsLQoKQ,26455
|
|
90
|
+
real_ladybug-source/tools/python_api/test/test_scan_pandas_pyarrow.py,sha256=jW5EbKE1X9nKVl568apZpXeD12cS6XuRezlK-o9L7CE,28486
|
|
91
|
+
real_ladybug-source/tools/python_api/test/test_scan_polars.py,sha256=dVdRF5-RcA-IzTsFYKjEO5LTkKOvXrrKskygzjwoX2E,6595
|
|
92
|
+
real_ladybug-source/tools/python_api/test/test_scan_pyarrow.py,sha256=MnfYCyNlj8hpekstrubDfvFLG9jYPsvClcLNYrKz67o,6652
|
|
93
|
+
real_ladybug-source/tools/python_api/test/test_timeout.py,sha256=PKMEh4OA7g6qeN9F_j5mxDN1kCtSiKGruDGC2ouTW3Q,363
|
|
94
|
+
real_ladybug-source/tools/python_api/test/test_torch_geometric.py,sha256=BrJi8KF9aRerimqn2_NjqmpydG2zo6WHV247B41JVBM,30362
|
|
95
|
+
real_ladybug-source/tools/python_api/test/test_torch_geometric_remote_backend.py,sha256=__w7r1saXPZjiiTQgMSfdS9bH98kSQMY6NUBqbPg31o,4245
|
|
96
|
+
real_ladybug-source/tools/python_api/test/test_udf.py,sha256=ftm35d89YDHmsgPEhVlrzKaQBRgOWUBS3ljq5Zo5Gjg,7065
|
|
97
|
+
real_ladybug-source/tools/python_api/test/test_version.py,sha256=p1t8Gqffh_NcXXgjcBki4rsa-zohh7fE5-ZWUytYw8w,161
|
|
98
|
+
real_ladybug-source/tools/python_api/test/test_wal.py,sha256=C_iVF6MWqvxWrRL3aGcA6FvOVamy5Xw8jn9WyFMa-is,2896
|
|
99
|
+
real_ladybug-source/tools/python_api/test/type_aliases.py,sha256=CujWOXsU6nuone3YXiKhSdJxyxdQ1QVpvdxwMX4l_YU,223
|
|
100
|
+
real_ladybug-source/tools/rust_api/update_version.py,sha256=du_9SWrPKUEQb0MtDqc304D6uVgn90_Mbu4CIThE6aM,1730
|
|
101
|
+
real_ladybug-source/tools/shell/test/conftest.py,sha256=B1GqWctbDe6WMGE1NF10_zXCbz2b5ruQ4vcqmrhy10Q,5922
|
|
102
|
+
real_ladybug-source/tools/shell/test/test_helper.py,sha256=r05MnCzdWgXg1JO0NVifxyimzKxIlT2LU_62xfEC6iA,1393
|
|
103
|
+
real_ladybug-source/tools/shell/test/test_shell_basics.py,sha256=mmj-4ZrW7JWll15LbTCblFTf7ERKGzDZLpYfne0aScM,10657
|
|
104
|
+
real_ladybug-source/tools/shell/test/test_shell_commands.py,sha256=fTpeA6UYNVsGmmjuPOqcbbPFj6bdpYGvpJGNTpvPjbc,20897
|
|
105
|
+
real_ladybug-source/tools/shell/test/test_shell_control_edit.py,sha256=wo5iG9jtQPG2ld9iB87gW2OHud5LcDo4R5abln-TwFg,15220
|
|
106
|
+
real_ladybug-source/tools/shell/test/test_shell_control_search.py,sha256=oDVwX7dTYa0ysdDXzIqQB1G1C9BV26J-oDcW8QNlepo,15720
|
|
107
|
+
real_ladybug-source/tools/shell/test/test_shell_esc_edit.py,sha256=3Yp1jWcX3phWstXkVhfQy7FimTLql7MyAfXKmqvrWO4,7782
|
|
108
|
+
real_ladybug-source/tools/shell/test/test_shell_esc_search.py,sha256=QiI2cukOvSkTaA_5tmOJyVKD0FJre1YwTKKPl-3PD2k,5178
|
|
109
|
+
real_ladybug-source/tools/shell/test/test_shell_flags.py,sha256=Kn-sHCmX1yYsm6iz1XTHZOVm-DlcILV7n71ssWUwnTs,19260
|
|
110
|
+
real_ladybug-0.0.1.dev1.dist-info/METADATA,sha256=WPRVJwjAUWngEOpOIjEIXWxT44xkOUbk7SyryVH9jMk,4354
|
|
111
|
+
real_ladybug-0.0.1.dev1.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
|
|
112
|
+
real_ladybug-0.0.1.dev1.dist-info/top_level.txt,sha256=Fq0NCaorEle-ou_gKf_XFBxTgxTnQ5BSmW8u30gdzZM,39
|
|
113
|
+
real_ladybug-0.0.1.dev1.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
|
|
114
|
+
real_ladybug-0.0.1.dev1.dist-info/RECORD,,
|