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.

Files changed (114) hide show
  1. real_ladybug/__init__.py +83 -0
  2. real_ladybug/_lbug.cp312-win_amd64.pyd +0 -0
  3. real_ladybug/_lbug.exp +0 -0
  4. real_ladybug/_lbug.lib +0 -0
  5. real_ladybug/async_connection.py +226 -0
  6. real_ladybug/connection.py +323 -0
  7. real_ladybug/constants.py +7 -0
  8. real_ladybug/database.py +307 -0
  9. real_ladybug/prepared_statement.py +51 -0
  10. real_ladybug/py.typed +0 -0
  11. real_ladybug/query_result.py +511 -0
  12. real_ladybug/torch_geometric_feature_store.py +185 -0
  13. real_ladybug/torch_geometric_graph_store.py +131 -0
  14. real_ladybug/torch_geometric_result_converter.py +282 -0
  15. real_ladybug/types.py +39 -0
  16. real_ladybug-0.0.1.dev1.dist-info/METADATA +88 -0
  17. real_ladybug-0.0.1.dev1.dist-info/RECORD +114 -0
  18. real_ladybug-0.0.1.dev1.dist-info/WHEEL +5 -0
  19. real_ladybug-0.0.1.dev1.dist-info/licenses/LICENSE +21 -0
  20. real_ladybug-0.0.1.dev1.dist-info/top_level.txt +3 -0
  21. real_ladybug-0.0.1.dev1.dist-info/zip-safe +1 -0
  22. real_ladybug-source/scripts/antlr4/hash.py +2 -0
  23. real_ladybug-source/scripts/antlr4/keywordhandler.py +47 -0
  24. real_ladybug-source/scripts/collect-extensions.py +68 -0
  25. real_ladybug-source/scripts/collect-single-file-header.py +126 -0
  26. real_ladybug-source/scripts/export-dbs.py +101 -0
  27. real_ladybug-source/scripts/export-import-test.py +345 -0
  28. real_ladybug-source/scripts/extension/purge-beta.py +34 -0
  29. real_ladybug-source/scripts/generate-cpp-docs/collect_files.py +122 -0
  30. real_ladybug-source/scripts/generate-tinysnb.py +34 -0
  31. real_ladybug-source/scripts/get-clangd-diagnostics.py +233 -0
  32. real_ladybug-source/scripts/migrate-lbug-db.py +308 -0
  33. real_ladybug-source/scripts/multiplatform-test-helper/collect-results.py +71 -0
  34. real_ladybug-source/scripts/multiplatform-test-helper/notify-discord.py +68 -0
  35. real_ladybug-source/scripts/pip-package/package_tar.py +90 -0
  36. real_ladybug-source/scripts/pip-package/setup.py +130 -0
  37. real_ladybug-source/scripts/run-clang-format.py +408 -0
  38. real_ladybug-source/scripts/setup-extension-repo.py +67 -0
  39. real_ladybug-source/scripts/test-simsimd-dispatch.py +45 -0
  40. real_ladybug-source/scripts/update-nightly-build-version.py +81 -0
  41. real_ladybug-source/third_party/brotli/scripts/dictionary/step-01-download-rfc.py +16 -0
  42. real_ladybug-source/third_party/brotli/scripts/dictionary/step-02-rfc-to-bin.py +34 -0
  43. real_ladybug-source/third_party/brotli/scripts/dictionary/step-03-validate-bin.py +35 -0
  44. real_ladybug-source/third_party/brotli/scripts/dictionary/step-04-generate-java-literals.py +85 -0
  45. real_ladybug-source/third_party/pybind11/tools/codespell_ignore_lines_from_errors.py +35 -0
  46. real_ladybug-source/third_party/pybind11/tools/libsize.py +36 -0
  47. real_ladybug-source/third_party/pybind11/tools/make_changelog.py +63 -0
  48. real_ladybug-source/tools/python_api/build/real_ladybug/__init__.py +83 -0
  49. real_ladybug-source/tools/python_api/build/real_ladybug/async_connection.py +226 -0
  50. real_ladybug-source/tools/python_api/build/real_ladybug/connection.py +323 -0
  51. real_ladybug-source/tools/python_api/build/real_ladybug/constants.py +7 -0
  52. real_ladybug-source/tools/python_api/build/real_ladybug/database.py +307 -0
  53. real_ladybug-source/tools/python_api/build/real_ladybug/prepared_statement.py +51 -0
  54. real_ladybug-source/tools/python_api/build/real_ladybug/py.typed +0 -0
  55. real_ladybug-source/tools/python_api/build/real_ladybug/query_result.py +511 -0
  56. real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_feature_store.py +185 -0
  57. real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_graph_store.py +131 -0
  58. real_ladybug-source/tools/python_api/build/real_ladybug/torch_geometric_result_converter.py +282 -0
  59. real_ladybug-source/tools/python_api/build/real_ladybug/types.py +39 -0
  60. real_ladybug-source/tools/python_api/src_py/__init__.py +83 -0
  61. real_ladybug-source/tools/python_api/src_py/async_connection.py +226 -0
  62. real_ladybug-source/tools/python_api/src_py/connection.py +323 -0
  63. real_ladybug-source/tools/python_api/src_py/constants.py +7 -0
  64. real_ladybug-source/tools/python_api/src_py/database.py +307 -0
  65. real_ladybug-source/tools/python_api/src_py/prepared_statement.py +51 -0
  66. real_ladybug-source/tools/python_api/src_py/py.typed +0 -0
  67. real_ladybug-source/tools/python_api/src_py/query_result.py +511 -0
  68. real_ladybug-source/tools/python_api/src_py/torch_geometric_feature_store.py +185 -0
  69. real_ladybug-source/tools/python_api/src_py/torch_geometric_graph_store.py +131 -0
  70. real_ladybug-source/tools/python_api/src_py/torch_geometric_result_converter.py +282 -0
  71. real_ladybug-source/tools/python_api/src_py/types.py +39 -0
  72. real_ladybug-source/tools/python_api/test/conftest.py +230 -0
  73. real_ladybug-source/tools/python_api/test/disabled_test_extension.py +73 -0
  74. real_ladybug-source/tools/python_api/test/ground_truth.py +430 -0
  75. real_ladybug-source/tools/python_api/test/test_arrow.py +694 -0
  76. real_ladybug-source/tools/python_api/test/test_async_connection.py +159 -0
  77. real_ladybug-source/tools/python_api/test/test_blob_parameter.py +145 -0
  78. real_ladybug-source/tools/python_api/test/test_connection.py +49 -0
  79. real_ladybug-source/tools/python_api/test/test_database.py +234 -0
  80. real_ladybug-source/tools/python_api/test/test_datatype.py +372 -0
  81. real_ladybug-source/tools/python_api/test/test_df.py +564 -0
  82. real_ladybug-source/tools/python_api/test/test_dict.py +112 -0
  83. real_ladybug-source/tools/python_api/test/test_exception.py +54 -0
  84. real_ladybug-source/tools/python_api/test/test_fsm.py +227 -0
  85. real_ladybug-source/tools/python_api/test/test_get_header.py +49 -0
  86. real_ladybug-source/tools/python_api/test/test_helper.py +8 -0
  87. real_ladybug-source/tools/python_api/test/test_issue.py +147 -0
  88. real_ladybug-source/tools/python_api/test/test_iteration.py +96 -0
  89. real_ladybug-source/tools/python_api/test/test_networkx.py +437 -0
  90. real_ladybug-source/tools/python_api/test/test_parameter.py +340 -0
  91. real_ladybug-source/tools/python_api/test/test_prepared_statement.py +117 -0
  92. real_ladybug-source/tools/python_api/test/test_query_result.py +54 -0
  93. real_ladybug-source/tools/python_api/test/test_query_result_close.py +44 -0
  94. real_ladybug-source/tools/python_api/test/test_scan_pandas.py +676 -0
  95. real_ladybug-source/tools/python_api/test/test_scan_pandas_pyarrow.py +714 -0
  96. real_ladybug-source/tools/python_api/test/test_scan_polars.py +165 -0
  97. real_ladybug-source/tools/python_api/test/test_scan_pyarrow.py +167 -0
  98. real_ladybug-source/tools/python_api/test/test_timeout.py +11 -0
  99. real_ladybug-source/tools/python_api/test/test_torch_geometric.py +640 -0
  100. real_ladybug-source/tools/python_api/test/test_torch_geometric_remote_backend.py +111 -0
  101. real_ladybug-source/tools/python_api/test/test_udf.py +207 -0
  102. real_ladybug-source/tools/python_api/test/test_version.py +6 -0
  103. real_ladybug-source/tools/python_api/test/test_wal.py +80 -0
  104. real_ladybug-source/tools/python_api/test/type_aliases.py +10 -0
  105. real_ladybug-source/tools/rust_api/update_version.py +47 -0
  106. real_ladybug-source/tools/shell/test/conftest.py +218 -0
  107. real_ladybug-source/tools/shell/test/test_helper.py +60 -0
  108. real_ladybug-source/tools/shell/test/test_shell_basics.py +325 -0
  109. real_ladybug-source/tools/shell/test/test_shell_commands.py +656 -0
  110. real_ladybug-source/tools/shell/test/test_shell_control_edit.py +438 -0
  111. real_ladybug-source/tools/shell/test/test_shell_control_search.py +468 -0
  112. real_ladybug-source/tools/shell/test/test_shell_esc_edit.py +232 -0
  113. real_ladybug-source/tools/shell/test/test_shell_esc_search.py +162 -0
  114. 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,,