cbrkit 0.23.0__tar.gz → 0.23.2__tar.gz

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.
Files changed (75) hide show
  1. {cbrkit-0.23.0/src/cbrkit.egg-info → cbrkit-0.23.2}/PKG-INFO +6 -4
  2. {cbrkit-0.23.0 → cbrkit-0.23.2}/pyproject.toml +5 -4
  3. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/model/graph.py +44 -0
  4. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/retrieval/build.py +16 -5
  5. {cbrkit-0.23.0 → cbrkit-0.23.2/src/cbrkit.egg-info}/PKG-INFO +6 -4
  6. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit.egg-info/requires.txt +6 -3
  7. {cbrkit-0.23.0 → cbrkit-0.23.2}/tests/test_retrieve.py +1 -0
  8. {cbrkit-0.23.0 → cbrkit-0.23.2}/LICENSE +0 -0
  9. {cbrkit-0.23.0 → cbrkit-0.23.2}/README.md +0 -0
  10. {cbrkit-0.23.0 → cbrkit-0.23.2}/setup.cfg +0 -0
  11. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/__init__.py +0 -0
  12. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/__main__.py +0 -0
  13. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/adapt/__init__.py +0 -0
  14. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/adapt/attribute_value.py +0 -0
  15. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/adapt/generic.py +0 -0
  16. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/adapt/numbers.py +0 -0
  17. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/adapt/strings.py +0 -0
  18. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/api.py +0 -0
  19. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/cli.py +0 -0
  20. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/constants.py +0 -0
  21. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/cycle.py +0 -0
  22. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/dumpers.py +0 -0
  23. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/eval/__init__.py +0 -0
  24. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/eval/common.py +0 -0
  25. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/eval/retrieval.py +0 -0
  26. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/helpers.py +0 -0
  27. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/loaders.py +0 -0
  28. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/model/__init__.py +0 -0
  29. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/model/result.py +0 -0
  30. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/py.typed +0 -0
  31. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/retrieval/__init__.py +0 -0
  32. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/retrieval/apply.py +0 -0
  33. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/retrieval/rerank.py +0 -0
  34. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/reuse/__init__.py +0 -0
  35. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/reuse/apply.py +0 -0
  36. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/reuse/build.py +0 -0
  37. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/__init__.py +0 -0
  38. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/aggregator.py +0 -0
  39. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/attribute_value.py +0 -0
  40. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/collections.py +0 -0
  41. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/embed.py +0 -0
  42. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/generic.py +0 -0
  43. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/graphs/__init__.py +0 -0
  44. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/graphs/alignment.py +0 -0
  45. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/graphs/astar.py +0 -0
  46. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/graphs/brute_force.py +0 -0
  47. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/graphs/common.py +0 -0
  48. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/graphs/isomorphism.py +0 -0
  49. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/graphs/precompute.py +0 -0
  50. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/numbers.py +0 -0
  51. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/strings.py +0 -0
  52. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/taxonomy.py +0 -0
  53. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/sim/wrappers.py +0 -0
  54. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/__init__.py +0 -0
  55. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/apply.py +0 -0
  56. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/build.py +0 -0
  57. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/model.py +0 -0
  58. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/prompts.py +0 -0
  59. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/__init__.py +0 -0
  60. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/anthropic.py +0 -0
  61. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/cohere.py +0 -0
  62. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/google.py +0 -0
  63. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/instructor.py +0 -0
  64. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/model.py +0 -0
  65. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/ollama.py +0 -0
  66. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/openai.py +0 -0
  67. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/synthesis/providers/wrappers.py +0 -0
  68. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit/typing.py +0 -0
  69. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit.egg-info/SOURCES.txt +0 -0
  70. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit.egg-info/dependency_links.txt +0 -0
  71. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit.egg-info/entry_points.txt +0 -0
  72. {cbrkit-0.23.0 → cbrkit-0.23.2}/src/cbrkit.egg-info/top_level.txt +0 -0
  73. {cbrkit-0.23.0 → cbrkit-0.23.2}/tests/test_cycle.py +0 -0
  74. {cbrkit-0.23.0 → cbrkit-0.23.2}/tests/test_graph.py +0 -0
  75. {cbrkit-0.23.0 → cbrkit-0.23.2}/tests/test_reuse.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cbrkit
3
- Version: 0.23.0
3
+ Version: 0.23.2
4
4
  Summary: Customizable Case-Based Reasoning (CBR) toolkit for Python with a built-in API and CLI
5
5
  Author-email: Mirko Lenz <mirko@mirkolenz.com>
6
6
  Project-URL: Repository, https://github.com/wi2trier/cbrkit
@@ -35,12 +35,12 @@ Requires-Dist: pandas<3,>=2
35
35
  Requires-Dist: polars<2,>=1
