algorhino-anemone 0.1.1__py3-none-any.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.
Files changed (82) hide show
  1. algorhino_anemone-0.1.1.dist-info/METADATA +151 -0
  2. algorhino_anemone-0.1.1.dist-info/RECORD +82 -0
  3. algorhino_anemone-0.1.1.dist-info/WHEEL +5 -0
  4. algorhino_anemone-0.1.1.dist-info/licenses/LICENSE +674 -0
  5. algorhino_anemone-0.1.1.dist-info/top_level.txt +1 -0
  6. anemone/__init__.py +27 -0
  7. anemone/basics.py +36 -0
  8. anemone/factory.py +161 -0
  9. anemone/indices/__init__.py +0 -0
  10. anemone/indices/index_manager/__init__.py +12 -0
  11. anemone/indices/index_manager/factory.py +50 -0
  12. anemone/indices/index_manager/node_exploration_manager.py +549 -0
  13. anemone/indices/node_indices/__init__.py +22 -0
  14. anemone/indices/node_indices/factory.py +121 -0
  15. anemone/indices/node_indices/index_data.py +166 -0
  16. anemone/indices/node_indices/index_types.py +20 -0
  17. anemone/nn/torch_evaluator.py +108 -0
  18. anemone/node_evaluation/__init__.py +0 -0
  19. anemone/node_evaluation/node_direct_evaluation/__init__.py +22 -0
  20. anemone/node_evaluation/node_direct_evaluation/factory.py +12 -0
  21. anemone/node_evaluation/node_direct_evaluation/node_direct_evaluator.py +192 -0
  22. anemone/node_evaluation/node_tree_evaluation/node_minmax_evaluation.py +885 -0
  23. anemone/node_evaluation/node_tree_evaluation/node_tree_evaluation.py +137 -0
  24. anemone/node_evaluation/node_tree_evaluation/node_tree_evaluation_factory.py +43 -0
  25. anemone/node_factory/__init__.py +14 -0
  26. anemone/node_factory/algorithm_node_factory.py +123 -0
  27. anemone/node_factory/base.py +76 -0
  28. anemone/node_selector/__init__.py +32 -0
  29. anemone/node_selector/branch_explorer.py +89 -0
  30. anemone/node_selector/factory.py +65 -0
  31. anemone/node_selector/node_selector.py +44 -0
  32. anemone/node_selector/node_selector_args.py +22 -0
  33. anemone/node_selector/node_selector_types.py +15 -0
  34. anemone/node_selector/notations_and_statics.py +88 -0
  35. anemone/node_selector/opening_instructions.py +249 -0
  36. anemone/node_selector/recurzipf/__init__.py +0 -0
  37. anemone/node_selector/recurzipf/recur_zipf_base.py +141 -0
  38. anemone/node_selector/sequool/__init__.py +19 -0
  39. anemone/node_selector/sequool/factory.py +102 -0
  40. anemone/node_selector/sequool/sequool.py +395 -0
  41. anemone/node_selector/uniform/__init__.py +16 -0
  42. anemone/node_selector/uniform/uniform.py +113 -0
  43. anemone/nodes/__init__.py +15 -0
  44. anemone/nodes/algorithm_node/__init__.py +7 -0
  45. anemone/nodes/algorithm_node/algorithm_node.py +204 -0
  46. anemone/nodes/itree_node.py +136 -0
  47. anemone/nodes/tree_node.py +240 -0
  48. anemone/nodes/tree_traversal.py +108 -0
  49. anemone/nodes/utils.py +146 -0
  50. anemone/progress_monitor/__init__.py +0 -0
  51. anemone/progress_monitor/progress_monitor.py +375 -0
  52. anemone/recommender_rule/__init__.py +12 -0
  53. anemone/recommender_rule/recommender_rule.py +140 -0
  54. anemone/search_factory/__init__.py +14 -0
  55. anemone/search_factory/search_factory.py +192 -0
  56. anemone/state_transition.py +47 -0
  57. anemone/tree_and_value_branch_selector.py +99 -0
  58. anemone/tree_exploration.py +274 -0
  59. anemone/tree_manager/__init__.py +29 -0
  60. anemone/tree_manager/algorithm_node_tree_manager.py +246 -0
  61. anemone/tree_manager/factory.py +77 -0
  62. anemone/tree_manager/tree_expander.py +122 -0
  63. anemone/tree_manager/tree_manager.py +254 -0
  64. anemone/trees/__init__.py +14 -0
  65. anemone/trees/descendants.py +765 -0
  66. anemone/trees/factory.py +80 -0
  67. anemone/trees/tree.py +70 -0
  68. anemone/trees/tree_visualization.py +143 -0
  69. anemone/updates/__init__.py +33 -0
  70. anemone/updates/algorithm_node_updater.py +157 -0
  71. anemone/updates/factory.py +36 -0
  72. anemone/updates/index_block.py +91 -0
  73. anemone/updates/index_updater.py +100 -0
  74. anemone/updates/minmax_evaluation_updater.py +108 -0
  75. anemone/updates/updates_file.py +248 -0
  76. anemone/updates/value_block.py +133 -0
  77. anemone/utils/comparable.py +32 -0
  78. anemone/utils/dataclass.py +64 -0
  79. anemone/utils/dict_of_numbered_dict_with_pointer_on_max.py +128 -0
  80. anemone/utils/logger.py +94 -0
  81. anemone/utils/my_value_sorted_dict.py +27 -0
  82. anemone/utils/small_tools.py +103 -0
@@ -0,0 +1,151 @@
1
+ Metadata-Version: 2.4
2
+ Name: algorhino-anemone
3
+ Version: 0.1.1
4
+ Summary: anemone searches trees
5
+ Author-email: Victor Gabillon <victorgabillon@gmail.com>
6
+ License-Expression: GPL-3.0-only
7
+ Project-URL: Homepage, https://github.com/victorgabillon/anemone
8
+ Project-URL: Bug Tracker, https://github.com/victorgabillon/anemone/issues
9
+ Keywords: tree,search
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Operating System :: OS Independent
12
+ Requires-Python: >=3.13
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ Requires-Dist: valanga
16
+ Requires-Dist: atomheart
17
+ Requires-Dist: rich
18
+ Requires-Dist: sortedcollections>=2.1.0
19
+ Requires-Dist: graphviz
20
+ Provides-Extra: test
21
+ Requires-Dist: pytest>=8.4.1; extra == "test"
22
+ Requires-Dist: coverage; extra == "test"
23
+ Requires-Dist: pytest-cov>=6.0.0; extra == "test"
24
+ Provides-Extra: lint
25
+ Requires-Dist: ruff>=0.14.1; extra == "lint"
26
+ Requires-Dist: pylint>=3.3.8; extra == "lint"
27
+ Provides-Extra: typecheck
28
+ Requires-Dist: mypy>=1.18.2; extra == "typecheck"
29
+ Requires-Dist: pyright[nodejs]>=1.1.408; extra == "typecheck"
30
+ Requires-Dist: types-PyYAML>=6.0.12.12; extra == "typecheck"
31
+ Provides-Extra: dev
32
+ Requires-Dist: tox>=4.32.0; extra == "dev"
33
+ Requires-Dist: black>=25.1.0; extra == "dev"
34
+ Requires-Dist: build; extra == "dev"
35
+ Requires-Dist: twine; extra == "dev"
36
+ Requires-Dist: sphinx; extra == "dev"
37
+ Requires-Dist: sphinx-rtd-theme; extra == "dev"
38
+ Requires-Dist: sphinx-autodoc-typehints; extra == "dev"
39
+ Requires-Dist: pre-commit; extra == "dev"
40
+ Provides-Extra: nn
41
+ Requires-Dist: algorhino-coral; extra == "nn"
42
+ Requires-Dist: torch; extra == "nn"
43
+ Dynamic: license-file
44
+
45
+ # anemone
46
+
47
+ `anemone` is a Python library for tree search over `valanga` game states. It builds a
48
+ shared tree graph and layers algorithm-specific wrappers on top so you can plug in
49
+ node evaluation, exploration indices, and selection policies for "tree and value"
50
+ searches.
51
+
52
+ ## Highlights
53
+
54
+ - Tree-and-value exploration pipeline driven by `TreeAndValueBranchSelector`.
55
+ - Modular factories for node evaluation, selection, index computation, and tree
56
+ management.
57
+ - Pluggable stopping criteria and recommender rules for final branch selection.
58
+ - Optional torch-based evaluator for batched neural evaluations.
59
+
60
+ ## Installation
61
+
62
+ ```bash
63
+ pip install anemone
64
+ ```
65
+
66
+ Optional torch integration:
67
+
68
+ ```bash
69
+ pip install anemone[nn]
70
+ ```
71
+
72
+ ## Quick start
73
+
74
+ `anemone` exposes factory helpers to build a branch selector configured with your
75
+ node selector, evaluation, and stopping-criterion choices. At runtime you feed it a
76
+ `valanga` state and a seed to get back a branch recommendation.
77
+
78
+ ```python
79
+ from random import Random
80
+
81
+ from anemone import TreeAndValuePlayerArgs, create_tree_and_value_branch_selector
82
+ from anemone.node_selector.factory import UniformArgs
83
+ from anemone.node_selector.node_selector_types import NodeSelectorType
84
+ from anemone.progress_monitor.progress_monitor import (
85
+ StoppingCriterionTypes,
86
+ TreeMoveLimitArgs,
87
+ )
88
+ from anemone.recommender_rule.recommender_rule import SoftmaxRule
89
+
90
+ # Populate the pieces specific to your game domain.
91
+ args = TreeAndValuePlayerArgs(
92
+ node_selector=UniformArgs(type=NodeSelectorType.UNIFORM),
93
+ opening_type=None,
94
+ stopping_criterion=TreeMoveLimitArgs(
95
+ type=StoppingCriterionTypes.TREE_MOVE_LIMIT,
96
+ tree_move_limit=100,
97
+ ),
98
+ recommender_rule=SoftmaxRule(type="softmax", temperature=1.0),
99
+ )
100
+
101
+ selector = create_tree_and_value_branch_selector(
102
+ state_type=YourStateType,
103
+ args=args,
104
+ random_generator=Random(0),
105
+ master_state_evaluator=your_state_evaluator,
106
+ state_representation_factory=None,
107
+ queue_progress_player=None,
108
+ )
109
+
110
+ recommendation = selector.select_branch(state=current_state, selection_seed=0)
111
+ print(recommendation.branch_key)
112
+ ```
113
+
114
+ ## Design
115
+
116
+ This codebase follows a “core node + wrappers” pattern.
117
+
118
+ - **`TreeNode` (core)**
119
+ - `TreeNode` is the canonical, shared data structure.
120
+ - It stores the graph structure: `branches_children` and `parent_nodes`.
121
+ - There is conceptually a single tree/graph of `TreeNode`s.
122
+
123
+ - **Wrappers implement `ITreeNode`**
124
+ - Higher-level nodes (e.g. `AlgorithmNode`) wrap a `TreeNode` and add algorithm-specific state:
125
+ evaluation, indices, representations, etc.
126
+ - Wrappers expose navigation by delegating to the underlying `TreeNode`.
127
+
128
+ - **Homogeneity at the wrapper level**
129
+ - Even though `TreeNode` is the core place where connections are stored, each wrapper is intended to be
130
+ *closed under parent/child links*:
131
+ - a wrapper’s `branches_children` and `parent_nodes` contain that same wrapper type.
132
+ - today this is typically either “all `TreeNode`” or “all `AlgorithmNode`”.
133
+ - in the future, another wrapper can exist (still implementing `ITreeNode`), and it should also be
134
+ homogeneous within itself.
135
+
136
+ The practical motivation is:
137
+ - algorithms can be written against `ITreeNode` (for navigation) and against wrappers like `AlgorithmNode`
138
+ (for algorithm-specific fields),
139
+ - while keeping a single shared underlying structure that can be accessed consistently from any wrapper.
140
+
141
+ ## Repository layout
142
+
143
+ Each important package folder includes a local README with details. Start with:
144
+
145
+ - `src/anemone/` for the main search pipeline and public entry points.
146
+ - `src/anemone/node_selector/` for selection strategies (Uniform, RecurZipf, Sequool).
147
+ - `src/anemone/node_evaluation/` for direct evaluation and minmax tree evaluation.
148
+ - `src/anemone/tree_manager/`, `src/anemone/trees/`, and `src/anemone/updates/` for tree construction,
149
+ expansion, and backpropagation.
150
+ - `src/anemone/indices/` for exploration index computation and updates.
151
+ - `tests/` for index and tree-building fixtures.
@@ -0,0 +1,82 @@
1
+ algorhino_anemone-0.1.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
2
+ anemone/__init__.py,sha256=iKX9OGJxbyIqe9Fy-xxZY6sdH7WcG4RFyPR0WBai7Ls,942
3
+ anemone/basics.py,sha256=jMKY9mFLbbMZ_xNvtBVlbZI_vP15rg2tUGUf9ZQ-9tw,1023
4
+ anemone/factory.py,sha256=xEE5Nx-I9rs-VyhPHQcGTMKSjbVYKYJCO75s5szLZIg,6544
5
+ anemone/state_transition.py,sha256=fxvHZOYRtWV5ExXRIoehdRg9qV6zhgiE5uiCeOc80Dc,1418
6
+ anemone/tree_and_value_branch_selector.py,sha256=AicjYcI1M_zrNZK4ZzYGcHjyCXGATkXGn6vn5bjdJ6s,4099
7
+ anemone/tree_exploration.py,sha256=718qW-mkHp2-LuMfRLHZoi8Oul_3Aq6kzTr31k_xBII,10881
8
+ anemone/indices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ anemone/indices/index_manager/__init__.py,sha256=P49ofGrnP_Nfmv63Rg_-Zvwn5NFvFFDQ3MD3GMeWNWw,515
10
+ anemone/indices/index_manager/factory.py,sha256=Fti6PTnLOEg0g5cqqRBMsmGGNZw6uVFiKpjv0B766qE,1783
11
+ anemone/indices/index_manager/node_exploration_manager.py,sha256=tcXDgaA7Kne62eOa-RCBTlLx-EYXT-2uTgo0IBNGEbM,21492
12
+ anemone/indices/node_indices/__init__.py,sha256=CHE89gUoI7pPtsnlg5WRUMEiFnFbnLQPy6apu06lVcU,774
13
+ anemone/indices/node_indices/factory.py,sha256=3jQA9Z4RNSD6oX9PlrMppGm7Q0v-CE2zQ2BGjp74Mc0,4045
14
+ anemone/indices/node_indices/index_data.py,sha256=EFa3gktB-EqCtGEPOH-4hDb8t0G6DrFGCJITr-Jlu20,5418
15
+ anemone/indices/node_indices/index_types.py,sha256=L5jaS0piNgwka1ptB6aKjGMIpToNm5Hd2wl0zDoThm8,569
16
+ anemone/nn/torch_evaluator.py,sha256=cXcaldEI5S8JE1Yy9aNUamVEK3DPsPmBmGeUi9611zU,3368
17
+ anemone/node_evaluation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ anemone/node_evaluation/node_direct_evaluation/__init__.py,sha256=2_YwJ3oe0KBfIc3Hs-FLz093RLZsTG-VaNmecLceoiY,898
19
+ anemone/node_evaluation/node_direct_evaluation/factory.py,sha256=lpFmBJkIGAnar5-pQ1vMze9jUFKFchp5Pg2S8eK-ABM,470
20
+ anemone/node_evaluation/node_direct_evaluation/node_direct_evaluator.py,sha256=eHrlyDpwOWpa-7eh8jpWb6-aVoLoDhOLcNJubf40obU,6390
21
+ anemone/node_evaluation/node_tree_evaluation/node_minmax_evaluation.py,sha256=npqy9r7ZKHGMJsDhSY7bZZbRvakwoTyABpwQOVTQ-ww,35126
22
+ anemone/node_evaluation/node_tree_evaluation/node_tree_evaluation.py,sha256=-fiuTO0nWKKiKWAdgFi-L8kKxIjH0A_0yeUKrp4fk34,4260
23
+ anemone/node_evaluation/node_tree_evaluation/node_tree_evaluation_factory.py,sha256=UY1glqflqMOqOPAHhtuzJ8QhGOp55Y9InqdhCMt9KJ8,1279
24
+ anemone/node_factory/__init__.py,sha256=1ijzc7oIpsEMdJQ1jkqfaonhyvPjeyKv0nDe8tCXRAQ,549
25
+ anemone/node_factory/algorithm_node_factory.py,sha256=COu6MiSyW-9M6pDZhJFAuWbp1E-HH9etm90VCoR5r0E,3919
26
+ anemone/node_factory/base.py,sha256=2utUE5s-KbMtzfyiW3BfzTBnH_Qg4H5Oeosw0ERYJRQ,2132
27
+ anemone/node_selector/__init__.py,sha256=DThR5UV-4WZG4PT5Lo0RPv9_P83ixFGfOSFoGihKtuA,1320
28
+ anemone/node_selector/branch_explorer.py,sha256=3ywYkJe2R1Dg5nhmDXCgyhex85bT39Ql7ifRY--9Z_A,2677
29
+ anemone/node_selector/factory.py,sha256=XfTU7M-XiUsxPV3NpGjeiat7Px7Atzk5EMj8D3iV48k,1829
30
+ anemone/node_selector/node_selector.py,sha256=olAyA1_at7VkepZ0hI5S-zfmJAJOVk32XnMKnvHMX7w,1182
31
+ anemone/node_selector/node_selector_args.py,sha256=G0mDPXEOF6oYXqt1176srKrRwDoy31wN8gu9Hzy_8ic,555
32
+ anemone/node_selector/node_selector_types.py,sha256=827M2u8D_yBSdufvV3ufjGtj8r1aw4Xcdb7NXYq_T7M,329
33
+ anemone/node_selector/notations_and_statics.py,sha256=leB0s6yVGeymMWcbbdO5ViDInChLAgGw59-9Ltc3Urw,2653
34
+ anemone/node_selector/opening_instructions.py,sha256=B3ayjIgBjiT-8ZAQVQyYIJH66SBm1DElQoJtwY5h6Xc,8187
35
+ anemone/node_selector/recurzipf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ anemone/node_selector/recurzipf/recur_zipf_base.py,sha256=hdOHAnYQVSlhvuQSGaqHd79j5X8qeJrnzVU_yo8OBCo,5193
37
+ anemone/node_selector/sequool/__init__.py,sha256=k_YXvShw64GNIAWjZqdNPkUsdCMwPI_RSAmv4I2xxuk,485
38
+ anemone/node_selector/sequool/factory.py,sha256=jZqgUs9AR1iU1RI4Jc2OiqYsr_kGnnTabk4WterrtNU,3416
39
+ anemone/node_selector/sequool/sequool.py,sha256=qLwGDTlgC8SgD5BrUvQTpQ5nkfxwop5ceKDcDoiOLPo,12649
40
+ anemone/node_selector/uniform/__init__.py,sha256=fRGC0FL_fnXXeNoj3QeMQmNoESrFfSDaiHp-zHpF_zw,366
41
+ anemone/node_selector/uniform/uniform.py,sha256=9nGsG8NRgAKwYH-VBywUEAO6lDsgPRX84HkFzyB49TU,3710
42
+ anemone/nodes/__init__.py,sha256=yciGi5-PTnXXyuAtf2WfOAkK3_FsFxskfGLjqzHF0zc,384
43
+ anemone/nodes/itree_node.py,sha256=tMmH6fQtXH01DRluyOpRM44n4_1-sndWBKMFsUf-Zt8,3564
44
+ anemone/nodes/tree_node.py,sha256=_n1dHgII40gtRBYiHvB5UDgQykSSsfLGSdb5IX-67Yc,8333
45
+ anemone/nodes/tree_traversal.py,sha256=du_NuWpRX2Qi-9w2WTeos4lEHHj-lrN3yUbdp9tEA2U,3955
46
+ anemone/nodes/utils.py,sha256=KvXQcUcTWx8GvWmhykimgt9m-8WTKoALrnG-3WgNx80,5067
47
+ anemone/nodes/algorithm_node/__init__.py,sha256=8cNk3PmDzd22K78YWiO29Mu5A1FCObzPwEfWE1ym6Jk,116
48
+ anemone/nodes/algorithm_node/algorithm_node.py,sha256=VgUzzouLWO4Pcx3yglAzngF6sJ5VAf3PyZmsm8-tqRU,6501
49
+ anemone/progress_monitor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ anemone/progress_monitor/progress_monitor.py,sha256=oK0gckMoFqQaOrOwybtW58tcBQz7PqkKV0Lu1V-gXpw,10821
51
+ anemone/recommender_rule/__init__.py,sha256=9K73T0bkpvHg0IsQc1OW8QgsUhCNYq9ceqPMkwdqE8c,347
52
+ anemone/recommender_rule/recommender_rule.py,sha256=w6Y83j_LlnBx0iz25_OGFRZ1VnjlUXKZjlQfIjCRu5s,4594
53
+ anemone/search_factory/__init__.py,sha256=ToU88Fa1lBBdf2AYTJ2PNVwWzi5Hzh-78-WOxClVkN4,619
54
+ anemone/search_factory/search_factory.py,sha256=vCkxJk4cs6i6jjrTrUAsRBtp38N84j_uhyvpYIODoG4,6757
55
+ anemone/tree_manager/__init__.py,sha256=D3j8emzRNF1fkPTpNUPsXbqAzMM9SyI3Ty_4Y_b2Tas,962
56
+ anemone/tree_manager/algorithm_node_tree_manager.py,sha256=s4Iojk9u1fsNso_wH5xMYxHmGIFneLmQN9As2bfViT4,8811
57
+ anemone/tree_manager/factory.py,sha256=d10uuf5DtHZ_jKT7Z688Wd3_a7TewwmUywlTeWdUQwc,2679
58
+ anemone/tree_manager/tree_expander.py,sha256=qq_8EvRaVpgzqI4W3jvI8VJyOnknYgxQuz8yv_pUVkE,4285
59
+ anemone/tree_manager/tree_manager.py,sha256=u-4DsgDxu_7uPUTbWYXYLr9_7NGyPJ25bSYXC2RUc-E,8312
60
+ anemone/trees/__init__.py,sha256=FtX6ZDfZI7JDjv6IAgKRVytJmafL3Vod3RF7L-bDTWc,269
61
+ anemone/trees/descendants.py,sha256=KaEyesB1D5Rxpfl-LrH6pcWM0HV5zkv-2_2GQx_bjX0,27429
62
+ anemone/trees/factory.py,sha256=GIZcojZzxl5VG6lEpxxF9PV8VZnS-c18xWxg0dza0r8,2180
63
+ anemone/trees/tree.py,sha256=90ElKy10ev0YRKwyWo0Ck49WA2iqrVQjM44CQdsm8Sg,2201
64
+ anemone/trees/tree_visualization.py,sha256=gLWoADmuy9MumNR4KLbeWvz3YBU2-bfYO8tvB_ih9FQ,4736
65
+ anemone/updates/__init__.py,sha256=YZsQ8c7RcjC8aHTmty5BiEWfo4_D2GDxZ2_BoyjLJnI,1111
66
+ anemone/updates/algorithm_node_updater.py,sha256=zIoqIRhQNcY5P2JoZ_EM_GB5TrCrWZyrGiMLqEuxStM,5865
67
+ anemone/updates/factory.py,sha256=OuN6cHp9KwSL9bbIEoaJgikp_gX4tU7AjWKasbgttGE,1207
68
+ anemone/updates/index_block.py,sha256=3aVUwcVhwHYm1y2FWGULgMqaw_2FhXDpLue_kbDsLxw,3104
69
+ anemone/updates/index_updater.py,sha256=aFxTtVwLfSwl089_4Sxsce8DDD8NERaUOdj_RqyJUSI,3638
70
+ anemone/updates/minmax_evaluation_updater.py,sha256=sABx1CzXArtxFXwN1Rkq042qKUDVBphpJ6oO3WUh1OQ,4058
71
+ anemone/updates/updates_file.py,sha256=QQRWbYmET2KyWyg_8Qq-WC4jR4FPclWPh7vc01kexdM,10092
72
+ anemone/updates/value_block.py,sha256=TSo7RNmlCxrQpjPIKHNRGU9IfzKE3FA5BCptwwOujAs,4667
73
+ anemone/utils/comparable.py,sha256=eTD81347Qv1dkGR4rD0ep2tbbBR2Mk_4JXZkkYTxiNw,945
74
+ anemone/utils/dataclass.py,sha256=X77ilEUTIVUudfISYlm7rq3tptqUwdLBOzLDy-gL6t8,1781
75
+ anemone/utils/dict_of_numbered_dict_with_pointer_on_max.py,sha256=vVbMWtQavI23zYJ4AuletvSaHrLDfOgvmNPTGolWjVk,4154
76
+ anemone/utils/logger.py,sha256=bJQ8COqdn5obtbi8TuokQHmdHpp57XRksTmfvCLLfyM,2973
77
+ anemone/utils/my_value_sorted_dict.py,sha256=LbqtpBSCS7VrUTUChWCsi18IKZj65FkTJREqbl-xSVA,619
78
+ anemone/utils/small_tools.py,sha256=l9dy5Oqvuvg8qQXqJUfyb3uwBHwVGVrKz6WeTHjyLTk,2766
79
+ algorhino_anemone-0.1.1.dist-info/METADATA,sha256=KTyN1GWK_byEBRVXThAN4PTgewAYl5Knu4HwZrMTap0,5669
80
+ algorhino_anemone-0.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
81
+ algorhino_anemone-0.1.1.dist-info/top_level.txt,sha256=G1vbB-vAevQVde3UZ5X1_Ysy1_6sJDEueHRi2qcDgrY,8
82
+ algorhino_anemone-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+