bead 0.1.0__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 (231) hide show
  1. bead/__init__.py +11 -0
  2. bead/__main__.py +11 -0
  3. bead/active_learning/__init__.py +15 -0
  4. bead/active_learning/config.py +231 -0
  5. bead/active_learning/loop.py +566 -0
  6. bead/active_learning/models/__init__.py +24 -0
  7. bead/active_learning/models/base.py +852 -0
  8. bead/active_learning/models/binary.py +910 -0
  9. bead/active_learning/models/categorical.py +943 -0
  10. bead/active_learning/models/cloze.py +862 -0
  11. bead/active_learning/models/forced_choice.py +956 -0
  12. bead/active_learning/models/free_text.py +773 -0
  13. bead/active_learning/models/lora.py +365 -0
  14. bead/active_learning/models/magnitude.py +835 -0
  15. bead/active_learning/models/multi_select.py +795 -0
  16. bead/active_learning/models/ordinal_scale.py +811 -0
  17. bead/active_learning/models/peft_adapter.py +155 -0
  18. bead/active_learning/models/random_effects.py +639 -0
  19. bead/active_learning/selection.py +354 -0
  20. bead/active_learning/strategies.py +391 -0
  21. bead/active_learning/trainers/__init__.py +26 -0
  22. bead/active_learning/trainers/base.py +210 -0
  23. bead/active_learning/trainers/data_collator.py +172 -0
  24. bead/active_learning/trainers/dataset_utils.py +261 -0
  25. bead/active_learning/trainers/huggingface.py +304 -0
  26. bead/active_learning/trainers/lightning.py +324 -0
  27. bead/active_learning/trainers/metrics.py +424 -0
  28. bead/active_learning/trainers/mixed_effects.py +551 -0
  29. bead/active_learning/trainers/model_wrapper.py +509 -0
  30. bead/active_learning/trainers/registry.py +104 -0
  31. bead/adapters/__init__.py +11 -0
  32. bead/adapters/huggingface.py +61 -0
  33. bead/behavioral/__init__.py +116 -0
  34. bead/behavioral/analytics.py +646 -0
  35. bead/behavioral/extraction.py +343 -0
  36. bead/behavioral/merging.py +343 -0
  37. bead/cli/__init__.py +11 -0
  38. bead/cli/active_learning.py +513 -0
  39. bead/cli/active_learning_commands.py +779 -0
  40. bead/cli/completion.py +359 -0
  41. bead/cli/config.py +624 -0
  42. bead/cli/constraint_builders.py +286 -0
  43. bead/cli/deployment.py +859 -0
  44. bead/cli/deployment_trials.py +493 -0
  45. bead/cli/deployment_ui.py +332 -0
  46. bead/cli/display.py +378 -0
  47. bead/cli/items.py +960 -0
  48. bead/cli/items_factories.py +776 -0
  49. bead/cli/list_constraints.py +714 -0
  50. bead/cli/lists.py +490 -0
  51. bead/cli/main.py +430 -0
  52. bead/cli/models.py +877 -0
  53. bead/cli/resource_loaders.py +621 -0
  54. bead/cli/resources.py +1036 -0
  55. bead/cli/shell.py +356 -0
  56. bead/cli/simulate.py +840 -0
  57. bead/cli/templates.py +1158 -0
  58. bead/cli/training.py +1080 -0
  59. bead/cli/utils.py +614 -0
  60. bead/cli/workflow.py +1273 -0
  61. bead/config/__init__.py +68 -0
  62. bead/config/active_learning.py +1009 -0
  63. bead/config/config.py +192 -0
  64. bead/config/defaults.py +118 -0
  65. bead/config/deployment.py +217 -0
  66. bead/config/env.py +147 -0
  67. bead/config/item.py +45 -0
  68. bead/config/list.py +193 -0
  69. bead/config/loader.py +149 -0
  70. bead/config/logging.py +42 -0
  71. bead/config/model.py +49 -0
  72. bead/config/paths.py +46 -0
  73. bead/config/profiles.py +320 -0
  74. bead/config/resources.py +47 -0
  75. bead/config/serialization.py +210 -0
  76. bead/config/simulation.py +206 -0
  77. bead/config/template.py +238 -0
  78. bead/config/validation.py +267 -0
  79. bead/data/__init__.py +65 -0
  80. bead/data/base.py +87 -0
  81. bead/data/identifiers.py +97 -0
  82. bead/data/language_codes.py +61 -0
  83. bead/data/metadata.py +270 -0
  84. bead/data/range.py +123 -0
  85. bead/data/repository.py +358 -0
  86. bead/data/serialization.py +249 -0
  87. bead/data/timestamps.py +89 -0
  88. bead/data/validation.py +349 -0
  89. bead/data_collection/__init__.py +11 -0
  90. bead/data_collection/jatos.py +223 -0
  91. bead/data_collection/merger.py +154 -0
  92. bead/data_collection/prolific.py +198 -0
  93. bead/deployment/__init__.py +5 -0
  94. bead/deployment/distribution.py +402 -0
  95. bead/deployment/jatos/__init__.py +1 -0
  96. bead/deployment/jatos/api.py +200 -0
  97. bead/deployment/jatos/exporter.py +210 -0
  98. bead/deployment/jspsych/__init__.py +9 -0
  99. bead/deployment/jspsych/biome.json +44 -0
  100. bead/deployment/jspsych/config.py +411 -0
  101. bead/deployment/jspsych/generator.py +598 -0
  102. bead/deployment/jspsych/package.json +51 -0
  103. bead/deployment/jspsych/pnpm-lock.yaml +2141 -0
  104. bead/deployment/jspsych/randomizer.py +299 -0
  105. bead/deployment/jspsych/src/lib/list-distributor.test.ts +327 -0
  106. bead/deployment/jspsych/src/lib/list-distributor.ts +1282 -0
  107. bead/deployment/jspsych/src/lib/randomizer.test.ts +232 -0
  108. bead/deployment/jspsych/src/lib/randomizer.ts +367 -0
  109. bead/deployment/jspsych/src/plugins/cloze-dropdown.ts +252 -0
  110. bead/deployment/jspsych/src/plugins/forced-choice.ts +265 -0
  111. bead/deployment/jspsych/src/plugins/plugins.test.ts +141 -0
  112. bead/deployment/jspsych/src/plugins/rating.ts +248 -0
  113. bead/deployment/jspsych/src/slopit/index.ts +9 -0
  114. bead/deployment/jspsych/src/types/jatos.d.ts +256 -0
  115. bead/deployment/jspsych/src/types/jspsych.d.ts +228 -0
  116. bead/deployment/jspsych/templates/experiment.css +1 -0
  117. bead/deployment/jspsych/templates/experiment.js.template +289 -0
  118. bead/deployment/jspsych/templates/index.html +51 -0
  119. bead/deployment/jspsych/templates/randomizer.js +241 -0
  120. bead/deployment/jspsych/templates/randomizer.js.template +313 -0
  121. bead/deployment/jspsych/trials.py +723 -0
  122. bead/deployment/jspsych/tsconfig.json +23 -0
  123. bead/deployment/jspsych/tsup.config.ts +30 -0
  124. bead/deployment/jspsych/ui/__init__.py +1 -0
  125. bead/deployment/jspsych/ui/components.py +383 -0
  126. bead/deployment/jspsych/ui/styles.py +411 -0
  127. bead/dsl/__init__.py +80 -0
  128. bead/dsl/ast.py +168 -0
  129. bead/dsl/context.py +178 -0
  130. bead/dsl/errors.py +71 -0
  131. bead/dsl/evaluator.py +570 -0
  132. bead/dsl/grammar.lark +81 -0
  133. bead/dsl/parser.py +231 -0
  134. bead/dsl/stdlib.py +929 -0
  135. bead/evaluation/__init__.py +13 -0
  136. bead/evaluation/convergence.py +485 -0
  137. bead/evaluation/interannotator.py +398 -0
  138. bead/items/__init__.py +40 -0
  139. bead/items/adapters/__init__.py +70 -0
  140. bead/items/adapters/anthropic.py +224 -0
  141. bead/items/adapters/api_utils.py +167 -0
  142. bead/items/adapters/base.py +216 -0
  143. bead/items/adapters/google.py +259 -0
  144. bead/items/adapters/huggingface.py +1074 -0
  145. bead/items/adapters/openai.py +323 -0
  146. bead/items/adapters/registry.py +202 -0
  147. bead/items/adapters/sentence_transformers.py +224 -0
  148. bead/items/adapters/togetherai.py +309 -0
  149. bead/items/binary.py +515 -0
  150. bead/items/cache.py +558 -0
  151. bead/items/categorical.py +593 -0
  152. bead/items/cloze.py +757 -0
  153. bead/items/constructor.py +784 -0
  154. bead/items/forced_choice.py +413 -0
  155. bead/items/free_text.py +681 -0
  156. bead/items/generation.py +432 -0
  157. bead/items/item.py +396 -0
  158. bead/items/item_template.py +787 -0
  159. bead/items/magnitude.py +573 -0
  160. bead/items/multi_select.py +621 -0
  161. bead/items/ordinal_scale.py +569 -0
  162. bead/items/scoring.py +448 -0
  163. bead/items/validation.py +723 -0
  164. bead/lists/__init__.py +30 -0
  165. bead/lists/balancer.py +263 -0
  166. bead/lists/constraints.py +1067 -0
  167. bead/lists/experiment_list.py +286 -0
  168. bead/lists/list_collection.py +378 -0
  169. bead/lists/partitioner.py +1141 -0
  170. bead/lists/stratification.py +254 -0
  171. bead/participants/__init__.py +73 -0
  172. bead/participants/collection.py +699 -0
  173. bead/participants/merging.py +312 -0
  174. bead/participants/metadata_spec.py +491 -0
  175. bead/participants/models.py +276 -0
  176. bead/resources/__init__.py +29 -0
  177. bead/resources/adapters/__init__.py +19 -0
  178. bead/resources/adapters/base.py +104 -0
  179. bead/resources/adapters/cache.py +128 -0
  180. bead/resources/adapters/glazing.py +508 -0
  181. bead/resources/adapters/registry.py +117 -0
  182. bead/resources/adapters/unimorph.py +796 -0
  183. bead/resources/classification.py +856 -0
  184. bead/resources/constraint_builders.py +329 -0
  185. bead/resources/constraints.py +165 -0
  186. bead/resources/lexical_item.py +223 -0
  187. bead/resources/lexicon.py +744 -0
  188. bead/resources/loaders.py +209 -0
  189. bead/resources/template.py +441 -0
  190. bead/resources/template_collection.py +707 -0
  191. bead/resources/template_generation.py +349 -0
  192. bead/simulation/__init__.py +29 -0
  193. bead/simulation/annotators/__init__.py +15 -0
  194. bead/simulation/annotators/base.py +175 -0
  195. bead/simulation/annotators/distance_based.py +135 -0
  196. bead/simulation/annotators/lm_based.py +114 -0
  197. bead/simulation/annotators/oracle.py +182 -0
  198. bead/simulation/annotators/random.py +181 -0
  199. bead/simulation/dsl_extension/__init__.py +3 -0
  200. bead/simulation/noise_models/__init__.py +13 -0
  201. bead/simulation/noise_models/base.py +42 -0
  202. bead/simulation/noise_models/random_noise.py +82 -0
  203. bead/simulation/noise_models/systematic.py +132 -0
  204. bead/simulation/noise_models/temperature.py +86 -0
  205. bead/simulation/runner.py +144 -0
  206. bead/simulation/strategies/__init__.py +23 -0
  207. bead/simulation/strategies/base.py +123 -0
  208. bead/simulation/strategies/binary.py +103 -0
  209. bead/simulation/strategies/categorical.py +123 -0
  210. bead/simulation/strategies/cloze.py +224 -0
  211. bead/simulation/strategies/forced_choice.py +127 -0
  212. bead/simulation/strategies/free_text.py +105 -0
  213. bead/simulation/strategies/magnitude.py +116 -0
  214. bead/simulation/strategies/multi_select.py +129 -0
  215. bead/simulation/strategies/ordinal_scale.py +131 -0
  216. bead/templates/__init__.py +27 -0
  217. bead/templates/adapters/__init__.py +17 -0
  218. bead/templates/adapters/base.py +128 -0
  219. bead/templates/adapters/cache.py +178 -0
  220. bead/templates/adapters/huggingface.py +312 -0
  221. bead/templates/combinatorics.py +103 -0
  222. bead/templates/filler.py +605 -0
  223. bead/templates/renderers.py +177 -0
  224. bead/templates/resolver.py +178 -0
  225. bead/templates/strategies.py +1806 -0
  226. bead/templates/streaming.py +195 -0
  227. bead-0.1.0.dist-info/METADATA +212 -0
  228. bead-0.1.0.dist-info/RECORD +231 -0
  229. bead-0.1.0.dist-info/WHEEL +4 -0
  230. bead-0.1.0.dist-info/entry_points.txt +2 -0
  231. bead-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,195 @@