36
36
  Requires-Dist: pydantic<3,>=2
37
37
  Requires-Dist: pyyaml<7,>=6
38
- Requires-Dist: rich<14,>=13
38
+ Requires-Dist: rich<15,>=13
39
39
  Requires-Dist: rtoml<1,>=0.12
40
40
  Requires-Dist: scipy<2,>=1
41
41
  Requires-Dist: xmltodict<1,>=0.13
42
42
  Provides-Extra: all
43
- Requires-Dist: cbrkit[api,cli,eval,graphs,llm,nlp,timeseries,transformers]; extra == "all"
43
+ Requires-Dist: cbrkit[api,cli,eval,graphs,graphviz,llm,nlp,timeseries,transformers]; extra == "all"
44
44
  Provides-Extra: api
45
45
  Requires-Dist: cbrkit[cli]; extra == "api"
46
46
  Requires-Dist: fastapi<1,>=0.100; extra == "api"
@@ -54,6 +54,8 @@ Requires-Dist: ranx<1,>=0.3; extra == "eval"
54
54
  Provides-Extra: graphs
55
55
  Requires-Dist: networkx<4,>=3; extra == "graphs"
56
56
  Requires-Dist: rustworkx<1,>=0.15; extra == "graphs"
57
+ Provides-Extra: graphviz
58
+ Requires-Dist: pygraphviz<2,>=1; extra == "graphviz"
57
59
  Provides-Extra: llm
58
60
  Requires-Dist: cohere<6,>=5; extra == "llm"
59
61
  Requires-Dist: voyageai<1,>=0.3; extra == "llm"
