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.
- bead/__init__.py +11 -0
- bead/__main__.py +11 -0
- bead/active_learning/__init__.py +15 -0
- bead/active_learning/config.py +231 -0
- bead/active_learning/loop.py +566 -0
- bead/active_learning/models/__init__.py +24 -0
- bead/active_learning/models/base.py +852 -0
- bead/active_learning/models/binary.py +910 -0
- bead/active_learning/models/categorical.py +943 -0
- bead/active_learning/models/cloze.py +862 -0
- bead/active_learning/models/forced_choice.py +956 -0
- bead/active_learning/models/free_text.py +773 -0
- bead/active_learning/models/lora.py +365 -0
- bead/active_learning/models/magnitude.py +835 -0
- bead/active_learning/models/multi_select.py +795 -0
- bead/active_learning/models/ordinal_scale.py +811 -0
- bead/active_learning/models/peft_adapter.py +155 -0
- bead/active_learning/models/random_effects.py +639 -0
- bead/active_learning/selection.py +354 -0
- bead/active_learning/strategies.py +391 -0
- bead/active_learning/trainers/__init__.py +26 -0
- bead/active_learning/trainers/base.py +210 -0
- bead/active_learning/trainers/data_collator.py +172 -0
- bead/active_learning/trainers/dataset_utils.py +261 -0
- bead/active_learning/trainers/huggingface.py +304 -0
- bead/active_learning/trainers/lightning.py +324 -0
- bead/active_learning/trainers/metrics.py +424 -0
- bead/active_learning/trainers/mixed_effects.py +551 -0
- bead/active_learning/trainers/model_wrapper.py +509 -0
- bead/active_learning/trainers/registry.py +104 -0
- bead/adapters/__init__.py +11 -0
- bead/adapters/huggingface.py +61 -0
- bead/behavioral/__init__.py +116 -0
- bead/behavioral/analytics.py +646 -0
- bead/behavioral/extraction.py +343 -0
- bead/behavioral/merging.py +343 -0
- bead/cli/__init__.py +11 -0
- bead/cli/active_learning.py +513 -0
- bead/cli/active_learning_commands.py +779 -0
- bead/cli/completion.py +359 -0
- bead/cli/config.py +624 -0
- bead/cli/constraint_builders.py +286 -0
- bead/cli/deployment.py +859 -0
- bead/cli/deployment_trials.py +493 -0
- bead/cli/deployment_ui.py +332 -0
- bead/cli/display.py +378 -0
- bead/cli/items.py +960 -0
- bead/cli/items_factories.py +776 -0
- bead/cli/list_constraints.py +714 -0
- bead/cli/lists.py +490 -0
- bead/cli/main.py +430 -0
- bead/cli/models.py +877 -0
- bead/cli/resource_loaders.py +621 -0
- bead/cli/resources.py +1036 -0
- bead/cli/shell.py +356 -0
- bead/cli/simulate.py +840 -0
- bead/cli/templates.py +1158 -0
- bead/cli/training.py +1080 -0
- bead/cli/utils.py +614 -0
- bead/cli/workflow.py +1273 -0
- bead/config/__init__.py +68 -0
- bead/config/active_learning.py +1009 -0
- bead/config/config.py +192 -0
- bead/config/defaults.py +118 -0
- bead/config/deployment.py +217 -0
- bead/config/env.py +147 -0
- bead/config/item.py +45 -0
- bead/config/list.py +193 -0
- bead/config/loader.py +149 -0
- bead/config/logging.py +42 -0
- bead/config/model.py +49 -0
- bead/config/paths.py +46 -0
- bead/config/profiles.py +320 -0
- bead/config/resources.py +47 -0
- bead/config/serialization.py +210 -0
- bead/config/simulation.py +206 -0
- bead/config/template.py +238 -0
- bead/config/validation.py +267 -0
- bead/data/__init__.py +65 -0
- bead/data/base.py +87 -0
- bead/data/identifiers.py +97 -0
- bead/data/language_codes.py +61 -0
- bead/data/metadata.py +270 -0
- bead/data/range.py +123 -0
- bead/data/repository.py +358 -0
- bead/data/serialization.py +249 -0
- bead/data/timestamps.py +89 -0
- bead/data/validation.py +349 -0
- bead/data_collection/__init__.py +11 -0
- bead/data_collection/jatos.py +223 -0
- bead/data_collection/merger.py +154 -0
- bead/data_collection/prolific.py +198 -0
- bead/deployment/__init__.py +5 -0
- bead/deployment/distribution.py +402 -0
- bead/deployment/jatos/__init__.py +1 -0
- bead/deployment/jatos/api.py +200 -0
- bead/deployment/jatos/exporter.py +210 -0
- bead/deployment/jspsych/__init__.py +9 -0
- bead/deployment/jspsych/biome.json +44 -0
- bead/deployment/jspsych/config.py +411 -0
- bead/deployment/jspsych/generator.py +598 -0
- bead/deployment/jspsych/package.json +51 -0
- bead/deployment/jspsych/pnpm-lock.yaml +2141 -0
- bead/deployment/jspsych/randomizer.py +299 -0
- bead/deployment/jspsych/src/lib/list-distributor.test.ts +327 -0
- bead/deployment/jspsych/src/lib/list-distributor.ts +1282 -0
- bead/deployment/jspsych/src/lib/randomizer.test.ts +232 -0
- bead/deployment/jspsych/src/lib/randomizer.ts +367 -0
- bead/deployment/jspsych/src/plugins/cloze-dropdown.ts +252 -0
- bead/deployment/jspsych/src/plugins/forced-choice.ts +265 -0
- bead/deployment/jspsych/src/plugins/plugins.test.ts +141 -0
- bead/deployment/jspsych/src/plugins/rating.ts +248 -0
- bead/deployment/jspsych/src/slopit/index.ts +9 -0
- bead/deployment/jspsych/src/types/jatos.d.ts +256 -0
- bead/deployment/jspsych/src/types/jspsych.d.ts +228 -0
- bead/deployment/jspsych/templates/experiment.css +1 -0
- bead/deployment/jspsych/templates/experiment.js.template +289 -0
- bead/deployment/jspsych/templates/index.html +51 -0
- bead/deployment/jspsych/templates/randomizer.js +241 -0
- bead/deployment/jspsych/templates/randomizer.js.template +313 -0
- bead/deployment/jspsych/trials.py +723 -0
- bead/deployment/jspsych/tsconfig.json +23 -0
- bead/deployment/jspsych/tsup.config.ts +30 -0
- bead/deployment/jspsych/ui/__init__.py +1 -0
- bead/deployment/jspsych/ui/components.py +383 -0
- bead/deployment/jspsych/ui/styles.py +411 -0
- bead/dsl/__init__.py +80 -0
- bead/dsl/ast.py +168 -0
- bead/dsl/context.py +178 -0
- bead/dsl/errors.py +71 -0
- bead/dsl/evaluator.py +570 -0
- bead/dsl/grammar.lark +81 -0
- bead/dsl/parser.py +231 -0
- bead/dsl/stdlib.py +929 -0
- bead/evaluation/__init__.py +13 -0
- bead/evaluation/convergence.py +485 -0
- bead/evaluation/interannotator.py +398 -0
- bead/items/__init__.py +40 -0
- bead/items/adapters/__init__.py +70 -0
- bead/items/adapters/anthropic.py +224 -0
- bead/items/adapters/api_utils.py +167 -0
- bead/items/adapters/base.py +216 -0
- bead/items/adapters/google.py +259 -0
- bead/items/adapters/huggingface.py +1074 -0
- bead/items/adapters/openai.py +323 -0
- bead/items/adapters/registry.py +202 -0
- bead/items/adapters/sentence_transformers.py +224 -0
- bead/items/adapters/togetherai.py +309 -0
- bead/items/binary.py +515 -0
- bead/items/cache.py +558 -0
- bead/items/categorical.py +593 -0
- bead/items/cloze.py +757 -0
- bead/items/constructor.py +784 -0
- bead/items/forced_choice.py +413 -0
- bead/items/free_text.py +681 -0
- bead/items/generation.py +432 -0
- bead/items/item.py +396 -0
- bead/items/item_template.py +787 -0
- bead/items/magnitude.py +573 -0
- bead/items/multi_select.py +621 -0
- bead/items/ordinal_scale.py +569 -0
- bead/items/scoring.py +448 -0
- bead/items/validation.py +723 -0
- bead/lists/__init__.py +30 -0
- bead/lists/balancer.py +263 -0
- bead/lists/constraints.py +1067 -0
- bead/lists/experiment_list.py +286 -0
- bead/lists/list_collection.py +378 -0
- bead/lists/partitioner.py +1141 -0
- bead/lists/stratification.py +254 -0
- bead/participants/__init__.py +73 -0
- bead/participants/collection.py +699 -0
- bead/participants/merging.py +312 -0
- bead/participants/metadata_spec.py +491 -0
- bead/participants/models.py +276 -0
- bead/resources/__init__.py +29 -0
- bead/resources/adapters/__init__.py +19 -0
- bead/resources/adapters/base.py +104 -0
- bead/resources/adapters/cache.py +128 -0
- bead/resources/adapters/glazing.py +508 -0
- bead/resources/adapters/registry.py +117 -0
- bead/resources/adapters/unimorph.py +796 -0
- bead/resources/classification.py +856 -0
- bead/resources/constraint_builders.py +329 -0
- bead/resources/constraints.py +165 -0
- bead/resources/lexical_item.py +223 -0
- bead/resources/lexicon.py +744 -0
- bead/resources/loaders.py +209 -0
- bead/resources/template.py +441 -0
- bead/resources/template_collection.py +707 -0
- bead/resources/template_generation.py +349 -0
- bead/simulation/__init__.py +29 -0
- bead/simulation/annotators/__init__.py +15 -0
- bead/simulation/annotators/base.py +175 -0
- bead/simulation/annotators/distance_based.py +135 -0
- bead/simulation/annotators/lm_based.py +114 -0
- bead/simulation/annotators/oracle.py +182 -0
- bead/simulation/annotators/random.py +181 -0
- bead/simulation/dsl_extension/__init__.py +3 -0
- bead/simulation/noise_models/__init__.py +13 -0
- bead/simulation/noise_models/base.py +42 -0
- bead/simulation/noise_models/random_noise.py +82 -0
- bead/simulation/noise_models/systematic.py +132 -0
- bead/simulation/noise_models/temperature.py +86 -0
- bead/simulation/runner.py +144 -0
- bead/simulation/strategies/__init__.py +23 -0
- bead/simulation/strategies/base.py +123 -0
- bead/simulation/strategies/binary.py +103 -0
- bead/simulation/strategies/categorical.py +123 -0
- bead/simulation/strategies/cloze.py +224 -0
- bead/simulation/strategies/forced_choice.py +127 -0
- bead/simulation/strategies/free_text.py +105 -0
- bead/simulation/strategies/magnitude.py +116 -0
- bead/simulation/strategies/multi_select.py +129 -0
- bead/simulation/strategies/ordinal_scale.py +131 -0
- bead/templates/__init__.py +27 -0
- bead/templates/adapters/__init__.py +17 -0
- bead/templates/adapters/base.py +128 -0
- bead/templates/adapters/cache.py +178 -0
- bead/templates/adapters/huggingface.py +312 -0
- bead/templates/combinatorics.py +103 -0
- bead/templates/filler.py +605 -0
- bead/templates/renderers.py +177 -0
- bead/templates/resolver.py +178 -0
- bead/templates/strategies.py +1806 -0
- bead/templates/streaming.py +195 -0
- bead-0.1.0.dist-info/METADATA +212 -0
- bead-0.1.0.dist-info/RECORD +231 -0
- bead-0.1.0.dist-info/WHEEL +4 -0
- bead-0.1.0.dist-info/entry_points.txt +2 -0
- bead-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Behavioral analytics for bead.
|
|
2
|
+
|
|
3
|
+
This module provides tools for extracting, storing, and analyzing
|
|
4
|
+
behavioral data captured during experiments via slopit integration.
|
|
5
|
+
|
|
6
|
+
The main components are:
|
|
7
|
+
|
|
8
|
+
- **Analytics Models**: `JudgmentAnalytics`, `ParticipantBehavioralSummary`,
|
|
9
|
+
`AnalyticsCollection` for storing per-judgment behavioral metrics
|
|
10
|
+
- **Extraction**: Functions to extract analytics from slopit sessions
|
|
11
|
+
- **Merging**: Utilities to merge analytics with judgment DataFrames
|
|
12
|
+
|
|
13
|
+
Examples
|
|
14
|
+
--------
|
|
15
|
+
Extract analytics from JATOS export:
|
|
16
|
+
|
|
17
|
+
>>> from bead.behavioral import extract_with_analysis, AnalyticsCollection
|
|
18
|
+
>>> collection = extract_with_analysis("data/jatos_export/")
|
|
19
|
+
>>> print(f"Extracted {len(collection)} analytics records")
|
|
20
|
+
|
|
21
|
+
Get participant summaries:
|
|
22
|
+
|
|
23
|
+
>>> summaries = collection.get_participant_summaries()
|
|
24
|
+
>>> for s in summaries:
|
|
25
|
+
... if s.flag_rate > 0.1:
|
|
26
|
+
... print(f"Participant {s.participant_id}: {s.flag_rate:.1%} flagged")
|
|
27
|
+
|
|
28
|
+
Merge with judgment data:
|
|
29
|
+
|
|
30
|
+
>>> from bead.behavioral import merge_behavioral_analytics
|
|
31
|
+
>>> merged_df = merge_behavioral_analytics(judgments_df, collection)
|
|
32
|
+
|
|
33
|
+
Filter out flagged judgments:
|
|
34
|
+
|
|
35
|
+
>>> from bead.behavioral import filter_flagged_judgments
|
|
36
|
+
>>> clean_df = filter_flagged_judgments(judgments_df, collection, exclude_flagged=True)
|
|
37
|
+
|
|
38
|
+
Save and load analytics:
|
|
39
|
+
|
|
40
|
+
>>> collection.to_jsonl("analytics.jsonl")
|
|
41
|
+
>>> loaded = AnalyticsCollection.from_jsonl("analytics.jsonl", name="study_001")
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
# Re-export key slopit types for convenience
|
|
45
|
+
from slopit.behavioral import (
|
|
46
|
+
Analyzer,
|
|
47
|
+
FocusAnalyzer,
|
|
48
|
+
KeystrokeAnalyzer,
|
|
49
|
+
PasteAnalyzer,
|
|
50
|
+
TimingAnalyzer,
|
|
51
|
+
)
|
|
52
|
+
from slopit.schemas import (
|
|
53
|
+
AnalysisFlag,
|
|
54
|
+
BehavioralData,
|
|
55
|
+
BehavioralMetrics,
|
|
56
|
+
FocusMetrics,
|
|
57
|
+
KeystrokeMetrics,
|
|
58
|
+
Severity,
|
|
59
|
+
SlopitSession,
|
|
60
|
+
SlopitTrial,
|
|
61
|
+
TimingMetrics,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
from bead.behavioral.analytics import (
|
|
65
|
+
AnalyticsCollection,
|
|
66
|
+
JudgmentAnalytics,
|
|
67
|
+
ParticipantBehavioralSummary,
|
|
68
|
+
)
|
|
69
|
+
from bead.behavioral.extraction import (
|
|
70
|
+
analyze_sessions,
|
|
71
|
+
extract_from_directory,
|
|
72
|
+
extract_from_file,
|
|
73
|
+
extract_from_session,
|
|
74
|
+
extract_from_trial,
|
|
75
|
+
extract_with_analysis,
|
|
76
|
+
)
|
|
77
|
+
from bead.behavioral.merging import (
|
|
78
|
+
create_analysis_dataframe_with_behavior,
|
|
79
|
+
filter_flagged_judgments,
|
|
80
|
+
get_exclusion_list,
|
|
81
|
+
merge_behavioral_analytics,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
__all__ = [
|
|
85
|
+
# Bead models
|
|
86
|
+
"JudgmentAnalytics",
|
|
87
|
+
"ParticipantBehavioralSummary",
|
|
88
|
+
"AnalyticsCollection",
|
|
89
|
+
# Extraction
|
|
90
|
+
"extract_from_trial",
|
|
91
|
+
"extract_from_session",
|
|
92
|
+
"extract_from_file",
|
|
93
|
+
"extract_from_directory",
|
|
94
|
+
"extract_with_analysis",
|
|
95
|
+
"analyze_sessions",
|
|
96
|
+
# Merging
|
|
97
|
+
"merge_behavioral_analytics",
|
|
98
|
+
"filter_flagged_judgments",
|
|
99
|
+
"create_analysis_dataframe_with_behavior",
|
|
100
|
+
"get_exclusion_list",
|
|
101
|
+
# Slopit re-exports
|
|
102
|
+
"SlopitSession",
|
|
103
|
+
"SlopitTrial",
|
|
104
|
+
"BehavioralData",
|
|
105
|
+
"BehavioralMetrics",
|
|
106
|
+
"KeystrokeMetrics",
|
|
107
|
+
"FocusMetrics",
|
|
108
|
+
"TimingMetrics",
|
|
109
|
+
"AnalysisFlag",
|
|
110
|
+
"Severity",
|
|
111
|
+
"Analyzer",
|
|
112
|
+
"KeystrokeAnalyzer",
|
|
113
|
+
"FocusAnalyzer",
|
|
114
|
+
"PasteAnalyzer",
|
|
115
|
+
"TimingAnalyzer",
|
|
116
|
+
]
|