1
+ """Streaming template filling for large combinatorial spaces."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Iterator
6
+
7
+ from bead.data.language_codes import LanguageCode, validate_iso639_code
8
+ from bead.resources.adapters.registry import AdapterRegistry
9
+ from bead.resources.lexical_item import LexicalItem
10
+ from bead.resources.lexicon import Lexicon
11
+ from bead.resources.template import Template
12
+ from bead.templates.combinatorics import cartesian_product
13
+ from bead.templates.filler import FilledTemplate
14
+ from bead.templates.resolver import ConstraintResolver
15
+
16
+
17
+ class StreamingFiller:
18
+ """Fill templates with lazy evaluation.
19
+
20
+ Generate filled templates one at a time without storing
21
+ all combinations in memory. Use for very large combinatorial
22
+ spaces where ExhaustiveStrategy would cause OOM.
23
+
24
+ Parameters
25
+ ----------
26
+ lexicon : Lexicon
27
+ Lexicon containing candidate items.
28
+ adapter_registry : AdapterRegistry | None
29
+ Adapter registry for resource-based constraints.
30
+ max_combinations : int | None
31
+ Maximum combinations to generate. Default: None (unlimited).
32
+
33
+ Examples
34
+ --------
35
+ >>> filler = StreamingFiller(lexicon, max_combinations=1000)
36
+ >>> for filled in filler.stream(template):
37
+ ... process(filled) # process one at a time
38
+ ... if some_condition:
39
+ ... break # can stop early
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ lexicon: Lexicon,
45
+ adapter_registry: AdapterRegistry | None = None,
46
+ max_combinations: int | None = None,
47
+ ) -> None:
48
+ self.lexicon = lexicon
49
+ self.adapter_registry = adapter_registry
50
+ self.max_combinations = max_combinations
51
+
52
+ self.resolver = ConstraintResolver()
53
+
54
+ def stream(
55
+ self,
56
+ template: Template,
57
+ language_code: LanguageCode | None = None,
58
+ ) -> Iterator[FilledTemplate]:
59
+ """Stream filled templates lazily.
60
+
61
+ Generate filled templates one at a time using lazy evaluation.
62
+ Memory-efficient for large combinatorial spaces.
63
+
64
+ Parameters
65
+ ----------
66
+ template : Template
67
+ Template to fill.
68
+ language_code : LanguageCode | None
69
+ Optional language filter.
70
+
71
+ Yields
72
+ ------
73
+ FilledTemplate
74
+ Filled template instances.
75
+
76
+ Raises
77
+ ------
78
+ ValueError
79
+ If any slot has no valid items.
80
+
81
+ Examples
82
+ --------
83
+ >>> for i, filled in enumerate(filler.stream(template)):
84
+ ... if i >= 100:
85
+ ... break # take first 100
86
+ ... print(filled.rendered_text)
87
+ """
88
+ # normalize language code to ISO 639-3 format if provided
89
+ normalized_language_code = validate_iso639_code(language_code)
90
+
91
+ # resolve slot constraints
92
+ slot_items = self._resolve_slot_constraints(template, normalized_language_code)
93
+
94
+ # check for empty slots
95
+ empty_slots = [name for name, items in slot_items.items() if not items]
96
+ if empty_slots:
97
+ raise ValueError(f"No valid items for slots: {empty_slots}")
98
+
99
+ # get ordered slot names and item lists
100
+ slot_names = list(slot_items.keys())
101
+ item_lists = [slot_items[name] for name in slot_names]
102
+
103
+ # stream combinations
104
+ count = 0
105
+ for combo_tuple in cartesian_product(*item_lists):
106
+ if self.max_combinations and count >= self.max_combinations:
107
+ break
108
+
109
+ # create slot_fillers dict
110
+ slot_fillers = dict(zip(slot_names, combo_tuple, strict=True))
111
+
112
+ # render template
113
+ rendered = self._render_template(template, slot_fillers)
114
+
115
+ # create FilledTemplate
116
+ filled = FilledTemplate(
117
+ template_id=str(template.id),
118
+ template_name=template.name,
119
+ slot_fillers=slot_fillers,
120
+ rendered_text=rendered,
121
+ strategy_name="streaming",
122
+ )
123
+
124
+ yield filled
125
+ count += 1
126
+
127
+ def _resolve_slot_constraints(
128
+ self,
129
+ template: Template,
130
+ language_code: LanguageCode | None,
131
+ ) -> dict[str, list[LexicalItem]]:
132
+ """Resolve constraints for each slot.
133
+
134
+ Parameters
135
+ ----------
136
+ template : Template
137
+ Template with slots and constraints.
138
+ language_code : LanguageCode | None
139
+ Optional language filter.
140
+
141
+ Returns
142
+ -------
143
+ dict[str, list[LexicalItem]]
144
+ Mapping of slot names to valid items.
145
+ """
146
+ # normalize language code if provided
147
+ normalized_lang = validate_iso639_code(language_code) if language_code else None
148
+
149
+ slot_items: dict[str, list[LexicalItem]] = {}
150
+ for slot_name, slot in template.slots.items():
151
+ candidates: list[LexicalItem] = []
152
+ for item in self.lexicon.items.values():
153
+ # filter by language code if specified
154
+ if normalized_lang:
155
+ # normalize item language code for comparison
156
+ item_lang = (
157
+ validate_iso639_code(item.language_code)
158
+ if item.language_code
159
+ else None
160
+ )
161
+ if item_lang != normalized_lang:
162
+ continue
163
+
164
+ # check if item satisfies slot constraints
165
+ if self.resolver.evaluate_slot_constraints(item, slot.constraints):
166
+ candidates.append(item)
167
+
168
+ slot_items[slot_name] = candidates
169
+
170
+ return slot_items
171
+
172
+ def _render_template(
173
+ self,
174
+ template: Template,
175
+ slot_fillers: dict[str, LexicalItem],
176
+ ) -> str:
177
+ """Render template string with slot fillers.
178
+
179
+ Parameters
180
+ ----------
181
+ template : Template
182
+ Template with template_string.
183
+ slot_fillers : dict[str, LexicalItem]
184
+ Items filling each slot.
185
+
186
+ Returns
187
+ -------
188
+ str
189
+ Rendered template string.
190
+ """
191
+ rendered = template.template_string
192
+ for slot_name, item in slot_fillers.items():
193
+ placeholder = f"{{{slot_name}}}"
194
+ rendered = rendered.replace(placeholder, item.lemma)
195
+ return rendered
@@ -0,0 +1,212 @@
1
+ Metadata-Version: 2.4
2
+ Name: bead
3
+ Version: 0.1.0
4
+ Summary: Lexicon and Template Collection Construction Pipeline for Acceptability and Inference Judgment Data
5
+ Project-URL: Homepage, https://github.com/FACTSlab/bead
6
+ Project-URL: Documentation, https://bead.readthedocs.io
7
+ Project-URL: Repository, https://github.com/FACTSlab/bead
8
+ Project-URL: Issues, https://github.com/FACTSlab/bead/issues
9
+ Project-URL: Changelog, https://github.com/FACTSlab/bead/blob/main/CHANGELOG.md
10
+ Author-email: Aaron Steven White <aaron.white@rochester.edu>
11
+ License: MIT
12
+ License-File: LICENSE
13
+ Keywords: active-learning,experiments,linguistics,nlp,psycholinguistics
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Classifier: Topic :: Text Processing :: Linguistic
22
+ Classifier: Typing :: Typed
23
+ Requires-Python: >=3.13
24
+ Requires-Dist: accelerate>=0.25.0
25
+ Requires-Dist: click>=8.0.0
26
+ Requires-Dist: datasets>=2.14.0
27
+ Requires-Dist: evaluate>=0.4.0
28
+ Requires-Dist: glazing>=0.2.0
29
+ Requires-Dist: jinja2>=3.0.0
30
+ Requires-Dist: krippendorff>=0.6.0
31
+ Requires-Dist: langcodes>=3.3.0
32
+ Requires-Dist: lark>=1.0.0
33
+ Requires-Dist: pandas>=2.0.0
34
+ Requires-Dist: peft>=0.6.0
35
+ Requires-Dist: polars>=0.19.0
36
+ Requires-Dist: prompt-toolkit>=3.0.0
37
+ Requires-Dist: psutil>=5.9.0
38
+ Requires-Dist: pydantic>=2.0.0
39
+ Requires-Dist: pyyaml>=6.0.0
40
+ Requires-Dist: rich>=13.0.0
41
+ Requires-Dist: scikit-learn>=1.3.0
42
+ Requires-Dist: scipy>=1.11.0
43
+ Requires-Dist: sentence-transformers>=2.0.0
44
+ Requires-Dist: statsmodels>=0.14.6
45
+ Requires-Dist: torch>=2.0.0
46
+ Requires-Dist: transformers>=4.35.0
47
+ Requires-Dist: typer>=0.9.0
48
+ Requires-Dist: unimorph>=0.0.4
49
+ Requires-Dist: uuid-utils>=0.7.0
50
+ Provides-Extra: api
51
+ Requires-Dist: anthropic>=0.8.0; extra == 'api'
52
+ Requires-Dist: google-generativeai>=0.3.0; extra == 'api'
53
+ Requires-Dist: openai>=1.0.0; extra == 'api'
54
+ Provides-Extra: behavioral-analysis
55
+ Requires-Dist: slopit>=0.1.0; extra == 'behavioral-analysis'
56
+ Provides-Extra: dev
57
+ Requires-Dist: pandas-stubs>=2.0.0; extra == 'dev'
58
+ Requires-Dist: pyright>=1.1.0; extra == 'dev'
59
+ Requires-Dist: pytest-codeblocks>=0.17.0; extra == 'dev'
60
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
61
+ Requires-Dist: pytest-env>=1.0.0; extra == 'dev'
62
+ Requires-Dist: pytest-examples>=0.0.10; extra == 'dev'
63
+ Requires-Dist: pytest-mock>=3.11.0; extra == 'dev'
64
+ Requires-Dist: pytest>=7.4.0; extra == 'dev'
65
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
66
+ Provides-Extra: stats
67
+ Requires-Dist: statsmodels>=0.14.0; extra == 'stats'
68
+ Provides-Extra: training
69
+ Requires-Dist: pytorch-lightning>=2.0.0; extra == 'training'
70
+ Requires-Dist: tensorboard>=2.13.0; extra == 'training'
71
+ Provides-Extra: ui
72
+ Requires-Dist: textual>=0.40.0; extra == 'ui'
73
+ Description-Content-Type: text/markdown
74
+
75
+ # bead
76
+
77
+ A Python framework for constructing, deploying, and analyzing large-scale linguistic judgment experiments with active learning.
78
+
79
+ [![CI](https://github.com/FACTSlab/bead/actions/workflows/ci.yml/badge.svg)](https://github.com/FACTSlab/bead/actions/workflows/ci.yml)
80
+ [![Python 3.13](https://img.shields.io/badge/python-3.13-blue.svg)](https://www.python.org/downloads/)
81
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
82
+ [![Documentation](https://img.shields.io/badge/docs-readthedocs-blue.svg)](https://bead.readthedocs.io)
83
+
84
+ ## Overview
85
+
86
+ `bead` implements a complete pipeline for linguistic research: from lexical resource construction through experimental deployment to model training with active learning. It handles the combinatorial explosion of linguistic stimuli while maintaining full provenance tracking.
87
+
88
+ The name refers to the way sealant is applied while glazing a window, a play on the [glazing](https://github.com/FACTSlab/glazing) package for accessing VerbNet, PropBank, and FrameNet.
89
+
90
+ ## Installation
91
+
92
+ ```bash
93
+ # Install uv if needed
94
+ curl -LsSf https://astral.sh/uv/install.sh | sh
95
+
96
+ # Install bead
97
+ uv pip install bead
98
+
99
+ # With optional dependencies
100
+ uv pip install bead[api] # OpenAI, Anthropic, Google APIs
101
+ uv pip install bead[training] # PyTorch Lightning, TensorBoard
102
+ ```
103
+
104
+ ### Development
105
+
106
+ ```bash
107
+ git clone https://github.com/FACTSlab/bead.git
108
+ cd bead
109
+ uv sync --all-extras
110
+ uv run pytest tests/
111
+ ```
112
+
113
+ Always use `uv run` to execute commands.
114
+
115
+ ## Quick Start
116
+
117
+ ```python
118
+ from bead.resources import LexicalItem, Template, Lexicon
119
+ from bead.templates import TemplateFiller
120
+ from bead.items import ItemConstructor
121
+ from bead.lists import ListPartitioner
122
+
123
+ # 1. Define resources
124
+ verbs = Lexicon(items=[
125
+ LexicalItem(lemma="walk", pos="VERB", features={"transitive": False}),
126
+ LexicalItem(lemma="eat", pos="VERB", features={"transitive": True}),
127
+ ])
128
+
129
+ template = Template(
130
+ text="The person {verb} the thing",
131
+ slots=["verb"],
132
+ language_code="en"
133
+ )
134
+
135
+ # 2. Fill templates
136
+ filler = TemplateFiller(strategy="exhaustive")
137
+ filled = filler.fill(templates=[template], lexicons={"verbs": verbs})
138
+
139
+ # 3. Construct items
140
+ constructor = ItemConstructor(models=["gpt2"])
141
+ items = constructor.construct_forced_choice_items(filled, n_alternatives=2)
142
+
143
+ # 4. Partition into lists
144
+ partitioner = ListPartitioner()
145
+ lists = partitioner.partition(items.get_uuids(), n_lists=4)
146
+
147
+ # 5. Deploy
148
+ lists.save("lists/experiment.jsonl")
149
+ ```
150
+
151
+ ## Pipeline Stages
152
+
153
+ | Stage | Purpose | Output |
154
+ |-------|---------|--------|
155
+ | **Resources** | Define lexical items and templates | `lexicons/*.jsonl`, `templates/*.jsonl` |
156
+ | **Templates** | Fill templates with lexical items | `filled_templates/*.jsonl` |
157
+ | **Items** | Construct experimental items | `items/*.jsonl` |
158
+ | **Lists** | Partition into balanced lists | `lists/*.jsonl` |
159
+ | **Deployment** | Generate jsPsych experiments | `deployment/*.jzip` |
160
+ | **Training** | Active learning until convergence | Model checkpoints |
161
+
162
+ ## Key Features
163
+
164
+ - **Stand-off annotation**: UUID-based references for full provenance tracking
165
+ - **8 task types**: forced-choice, ordinal scale, binary, categorical, multi-select, magnitude, free text, cloze
166
+ - **Constraint satisfaction**: batch and list-level constraints for balanced designs
167
+ - **Model integration**: HuggingFace, OpenAI, Anthropic with caching
168
+ - **Active learning**: uncertainty sampling with convergence detection
169
+ - **jsPsych 8.x**: Material Design UI with JATOS deployment
170
+
171
+ ## CLI
172
+
173
+ ```bash
174
+ bead init my-experiment # Create project structure
175
+ bead templates fill # Fill templates
176
+ bead items construct # Construct items
177
+ bead lists partition # Create experiment lists
178
+ bead deploy # Generate jsPsych experiment
179
+ bead training run # Train with active learning
180
+ ```
181
+
182
+ ## Documentation
183
+
184
+ Full documentation: [bead.readthedocs.io](https://bead.readthedocs.io)
185
+
186
+ - [Installation Guide](https://bead.readthedocs.io/installation/)
187
+ - [User Guide](https://bead.readthedocs.io/user-guide/)
188
+ - [API Reference](https://bead.readthedocs.io/api/)
189
+ - [Gallery Examples](https://bead.readthedocs.io/examples/)
190
+
191
+ ## Contributing
192
+
193
+ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
194
+
195
+ ## Citation
196
+
197
+ ```bibtex
198
+ @software{white2025bead,
199
+ author = {White, Aaron Steven},
200
+ title = {bead: A framework for linguistic judgment experiments},
201
+ year = {2025},
202
+ url = {https://github.com/FACTSlab/bead},
203
+ }
204
+ ```
205
+
206
+ ## License
207
+
208
+ MIT License. See [LICENSE](LICENSE) for details.
209
+
210
+ ## Acknowledgments
211
+
212
+ This project was developed by Aaron Steven White at the University of Rochester with support from the National Science Foundation (NSF-BCS-2237175 *CAREER: Logical Form Induction*, NSF-BCS-2040831 *Computational Modeling of the Internal Structure of Events*). It was architected and implemented with the assistance of Claude Code.
@@ -0,0 +1,231 @@
1
+ bead/__init__.py,sha256=oZY1xAdiVXaM-rAJcJoMJSOrQm9gahcFpNfmA2xoRdA,370
2
+ bead/__main__.py,sha256=cL9ckAts2aTa71sU0DFUZfwRmhkff0QrUTkJgeBfY6A,182
3
+ bead/active_learning/__init__.py,sha256=V0J3aQ-Xbb-S3flq9gfUbvCs_aGB8XJzrJwfnKzLXtg,352
4
+ bead/active_learning/config.py,sha256=C0x0yt3oZrW0ueSzwBrtnnXToztQglnukheX8cdWHz4,8313
5
+ bead/active_learning/loop.py,sha256=vg5RZe1nRW6GANs9sPMzqMRb_NYsSsgauAJtKJMy7WM,20858
6
+ bead/active_learning/selection.py,sha256=nEzk4FFoV9JV27JJmgRTX5bSZmM8nsn7oGupJfM55nA,10811
7
+ bead/active_learning/strategies.py,sha256=nHJiuucUC3jH5a_bqGIz_M6qSuP-2N24DaO2Xr0bRBE,11616
8
+ bead/active_learning/models/__init__.py,sha256=xk8XRuOSHSm_gsetn3NkTumP1MZPPdCrcZUR90r2WFQ,909
9
+ bead/active_learning/models/base.py,sha256=FaSuenvHS6Niul3QZrfGj84S2VQ-eAC4P3Wr4Tdtw40,27599
10
+ bead/active_learning/models/binary.py,sha256=CSH1vxAbfQUzOIBVKrYt0z1A7tT4FG06hi1Bo2swJT4,32954
11
+ bead/active_learning/models/categorical.py,sha256=FPPUYYrlv0r0Uwi13eu9l51vQKDRPegvjrEgG_Ju7Q8,34333
12
+ bead/active_learning/models/cloze.py,sha256=_c_7uuNG4sGiRgx72aJ1M1RBMK-l847XvHNEHWhpdmA,31578
13
+ bead/active_learning/models/forced_choice.py,sha256=LrBUhWEvaSaksMcvuJjgcjadcsMDr6pwjKlMKNF3KyE,34831
14
+ bead/active_learning/models/free_text.py,sha256=SGL42qoOXFtgZuwucnOLskXz4CagVe-Sz1y3DPsyeRk,28402
15
+ bead/active_learning/models/lora.py,sha256=QakYORvKWCNsfk00JW5oEhxuo30DuvFpkicXGV7jyFE,10928
16
+ bead/active_learning/models/magnitude.py,sha256=8J5Ie6Y5Say8nt_qpdiQtv8u7ThBYbscU1TpbMt-YSg,29105
17
+ bead/active_learning/models/multi_select.py,sha256=YqkoZ58xEokoIXzrr7CpQH3NSVnRKlW5VcxhvaXyq78,28574
18
+ bead/active_learning/models/ordinal_scale.py,sha256=pnl-s2YWvGVbUdTjmIhPtSArgCZ6j4S6yoac2IuO2YM,28373
19
+ bead/active_learning/models/peft_adapter.py,sha256=K3ozTNIuZA0uuzXqKPd7Nd5Qoq6QUBTcu1L1ACip3o4,5112
20
+ bead/active_learning/models/random_effects.py,sha256=pP56TnMqYlvS1id3ER6QJDLYdS2ptwXFvz1VODuDv44,23399
21
+ bead/active_learning/trainers/__init__.py,sha256=LI0TC_JGPpnfBQYE-339Owuga-eU_yYv0c94N8E8UKo,721
22
+ bead/active_learning/trainers/base.py,sha256=zjbJG21yheNV-kpO9Xp8dEI2eIH6bf3SeMNZFPradHY,6307
23
+ bead/active_learning/trainers/data_collator.py,sha256=CyCnqHQuwmSKUVdNbim0NdnqUCsGwy5zLDWRX4ny4q0,5770
24
+ bead/active_learning/trainers/dataset_utils.py,sha256=mYqeKriQwfW3KsvSGk1LJ1eKUaIWtDcu4yzcQUW9670,8775
25
+ bead/active_learning/trainers/huggingface.py,sha256=_tocri_M_2XWpSdZEKGMIzMFf-5-6pYMtB2Ia26Ro7U,10372
26
+ bead/active_learning/trainers/lightning.py,sha256=Pk3hj1S4RfQ1O7btrFhvN51Vg4j8Mk3J7HgNj-yKRCQ,10480
27
+ bead/active_learning/trainers/metrics.py,sha256=1_18ULfs1voj6SZUwybqtEIqrzNihnQom-7rWnpeRq0,13881
28
+ bead/active_learning/trainers/mixed_effects.py,sha256=UugmEztq20AbJJxFnSJXKL4Jz8V2YivLj0ExENzcO9g,23213
29
+ bead/active_learning/trainers/model_wrapper.py,sha256=aeOHYWzc4RMQh1MtfaqhSP-kgCEN7FQKAuBrsEPvK9c,17727
30
+ bead/active_learning/trainers/registry.py,sha256=0QaTgBm4h4Q7OOCImYGphzuhM_w0Kpn6VpDrHhq5EDg,2707
31
+ bead/adapters/__init__.py,sha256=oI5qS6PG6q1l-hV7639X816ISW51V74bi5zH-5w1-iQ,283
32
+ bead/adapters/huggingface.py,sha256=QppL8daTbBlnKzinh1S02rrSLaHdaydGhg648ilRc5Y,1683
33
+ bead/behavioral/__init__.py,sha256=NVYYmPYGaEYrbEcXE4qAg86LDHkpQbxdiexCjxSEvNE,3074
34
+ bead/behavioral/analytics.py,sha256=gIPUP1rB41d-a0PCF3q1NYNOQGH2f6LiJi5rXh3rLmE,20835
35
+ bead/behavioral/extraction.py,sha256=jMuNgf2OyVwjm-uJHuJF1wjPq5hK2Hb4Pspy8TyiX7U,9704
36
+ bead/behavioral/merging.py,sha256=QQfXR0nd-qUAQGffOd8DIXMyOQZfysh9hC2ZGimjtsQ,10595
37
+ bead/cli/__init__.py,sha256=AeO4_8DwfPpWrc6rssvcuiz3LPTW2ZknF2GgscMcp0Y,214
38
+ bead/cli/active_learning.py,sha256=vvQDDF7GVIaDSUDC5gGcXAGVyVOs1L7MY0SLnAqjZXg,17009
39
+ bead/cli/active_learning_commands.py,sha256=w9HtOYiOhhBjOQ5ZI9l6Be18JWMGW9q9C4VPRT8hRoo,24812
40
+ bead/cli/completion.py,sha256=IzLJ8q0HDcQKSaqrV_DQ_20UfSwo0aXY4iG2mTtxbPI,10509
41
+ bead/cli/config.py,sha256=MhT_7yJjW80SCOBOx2v_rQvtoM4o9KHATl07asvhjJQ,16978
42
+ bead/cli/constraint_builders.py,sha256=CldrY4NheSXOlYYA2DBe6lJ0Y4nilfrEn6q4J7GlIbs,9946
43
+ bead/cli/deployment.py,sha256=tt3hhCjBT1QLULodFJhAaRfPx1q90RZudlohlydMyoo,29250
44
+ bead/cli/deployment_trials.py,sha256=6Y_dkoFRCKQxUvKBU5-3Z1vGwOLJ40wXR_yraCoPYcc,14553
45
+ bead/cli/deployment_ui.py,sha256=lEj3BIrrjMKCXDMgageTOZSXoqZY-5HVftlkLzvUtFc,10048
46
+ bead/cli/display.py,sha256=W3i4PAkWQ6QA_VLdK8Lhb1DBL3x7Z59Yy4rHo8r3-90,9203
47
+ bead/cli/items.py,sha256=YL4STtlTUxfSVexCYMQ276gTDVTsIlUaUMZwxgKiQKE,29117
48
+ bead/cli/items_factories.py,sha256=S6U1bodUIH3o5-RWJHTPp4CjBeGxS7gVEhMhdgbe01k,19909
49
+ bead/cli/list_constraints.py,sha256=v7GF-yisPV4Ii4oMk6ySB7-zLZO2Zo5B5DEvb07hy4s,17628
50
+ bead/cli/lists.py,sha256=bpJCa12uQPCKdx9u23iOCk81udY-DN0jdoEHsCFySeA,16284
51
+ bead/cli/main.py,sha256=uZsW06tgTWKtgXQkzA0zZ3l_hu5Xsa6S97YO__32rDw,11040
52
+ bead/cli/models.py,sha256=IWx8fIMNlblcMlAqVI4DSUIbNW-o2Ht6bYNGMkGhoPk,28633
53
+ bead/cli/resource_loaders.py,sha256=ob1ZKz1VdH9QaCvQfxqmopx45VExO8Vwudsi9mSGtuk,17906
54
+ bead/cli/resources.py,sha256=k-8y-6nFMPb23fvcsti7Kic3kGchzllwvhEi2qkHGzc,34478
55
+ bead/cli/shell.py,sha256=bbCaIXu0_OJPmO7meLz7YCUsTvk_2KH7Z4SvEOiMFfk,11037
56
+ bead/cli/simulate.py,sha256=QefRLih8tpnJJfeea6siViswTbwtjCsriyqnA3a7WPo,26662
57
+ bead/cli/templates.py,sha256=rV6B-QL6BtXbx2Ogu5hfWOeFoz15YMAK_ypYkZkO4qI,37360
58
+ bead/cli/training.py,sha256=ZKWIopi2m2k_4TLNuKQy7TjyfcohfwgmtbEoBI2gFdA,36403
59
+ bead/cli/utils.py,sha256=JfbJg8Nsbh2h0ZNhAdb-D6NVZX3aNI8ETDvbf7crzjA,16238
60
+ bead/cli/workflow.py,sha256=MwjKxR9VZy9CHsOpVPYuBCeJKH7qk_9cousfePkn-aM,37259
61
+ bead/config/__init__.py,sha256=dcdsSYt2WTszzDH1vL7o-Qgre4v1AN46Gh04Shoybf8,1810
62
+ bead/config/active_learning.py,sha256=Wu21fKTVrOcle4T5-Ud8F00qWBK5M7fhrj3RB0WJfIM,31252
63
+ bead/config/config.py,sha256=Mlk16elSZQksnUT-pUcWUUIJudcT58kKzhADMhXhI_U,6450
64
+ bead/config/defaults.py,sha256=9bDvKTyR6zLnwGN7uOYWdjFdxJjkEOAyZIugpgGzRig,3478
65
+ bead/config/deployment.py,sha256=yY3SB1-P4xGobNXvucp7d44ZAc88OjpQVINgPfaIZpA,6817
66
+ bead/config/env.py,sha256=q97930b8AFrT6TVr86396evRHGTTYG9iT5hXEgGj5zM,3638
67
+ bead/config/item.py,sha256=Q_hSnwIL1jUi8g8BgSSjHPntiIEOIHWIkfy1J1QPNNU,1248
68
+ bead/config/list.py,sha256=5l7CA1CG4Rk-5lxCR3siikgjJ5LIitqe77o1DYO7tAQ,6785
69
+ bead/config/loader.py,sha256=pL05pQWtLA_cd2OAGBCfFCek0Cp7L3ZeZ53QGOK3CZg,4115
70
+ bead/config/logging.py,sha256=w1oAaNA8NoUuPC76pUSQcmn86owKj2KSEpfwjlXOL5A,1007
71
+ bead/config/model.py,sha256=g_aSzUBW2574q9Aik6dkaCdW9hn6txV5_2_HHM9iP-0,1428
72
+ bead/config/paths.py,sha256=3TAGNR4kiDrTs_NEkp7pzuh1vqgP4eoEu8-Lb03JwNg,1316
73
+ bead/config/profiles.py,sha256=1kRPRvQRyGcZtLFfTVj-c_dg8PJsKmWsWDa-jF0RhWs,8941
74
+ bead/config/resources.py,sha256=HyEHVI7weQFUVYjUh3L4ihfaYuBoVi2Pz7rua-d7SfA,1303
75
+ bead/config/serialization.py,sha256=XCrWcBcH2x3_FQbqNygC7hEspwF44cpyVpmQqtp8lrc,6180
76
+ bead/config/simulation.py,sha256=hwhreRcAMNcpBVfLxdn50gcKuWdSkS-rKW6icpjKMFg,6590
77
+ bead/config/template.py,sha256=yQvGK82cbi7u9NkUw17MJJsTfcqVN2L0y_zRnpcD3wQ,8281
78
+ bead/config/validation.py,sha256=5QzW0oZIJ88k6ABgGyw9JRgs37lSg54zG97VRPOT-OY,8171
79
+ bead/data/__init__.py,sha256=rqra1AWj-d02NXBj4W-xJVaSJsQ6348ksEVaPx-HYVQ,1568
80
+ bead/data/base.py,sha256=5yGGqXPoml3X-R6tcrO0nxFlM3qtwuHIguW6X8SH_MI,2844
81
+ bead/data/identifiers.py,sha256=ipyyyc98IDs9OzlHapyz8NGvaVkzid_lK-Z__m8wtDQ,2496
82
+ bead/data/language_codes.py,sha256=WRoVrTvhrAuN3FX5NTJ0faifFk2uI_Z4_SO1mvesxRE,1490
83
+ bead/data/metadata.py,sha256=IMj_erh3lUMbkCp-wSRNhq6M4cU027lRFAvYYkzzX6I,8709
84
+ bead/data/range.py,sha256=A1flVuWsn3UBXh0LGRu9UtsbbC1ZH2tX1nloJCh7nao,2807
85
+ bead/data/repository.py,sha256=lSU0QfQ3psmQ0Nva1kNQit4tffM5bAge-2OaGwdB-8A,10138
86
+ bead/data/serialization.py,sha256=cg7WAAXSaM0UxE3HBOqWZ7JJjguF0yVjhkyATbaZ4Nc,7446
87
+ bead/data/timestamps.py,sha256=UQAzygKQcaA2DQWgx6Tc2KPjiNws8yYdbpr-eW3QPoo,2127
88
+ bead/data/validation.py,sha256=6edgTEH85DUvW_StSQoeIN8FgM6d8Rii1eYXaywXdzg,10305
89
+ bead/data_collection/__init__.py,sha256=-1ljW1LRmYFaWWXy7PIgFj_i6HaojvVHx3uWew16TQc,322
90
+ bead/data_collection/jatos.py,sha256=1d-rj-Fb9aWH15NixW9L6G3k-nzBz9gyAtmEdJFNoCE,6237
91
+ bead/data_collection/merger.py,sha256=TzvbBuuqPutQJpKq8--cV-6tCHuNcIH1oxEcHEQjwio,4816
92
+ bead/data_collection/prolific.py,sha256=6nk0qinj-QR3ENUOqvdfhpm8DlJwTOfFBObjooJUOH0,5425
93
+ bead/deployment/__init__.py,sha256=wPMasj6FVVDfciJZWMWQ7mte2z6QJvqcLgQxjbvRUto,175
94
+ bead/deployment/distribution.py,sha256=v-ApQszy_H3708DpNid8w3I_2gOVibC5reIJhyiQYis,14324
95
+ bead/deployment/jatos/__init__.py,sha256=z6AeXsSaeBEkqjBecjVWrFXHuVMWSR2DIgXqgRXrSkg,69
96
+ bead/deployment/jatos/api.py,sha256=pug_diReyjDEpmlUwumdTWtnQP2_0g-iE82nsBWrCZw,5233
97
+ bead/deployment/jatos/exporter.py,sha256=znDLnMNGXuamcIXK4QzQg_AZPqZ7S7aXaBmvQPJ9wug,6422
98
+ bead/deployment/jspsych/__init__.py,sha256=3cB7ZizaBrESWjOaPvavNZ7CeR5lbzdRgpFZw3bNBcE,278
99
+ bead/deployment/jspsych/biome.json,sha256=8xwbG1-Y2A32-CMgfKvABHGUGzc087U_X5dkJILQIFQ,859
100
+ bead/deployment/jspsych/config.py,sha256=JsszI8-6hpDoLIY-YHtYKB2Hs0dOlzrKGtvkvIFKgn0,13456
101
+ bead/deployment/jspsych/generator.py,sha256=TC7-FVIu4EXkzk4RxPEhwdKjCr5UOWOZuSzPIcNyb2Q,22528
102
+ bead/deployment/jspsych/package.json,sha256=-gXJPLbAMgTofuFqxCQb3qmqQr6NSYUxixeKTJRy78g,1278
103
+ bead/deployment/jspsych/pnpm-lock.yaml,sha256=HSvXIEQS8E4JLequE07RptGcDbsR3OB_vDm5ua0pg-8,67152
104
+ bead/deployment/jspsych/randomizer.py,sha256=3gk1EL-8Xnz9l7n4Lgqv8SiQDC3kRA_G4h8Vata27E0,9670
105
+ bead/deployment/jspsych/trials.py,sha256=etS_ZMRVs1OY0S7J1W30eAs0M35e1nPPtgf1JKNOT9k,22855
106
+ bead/deployment/jspsych/tsconfig.json,sha256=sx-pTIxsPgJE7YwCv1F7S3uHIuctBqo5YAqcu6hsTfU,627
107
+ bead/deployment/jspsych/tsup.config.ts,sha256=mUziTNKlT-RKZP-YjCnLnUG5skFUUTazEYn3gExr9E8,861
108
+ bead/deployment/jspsych/src/lib/list-distributor.test.ts,sha256=sH0GeF1l9h0JgZeFkLR8s1GxBhwe60fsR9nLGvUIlJ8,10049
109
+ bead/deployment/jspsych/src/lib/list-distributor.ts,sha256=Bqlm5fW7sol63EO8oLgyJaV3X2m5rPpRjJPbNAPDdVk,38277
110
+ bead/deployment/jspsych/src/lib/randomizer.test.ts,sha256=IIxM3iO83C73H4wRJLMUqAcBrbh3ldPa6IFn5FBS878,6914
111
+ bead/deployment/jspsych/src/lib/randomizer.ts,sha256=ASvnqUA9kA3KSMe-JRM3xRyqgftFwqDlw88_1MYgLF4,9289
112
+ bead/deployment/jspsych/src/plugins/cloze-dropdown.ts,sha256=zLqNLUH4aC8sAtjvxYm9V-BwAz0hfltjQxRFdtgnHxM,7303
113
+ bead/deployment/jspsych/src/plugins/forced-choice.ts,sha256=DG8svExzJcKmIbbHH0T9Kf4o6jcjadHehwpkANkhZU4,7923
114
+ bead/deployment/jspsych/src/plugins/plugins.test.ts,sha256=8lvJZZQuNTfsd41snOzKNmipEj0200mNd-gKnVJEUPs,4842
115
+ bead/deployment/jspsych/src/plugins/rating.ts,sha256=pxbowQZxc7dyYcr054rxCJsH1U5YD857Kl0-2Fx1W0U,6844
116
+ bead/deployment/jspsych/src/slopit/index.ts,sha256=uvn9wqgFHUhXu4rCKQeGKmM9xGTk5NGzQqNocEO-ntY,251
117
+ bead/deployment/jspsych/src/types/jatos.d.ts,sha256=LIm60vJqsvCpVJstBlHvVHHy5N3QCVPINIE96R2FMU0,6000
118
+ bead/deployment/jspsych/src/types/jspsych.d.ts,sha256=5yEZIOYYdr3ZmN09KYzcTYUg9lZEZ6quHckR3f-Y_Vc,6274
119
+ bead/deployment/jspsych/templates/experiment.css,sha256=_-A-QDM9sx2KulCcnQZyToDRikrr2I6eHeqY77lXd68,60
120
+ bead/deployment/jspsych/templates/experiment.js.template,sha256=p3u3mqK4n9gmvwdDO6X8dYd3ni-Ifh3UteYqhH7zwG8,11007
121
+ bead/deployment/jspsych/templates/index.html,sha256=VLvfGkW05pi0iGR3SR4nEj1oiQY_x5H3g3aiPudLzo0,1830
122
+ bead/deployment/jspsych/templates/randomizer.js,sha256=tqe4GuNe9SnMln-NkdL9J20YrzAmgeS05xhVmURCW-8,7715
123
+ bead/deployment/jspsych/templates/randomizer.js.template,sha256=Ie07FBKG4H2c3Za9Gt8dXbbxG090KM_XDPHx-oKdIsI,9248
124
+ bead/deployment/jspsych/ui/__init__.py,sha256=jqnyYIw79KFA6AtiEfm0y-kWry8NONZC2WwRRFKEWcw,56
125
+ bead/deployment/jspsych/ui/components.py,sha256=81OZ0EK8bRfxw8Dlzyb6P8RW5hFgGofLt008-HHNv48,12536
126
+ bead/deployment/jspsych/ui/styles.py,sha256=UdzqvgW0ofJhBU1d7swyBAQcUqHiVuNqB_A_ogrhqxg,9249
127
+ bead/dsl/__init__.py,sha256=j_lVmA4qdeamroMx1kat-gRMFZO2NFqYpakMy0gD8_g,1865
128
+ bead/dsl/ast.py,sha256=nyGErdjvxe12zHwtF6RDni5dr2BxhjXsaMyQOMw1pFU,3399
129
+ bead/dsl/context.py,sha256=MLqp3PTfabnZmcgYi4HUH34xsyFhbDTRgfnDN3k8XOs,4734
130
+ bead/dsl/errors.py,sha256=Hn3gsCeqUvlDrtzccMZukrZtgIYT3qoB4CHajmf-koo,1775
131
+ bead/dsl/evaluator.py,sha256=M4aGSSk2dN8t_0BA0zlH4b7QuxftDauDJH1EJ7z1S2g,17800
132
+ bead/dsl/grammar.lark,sha256=9id6c5I90raJTa9Cq723mg3JP2I3fSmU8IQtouTdJd8,1878
133
+ bead/dsl/parser.py,sha256=0nq1_7cFZvnWKs4wERNOHqiKd_-UR9y6O3MQxf_j0q0,8509
134
+ bead/dsl/stdlib.py,sha256=oNwYVSEtO685Nibp3utACO0nS9C0CcAUZ8kmAj3yxXY,17607
135
+ bead/evaluation/__init__.py,sha256=B5uTpMzu8cBS4ELnyU1bm959ezi2NOYAGou3VfUp6r4,403
136
+ bead/evaluation/convergence.py,sha256=lPnIEIlCvMeG5iRd4RqmI9YVwi5RD6rAzBHq16ylFNM,17209
137
+ bead/evaluation/interannotator.py,sha256=RtZpI7lfInj_w0v0VzglEDUSEG0l2W0dimkfhiqF38A,13177
138
+ bead/items/__init__.py,sha256=qof3wAz4CKLLhsXstlx2cV867l51rO1g19NF4yk2pCE,803
139
+ bead/items/binary.py,sha256=5vVQRxSROU48-WNids3H-FcQSjWcsnjxeWd8o-W5WGI,15162
140
+ bead/items/cache.py,sha256=SdYcBlBvCzpLPmybRYUCwsq00klPtmX0b88_1WbQhfY,16348
141
+ bead/items/categorical.py,sha256=e-03NmvIvowtr953yKL2EauqkrJlvfI4LdRTVlqpKWE,17495
142
+ bead/items/cloze.py,sha256=vq-F6o-n7Y-nTcGfk_rowQwyXnAWcYFaaKjVZXe3Bvo,23671
143
+ bead/items/constructor.py,sha256=v4oNk9cOiEFkzZiGl1waO4mBWO6K1d8_8X-CjRXi0dU,28030
144
+ bead/items/forced_choice.py,sha256=SM8-Ji1-ZwMFPhmcQiNl3bHRE62pftoTwDd1dEoNCLk,12903
145
+ bead/items/free_text.py,sha256=IBCtKW-7axi9LX4HR3_eW7jURtYXgA6C1fcZ1a2iJIU,20046
146
+ bead/items/generation.py,sha256=oa8jSAcxms_SzFMbs61KlQyXlzWlXd3R4_ugtSAkeSs,14407
147
+ bead/items/item.py,sha256=ha1auobObjY2ETN1U2Tn7t8_Iu97PN_MmELuNdxgUDA,11894
148
+ bead/items/item_template.py,sha256=C1KzLhNp6q0MABjjcKG3ejYk14FwUD2Whw_nWeEM6aA,25737
149
+ bead/items/magnitude.py,sha256=hqx8_OzLJ30ecfCR_sPrVb_bDGR9ca4iWF8uxPdYz6g,16407
150
+ bead/items/multi_select.py,sha256=gI8hnSD5dxuSPrkskNGaOPANP_4HZNJOxDW46cqAJIc,20514
151
+ bead/items/ordinal_scale.py,sha256=USR0RiM76DJd-aMT_Q0NTIA96RlC1bu4qY_3rpFNVhQ,16740
152
+ bead/items/scoring.py,sha256=JuVv4j7DxfMULWvqcCHn93tINtaVtWxsaVHugAUtcZU,14379
153
+ bead/items/validation.py,sha256=IGz9ydXZ7Ea9DqcK3RVgViITF7XZpZA26dtVMdQLsNc,24989
154
+ bead/items/adapters/__init__.py,sha256=zXqaXWCqI8WJ_bpNcx5od5ghqkMtS-7nWNeUcjBfhRA,1775
155
+ bead/items/adapters/anthropic.py,sha256=yMeewn81_iemjsNqp-kvjawJuFYhlG7b60negidr1Lw,7166
156
+ bead/items/adapters/api_utils.py,sha256=JIA57Dnl-nF0kr8BMaT40j0jsIVKN8-l0jvFlpJzlHI,5115
157
+ bead/items/adapters/base.py,sha256=CQd0-fau__TAe1_YXRPggO76AcVLkST3G4-hJJMLc-8,5939
158
+ bead/items/adapters/google.py,sha256=6OgeuIDdKWFpdMJX6J8DuHYttyWQ-mztLi5e2r3zUnM,8036
159
+ bead/items/adapters/huggingface.py,sha256=3bcv2yHsvl1iuAC4m8PaE59PFzZHpRC_3Z-Zg8UALTE,35652
160
+ bead/items/adapters/openai.py,sha256=rGEy42-1LEYC-WW65qL4OuaWt5i6SU8p0mFbqC-mtDQ,9868
161
+ bead/items/adapters/registry.py,sha256=aXTVwk3R-ZKZ77YIO8ZUxG3LkpOcqKPFK7rnu3Dlo6k,6053
162
+ bead/items/adapters/sentence_transformers.py,sha256=YfWIyOZ9ytXQklGC-bQMs0j91zLWHVpVzCBp_Yxje5o,6957
163
+ bead/items/adapters/togetherai.py,sha256=SsmhOvkpxifq-KqasujDJRLwahVeLKG8wWu3yRBrG1M,9791
164
+ bead/lists/__init__.py,sha256=Fcw0LLpCrxfcWAhDjsAsSHy27Jf8U8UCSGoINNrb0Ek,845
165
+ bead/lists/balancer.py,sha256=fZ57y98ci8PiAfvrfEhdQE8wVbRoX1kD_K2Ib-cQKBA,9189
166
+ bead/lists/constraints.py,sha256=BloqZOiv6qu4gmFkPco9oaDjUq91yX_DZawTqSYcPpU,38855
167
+ bead/lists/experiment_list.py,sha256=edL197blkCi2ht9nqPwulNvume6QTa0pdZx_havKfwM,8734
168
+ bead/lists/list_collection.py,sha256=wZ5Oa2JIzdHjleZa_zlGcrFV0c1x953jYZTEhlbe0E8,11745
169
+ bead/lists/partitioner.py,sha256=MfsiWZ_IWUo8pP5Rou0fzCmfFQCwtUXTm9xi8n3Mifs,36287
170
+ bead/lists/stratification.py,sha256=ApAbFlkmfTP6nACwNeCZcBkdAm5vNlWlWDnnfhRLpLs,8323
171
+ bead/participants/__init__.py,sha256=a3yuRWDqjmL143TvSPyZbmeTXnNmqysZv5hpwO-rWM8,2217
172
+ bead/participants/collection.py,sha256=-LII_0nBqLjtjI3YAANonAhyAFwzavhaoMhrxk45ztg,21272
173
+ bead/participants/merging.py,sha256=VyoRPmGKM8soea2a5zHlqwsWiHWQ4u_mCj1yp24cjmc,9660
174
+ bead/participants/metadata_spec.py,sha256=wuFYvzR5uj1J8iwGm19FqDypOwB8_sycVLhD8jCNDRc,15225
175
+ bead/participants/models.py,sha256=rBJNKwd0VP-M9MGUnkYUu_70RFQM1DltHqK0an21-vU,8640
176
+ bead/resources/__init__.py,sha256=N-3ElrHhOR2UfWVx75LIdUuTuhBwwkpan1ij_OxbMRw,765
177
+ bead/resources/classification.py,sha256=70HwJQ4gzjpLHTjd1nbFxcCz_wLMemqOIjUTPC6RQX8,25993
178
+ bead/resources/constraint_builders.py,sha256=_KibTfJVpauYCiW5ap0jGKze69VLC0YavbQmqM2U3SA,11046
179
+ bead/resources/constraints.py,sha256=hgkItJx9IoS9aKBrqXlwihVCAQ-q4Dymekyes05O82E,5502
180
+ bead/resources/lexical_item.py,sha256=ajx_NkNqQ4xly32a3E0Gt-LMYi-dZv410UShjdd9aNk,6941
181
+ bead/resources/lexicon.py,sha256=0QzRlPq2ffAPrVS6kSXJLPlb9cnnM7cmmImylQHNOnw,22139
182
+ bead/resources/loaders.py,sha256=yqsPc_jHxe0zjB7Vtwd863FYRgKNbo0UjWSn7kl_HPQ,6018
183
+ bead/resources/template.py,sha256=f421OX-hNFVDgraEJnNhbQXgqu0bNw_pJs2Ej_gPQrQ,12903
184
+ bead/resources/template_collection.py,sha256=r4ABfCz7mgfOQ4C3HmzKfe9QaYw8xrhY_179QTKmOZ4,21837
185
+ bead/resources/template_generation.py,sha256=tsxNMarRlx37_cvZIhayESFkxD9o3fLHtsx6x8xjs2w,10419
186
+ bead/resources/adapters/__init__.py,sha256=92NQ08WSZWNDERt4YDFFjoQEvgYv8bvjLL51CVbOrqc,589
187
+ bead/resources/adapters/base.py,sha256=9MC1DwdUlFHSLp9cIUtMnnaCNyFRpbcBOwLrAqGl85Y,3430
188
+ bead/resources/adapters/cache.py,sha256=HGkYYcedv6VOgNZWgzrjtvmzWyjG5DIN-UhmMGUGSn4,3542
189
+ bead/resources/adapters/glazing.py,sha256=Kmbr_VZk-8o1R3TLU_VTjfpfmE4lI0cwcGsB8w4XTIw,17378
190
+ bead/resources/adapters/registry.py,sha256=TyUPlNvfIWSEL-c8C_NbnUAqyaCm4Tus7vT8CvaY2bE,3638
191
+ bead/resources/adapters/unimorph.py,sha256=xq-9SSMv1y0trXaxuvg1kYHCs9Xy2UC4A_8F8oGozEE,21454
192
+ bead/simulation/__init__.py,sha256=rp5LP4G0Uq1vvA_VRXqtAvxpjJPEFz-dIJb4RL1fbAg,1107
193
+ bead/simulation/runner.py,sha256=JdwERuMTziHl8sSYJDgWFdN7WEaGuxVwqlBD0VuJE5I,4746
194
+ bead/simulation/annotators/__init__.py,sha256=w4hqZoeDo05nXTK_7reoWuCANtwL880pphpOuYVFOIQ,534
195
+ bead/simulation/annotators/base.py,sha256=YWLPK0LuZCAwR4BbJpASZWD0xGkkhgv_3Go9Cr1RmLI,5520
196
+ bead/simulation/annotators/distance_based.py,sha256=-bJBeQpiO10KEAZkl6HetaWcRN_4KoL-Pne5MUC010E,4836
197
+ bead/simulation/annotators/lm_based.py,sha256=wmzXvDDhPQDuQd1ZLC5vmMMaMayCt_A0mdZtJ5lUKmg,3927
198
+ bead/simulation/annotators/oracle.py,sha256=ovyJfQi2amfra9X8GccfEYKkbRYVf8yxcsLq6Y3JQAg,6745
199
+ bead/simulation/annotators/random.py,sha256=q3VMQmNXhWB7cvwYzpUbMnvujWX1cvCL4w2ARK9CUpA,5646
200
+ bead/simulation/dsl_extension/__init__.py,sha256=p5F-hCWXulibMtxwj5EM-BIlLamWvJ3RrNgOlgBekhQ,71
201
+ bead/simulation/noise_models/__init__.py,sha256=nd4R2Is8BX2WUdbMLVhj2QQHenQnETY1J7UdhIxyzL0,444
202
+ bead/simulation/noise_models/base.py,sha256=cQdibMZtaRw5uyFVEBkO41a8udLphfDM910iY0y4iPs,1152
203
+ bead/simulation/noise_models/random_noise.py,sha256=8DfdarL7Q9VRqMfO1L2-W-Q3Ct56V0oKllpYqb5wOF0,2435
204
+ bead/simulation/noise_models/systematic.py,sha256=JJ5ERiV1cs1FRWLbrhTlMlrXENcTqprYhZmeNnmMps8,4055
205
+ bead/simulation/noise_models/temperature.py,sha256=exDRTzC5Xz_j2SajFL1_2FJbh-aLP-CeKKmYGc83F-E,2692
206
+ bead/simulation/strategies/__init__.py,sha256=Yn45hrT1v4pwb3byhGiIsTYcC2T_fYMEmeJtzMWhPUc,894
207
+ bead/simulation/strategies/base.py,sha256=pG3VJTJ5bJZDA8_M7W1lHfi39kEW3ByzNdhnsHuB6ko,3472
208
+ bead/simulation/strategies/binary.py,sha256=Gd3WPRF9O0lrTgqnf3kZSoDmNg_FFvV6_PpNx2wiElg,2699
209
+ bead/simulation/strategies/categorical.py,sha256=5jnyhyD5JLPfOFAVZc66c3aPTntJ0v3pjoM1DIg4Bdc,3482
210
+ bead/simulation/strategies/cloze.py,sha256=4pQjjNHFd_oP9aOr2EMdPys7GgE0Hpk9p-7PDK6c1MA,7361
211
+ bead/simulation/strategies/forced_choice.py,sha256=mZjEjxGQLq374YM6NelKOpgKZRekoW-P0I2k8Zcpf8k,3621
212
+ bead/simulation/strategies/free_text.py,sha256=w4F3UP60XJmDcAlPFg8OHxHbkOpIWXEB3Xrq0AlBtTY,3027
213
+ bead/simulation/strategies/magnitude.py,sha256=l7-SbXZbpSQJ5wO_2wlji77sWModRMNTLmhhMvokwj4,3298
214
+ bead/simulation/strategies/multi_select.py,sha256=CWhEpH9mpZDu6x6j4M-A41oobZuFIUxnaKp9bvQLsbk,3812
215
+ bead/simulation/strategies/ordinal_scale.py,sha256=KbzU2zdB3i_lTnVZNT6xnWpn2nHbhUzHfFpshBqB9g8,3825
216
+ bead/templates/__init__.py,sha256=Xj9sZGIZOJAdRNCEDWllknsWVwUua1o4JhyAAivcQZk,676
217
+ bead/templates/combinatorics.py,sha256=68cMhgM9IcLsAe5RmAsVvTv3XZ4pfe8_-zwW1LCnFBM,2509
218
+ bead/templates/filler.py,sha256=JT7prFmvFw-JLFZEZOXUQgObY2yfF0MczcEBQsXInms,20632
219
+ bead/templates/renderers.py,sha256=tEra7D9aGDUd9paXIT8H-6BtzifrGTZ6Zr7Sb1irCKw,6249
220
+ bead/templates/resolver.py,sha256=hh0_4pPa9coi2EPibOm4gEIEMAEUQ2fzDxi-VldXtv4,5943
221
+ bead/templates/strategies.py,sha256=x0loHNNI0-MIWgUEq9As7HM3WD9FueasCNxS3ZvlPy0,64155
222
+ bead/templates/streaming.py,sha256=Au6v5Umalo-JVpYLRaaq4v5RjXDJ_2ra17obayunOGU,6351
223
+ bead/templates/adapters/__init__.py,sha256=kS4xphWWpWaG4kx6PvnU5qsfQRaNXzqX4XKJv3RCLUA,503
224
+ bead/templates/adapters/base.py,sha256=rwe-3Wmv7EhuDCUe-RUWPUvJ1j6kcFN4E9BDz_nLPxw,3397
225
+ bead/templates/adapters/cache.py,sha256=EeHj9GBT7Bi6mV6r2Iu6pw0Se53MitnMOjs1gkWI1Rc,4721
226
+ bead/templates/adapters/huggingface.py,sha256=EuK7fHpAY017Vb6yjqRa5GbgSHPQg1FUX4TwN0_iYYE,9651
227
+ bead-0.1.0.dist-info/METADATA,sha256=dCL6Mir4yZkxjAdtTle6hLTCGToGddDRHWQ5UA_1YbU,7852
228
+ bead-0.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
229
+ bead-0.1.0.dist-info/entry_points.txt,sha256=Ry1_jPeng5T_UsR2laA42vbGWkaPfWDg9ScjEYYb9T8,43
230
+ bead-0.1.0.dist-info/licenses/LICENSE,sha256=l3rW8IBkFW7RCc481r6YNSCQCXQFg171lfLgi91Dtp8,1075
231
+ bead-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ bead = bead.cli.main:cli