@@ -72,7 +74,7 @@ Requires-Dist: spacy<4,>=3.8; ((sys_platform == "darwin" and platform_machine ==
72
74
  Provides-Extra: timeseries
73
75
  Requires-Dist: minineedle<4,>=3; extra == "timeseries"
74
76
  Provides-Extra: transformers
75
- Requires-Dist: sentence-transformers<4,>=3; extra == "transformers"
77
+ Requires-Dist: sentence-transformers<5,>=3; extra == "transformers"
76
78
  Requires-Dist: torch<2.3,>=2.2; (sys_platform == "darwin" and platform_machine == "x86_64") and extra == "transformers"
77
79
  Requires-Dist: torch<3,>=2.5; ((sys_platform == "darwin" and platform_machine == "arm64") or sys_platform == "linux") and extra == "transformers"
78
80
  Requires-Dist: transformers<5,>=4; extra == "transformers"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cbrkit"
3
- version = "0.23.0"
3
+ version = "0.23.2"
4
4
  description = "Customizable Case-Based Reasoning (CBR) toolkit for Python with a built-in API and CLI"
5
5
  authors = [{ name = "Mirko Lenz", email = "mirko@mirkolenz.com" }]
6
6
  readme = "README.md"
@@ -43,14 +43,14 @@ dependencies = [
43
43
  "polars>=1,<2",
44
44
  "pydantic>=2,<3",
45
45
  "pyyaml>=6,<7",
46
- "rich>=13,<14",
46
+ "rich>=13,<15",
47
47
  "rtoml>=0.12,<1",
48
48
  "scipy>=1,<2",
49
49
  "xmltodict>=0.13,<1",
50
50
  ]
51
51
 
52
52
  [project.optional-dependencies]
53
- all = ["cbrkit[api,cli,eval,graphs,llm,nlp,timeseries,transformers]"]
53
+ all = ["cbrkit[api,cli,eval,graphs,graphviz,llm,nlp,timeseries,transformers]"]
54
54
  api = [
55
55
  "cbrkit[cli]",
56
56
  "fastapi>=0.100,<1",
@@ -61,6 +61,7 @@ api = [
61
61
  cli = ["typer>=0.9,<1"]
62
62
  eval = ["ranx>=0.3,<1"]
63
63
  graphs = ["networkx>=3,<4", "rustworkx>=0.15,<1"]
64
+ graphviz = ["pygraphviz>=1,<2"]
64
65
  llm = [
65
66
  "cohere>=5,<6",
66
67
  "voyageai>=0.3,<1",
@@ -80,7 +81,7 @@ nlp = [
80
81
  ]
81
82
  timeseries = ["minineedle>=3,<4"]
82
83
  transformers = [
83
- "sentence-transformers>=3,<4",
84
+ "sentence-transformers>=3,<5",
84
85
  "torch>=2.2,<2.3; sys_platform == 'darwin' and platform_machine == 'x86_64'",
85
86
  "torch>=2.5,<3; (sys_platform == 'darwin' and platform_machine == 'arm64') or sys_platform == 'linux'",
86
87
  "transformers>=4,<5",
@@ -26,6 +26,7 @@ __all__ = [
26
26
  "from_networkx",
27
27
  "to_networkx",
28
28
  "to_sequence",
29
+ "to_graphviz",
29
30
  ]
30
31
 
31
32
  type GraphElementType = Literal["node", "edge"]
@@ -359,3 +360,46 @@ with optional_dependencies():
359
360
  )
360
361
 
361
362
  return Graph(nodes=nodes, edges=edges, value=g.graph)
363
+
364
+
365
+ with optional_dependencies():
366
+ from pygraphviz import AGraph
367
+
368
+ def to_graphviz[N, E, G](
369
+ g: Graph[Any, N, E, G],
370
+ name: str,
371
+ strict: bool,
372
+ directed: bool,
373
+ node_converter: ConversionFunc[N, Mapping[str, str]] | None = None,
374
+ edge_converter: ConversionFunc[E, Mapping[str, str]] | None = None,
375
+ graph_converter: ConversionFunc[G, Mapping[str, str]] | None = None,
376
+ node_attr: Mapping[str, str] | None = None,
377
+ edge_attr: Mapping[str, str] | None = None,
378
+ graph_attr: Mapping[str, str] | None = None,
379
+ ) -> AGraph:
380
+ gv = AGraph(
381
+ name=name,
382
+ strict=strict,
383
+ directed=directed,
384
+ )
385
+ gv.graph_attr.update(graph_attr or {})
386
+ gv.node_attr.update(node_attr or {})
387
+ gv.edge_attr.update(edge_attr or {})
388
+
389
+ if node_converter is not None:
390
+ for node in g.nodes.values():
391
+ gv.add_node(node.key, **node_converter(node.value))
392
+
393
+ if edge_converter is not None:
394
+ for edge in g.edges.values():
395
+ gv.add_edge(
396
+ edge.source.key,
397
+ edge.target.key,
398
+ key=edge.key,
399
+ **edge_converter(edge.value),
400
+ )
401
+
402
+ if graph_converter is not None:
403
+ gv.graph_attr.update(graph_converter(g.value))
404
+
405
+ return gv
@@ -11,6 +11,7 @@ from ..helpers import (
11
11
  get_value,
12
12
  mp_count,
13
13
  mp_map,
14
+ mp_starmap,
14
15
  sim_map2ranking,
15
16
  unpack_float,
16
17
  use_mp,
@@ -154,20 +155,30 @@ class build[K, V, S: Float](RetrieverFunc[K, V, S]):
154
155
  multiprocessing: Pool | int | bool = False
155
156
  chunksize: int | None = None
156
157
 
158
+ def __call_single__(self, x: Casebase[K, V], y: V) -> SimMap[K, S]:
159
+ sim_func = batchify_sim(self.similarity_func)
160
+ flat_batches = [(x, y) for x in x.values()]
161
+ flat_sims: Sequence[S] = sim_func(flat_batches)
162
+
163
+ return {key: sim for key, sim in zip(x.keys(), flat_sims, strict=True)}
164
+
157
165
  @override
158
166
  def __call__(
159
167
  self, batches: Sequence[tuple[Casebase[K, V], V]]
160
168
  ) -> Sequence[SimMap[K, S]]:
169
+ if self.chunksize is None:
170
+ return mp_starmap(
171
+ self.__call_single__, batches, self.multiprocessing, logger
172
+ )
173
+
161
174
  sim_func = batchify_sim(self.similarity_func)
162
- similarities: list[dict[K, S]] = []
175
+ similarities: list[dict[K, S]] = [{} for _ in range(len(batches))]
163
176
 
164
177
  flat_sims: Sequence[S] = []
165
178
  flat_batches_index: list[tuple[int, K]] = []
166
179
  flat_batches: list[tuple[V, V]] = []
167
180
 
168
181
  for idx, (casebase, query) in enumerate(batches):
169
- similarities.append({})
170
-
171
182
  for key, case in casebase.items():
172
183
  flat_batches_index.append((idx, key))
173
184
  flat_batches.append((case, query))
@@ -176,8 +187,8 @@ class build[K, V, S: Float](RetrieverFunc[K, V, S]):
176
187
  chunksize = self.chunksize or math.ceil(
177
188
  len(flat_batches) / mp_count(self.multiprocessing)
178
189
  )
179
- pair_chunks = list(chunkify(flat_batches, chunksize))
180
- sim_chunks = mp_map(sim_func, pair_chunks, self.multiprocessing, logger)
190
+ batch_chunks = list(chunkify(flat_batches, chunksize))
191
+ sim_chunks = mp_map(sim_func, batch_chunks, self.multiprocessing, logger)
181
192
 
182
193
  for sim_chunk in sim_chunks:
183
194
  flat_sims.extend(sim_chunk)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cbrkit
3
- Version: 0.23.0
3
+ Version: 0.23.2
4
4
  Summary: Customizable Case-Based Reasoning (CBR) toolkit for Python with a built-in API and CLI
5
5
  Author-email: Mirko Lenz <mirko@mirkolenz.com>
6
6
  Project-URL: Repository, https://github.com/wi2trier/cbrkit
@@ -35,12 +35,12 @@ Requires-Dist: pandas<3,>=2
35
35
  Requires-Dist: polars<2,>=1
36
36
  Requires-Dist: pydantic<3,>=2
37
37
  Requires-Dist: pyyaml<7,>=6
38
- Requires-Dist: rich<14,>=13
38
+ Requires-Dist: rich<15,>=13
39
39
  Requires-Dist: rtoml<1,>=0.12
40
40
  Requires-Dist: scipy<2,>=1
41
41
  Requires-Dist: xmltodict<1,>=0.13
42
42
  Provides-Extra: all
43
- Requires-Dist: cbrkit[api,cli,eval,graphs,llm,nlp,timeseries,transformers]; extra == "all"
43
+ Requires-Dist: cbrkit[api,cli,eval,graphs,graphviz,llm,nlp,timeseries,transformers]; extra == "all"
44
44
  Provides-Extra: api
45
45
  Requires-Dist: cbrkit[cli]; extra == "api"
46
46
  Requires-Dist: fastapi<1,>=0.100; extra == "api"
@@ -54,6 +54,8 @@ Requires-Dist: ranx<1,>=0.3; extra == "eval"
54
54
  Provides-Extra: graphs
55
55
  Requires-Dist: networkx<4,>=3; extra == "graphs"
56
56
  Requires-Dist: rustworkx<1,>=0.15; extra == "graphs"
57
+ Provides-Extra: graphviz
58
+ Requires-Dist: pygraphviz<2,>=1; extra == "graphviz"
57
59
  Provides-Extra: llm
58
60
  Requires-Dist: cohere<6,>=5; extra == "llm"
59
61
  Requires-Dist: voyageai<1,>=0.3; extra == "llm"
@@ -72,7 +74,7 @@ Requires-Dist: spacy<4,>=3.8; ((sys_platform == "darwin" and platform_machine ==
72
74
  Provides-Extra: timeseries
73
75
  Requires-Dist: minineedle<4,>=3; extra == "timeseries"
74
76
  Provides-Extra: transformers
75
- Requires-Dist: sentence-transformers<4,>=3; extra == "transformers"
77
+ Requires-Dist: sentence-transformers<5,>=3; extra == "transformers"
76
78
  Requires-Dist: torch<2.3,>=2.2; (sys_platform == "darwin" and platform_machine == "x86_64") and extra == "transformers"
77
79
  Requires-Dist: torch<3,>=2.5; ((sys_platform == "darwin" and platform_machine == "arm64") or sys_platform == "linux") and extra == "transformers"
78
80
  Requires-Dist: transformers<5,>=4; extra == "transformers"
@@ -4,7 +4,7 @@ pandas<3,>=2
4
4
  polars<2,>=1
5
5
  pydantic<3,>=2
6
6
  pyyaml<7,>=6
7
- rich<14,>=13
7
+ rich<15,>=13
8
8
  rtoml<1,>=0.12
9
9
  scipy<2,>=1
10
10
  xmltodict<1,>=0.13
@@ -16,7 +16,7 @@ numpy<3,>=2
16
16
  numpy<2,>=1
17
17
 
18
18
  [all]
19
- cbrkit[api,cli,eval,graphs,llm,nlp,timeseries,transformers]
19
+ cbrkit[api,cli,eval,graphs,graphviz,llm,nlp,timeseries,transformers]
20
20
 
21
21
  [api]
22
22
  cbrkit[cli]
@@ -35,6 +35,9 @@ ranx<1,>=0.3
35
35
  networkx<4,>=3
36
36
  rustworkx<1,>=0.15
37
37
 
38
+ [graphviz]
39
+ pygraphviz<2,>=1
40
+
38
41
  [llm]
39
42
  cohere<6,>=5
40
43
  voyageai<1,>=0.3
@@ -60,7 +63,7 @@ spacy<3.8,>=3.7
60
63
  minineedle<4,>=3
61
64
 
62
65
  [transformers]
63
- sentence-transformers<4,>=3
66
+ sentence-transformers<5,>=3
64
67
  transformers<5,>=4
65
68
 
66
69
  [transformers:(sys_platform == "darwin" and platform_machine == "arm64") or sys_platform == "linux"]
@@ -32,6 +32,7 @@ def test_retrieve_multiprocessing():
32
32
  aggregator=cbrkit.sim.aggregator(pooling="mean"),
33
33
  ),
34
34
  multiprocessing=2,
35
+ chunksize=5,
35
36
  )
36
37
  )
37
38
  result = cbrkit.retrieval.apply_query(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes