edsl 0.1.47__py3-none-any.whl → 0.1.48__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.
- edsl/__init__.py +44 -39
- edsl/__version__.py +1 -1
- edsl/agents/__init__.py +4 -2
- edsl/agents/{Agent.py → agent.py} +442 -152
- edsl/agents/{AgentList.py → agent_list.py} +220 -162
- edsl/agents/descriptors.py +46 -7
- edsl/{exceptions/agents.py → agents/exceptions.py} +3 -12
- edsl/base/__init__.py +75 -0
- edsl/base/base_class.py +1303 -0
- edsl/base/data_transfer_models.py +114 -0
- edsl/base/enums.py +215 -0
- edsl/base.py +8 -0
- edsl/buckets/__init__.py +25 -0
- edsl/buckets/bucket_collection.py +324 -0
- edsl/buckets/model_buckets.py +206 -0
- edsl/buckets/token_bucket.py +502 -0
- edsl/{jobs/buckets/TokenBucketAPI.py → buckets/token_bucket_api.py} +1 -1
- edsl/buckets/token_bucket_client.py +509 -0
- edsl/caching/__init__.py +20 -0
- edsl/caching/cache.py +814 -0
- edsl/caching/cache_entry.py +427 -0
- edsl/{data/CacheHandler.py → caching/cache_handler.py} +14 -15
- edsl/caching/exceptions.py +24 -0
- edsl/caching/orm.py +30 -0
- edsl/{data/RemoteCacheSync.py → caching/remote_cache_sync.py} +3 -3
- edsl/caching/sql_dict.py +441 -0
- edsl/config/__init__.py +8 -0
- edsl/config/config_class.py +177 -0
- edsl/config.py +4 -176
- edsl/conversation/Conversation.py +7 -7
- edsl/conversation/car_buying.py +4 -4
- edsl/conversation/chips.py +6 -6
- edsl/coop/__init__.py +25 -2
- edsl/coop/coop.py +303 -67
- edsl/coop/{ExpectedParrotKeyHandler.py → ep_key_handling.py} +86 -10
- edsl/coop/exceptions.py +62 -0
- edsl/coop/price_fetcher.py +126 -0
- edsl/coop/utils.py +89 -24
- edsl/data_transfer_models.py +5 -72
- edsl/dataset/__init__.py +10 -0
- edsl/{results/Dataset.py → dataset/dataset.py} +116 -36
- edsl/{results/DatasetExportMixin.py → dataset/dataset_operations_mixin.py} +606 -122
- edsl/{results/DatasetTree.py → dataset/dataset_tree.py} +156 -75
- edsl/{results/TableDisplay.py → dataset/display/table_display.py} +18 -7
- edsl/{results → dataset/display}/table_renderers.py +58 -2
- edsl/{results → dataset}/file_exports.py +4 -5
- edsl/{results → dataset}/smart_objects.py +2 -2
- edsl/enums.py +5 -205
- edsl/inference_services/__init__.py +5 -0
- edsl/inference_services/{AvailableModelCacheHandler.py → available_model_cache_handler.py} +2 -3
- edsl/inference_services/{AvailableModelFetcher.py → available_model_fetcher.py} +8 -14
- edsl/inference_services/data_structures.py +3 -2
- edsl/{exceptions/inference_services.py → inference_services/exceptions.py} +1 -1
- edsl/inference_services/{InferenceServiceABC.py → inference_service_abc.py} +1 -1
- edsl/inference_services/{InferenceServicesCollection.py → inference_services_collection.py} +8 -7
- edsl/inference_services/registry.py +4 -41
- edsl/inference_services/{ServiceAvailability.py → service_availability.py} +5 -25
- edsl/inference_services/services/__init__.py +31 -0
- edsl/inference_services/{AnthropicService.py → services/anthropic_service.py} +3 -3
- edsl/inference_services/{AwsBedrock.py → services/aws_bedrock.py} +2 -2
- edsl/inference_services/{AzureAI.py → services/azure_ai.py} +2 -2
- edsl/inference_services/{DeepInfraService.py → services/deep_infra_service.py} +1 -3
- edsl/inference_services/{DeepSeekService.py → services/deep_seek_service.py} +2 -4
- edsl/inference_services/{GoogleService.py → services/google_service.py} +5 -4
- edsl/inference_services/{GroqService.py → services/groq_service.py} +1 -1
- edsl/inference_services/{MistralAIService.py → services/mistral_ai_service.py} +3 -3
- edsl/inference_services/{OllamaService.py → services/ollama_service.py} +1 -7
- edsl/inference_services/{OpenAIService.py → services/open_ai_service.py} +5 -6
- edsl/inference_services/{PerplexityService.py → services/perplexity_service.py} +3 -7
- edsl/inference_services/{TestService.py → services/test_service.py} +7 -6
- edsl/inference_services/{TogetherAIService.py → services/together_ai_service.py} +2 -6
- edsl/inference_services/{XAIService.py → services/xai_service.py} +1 -1
- edsl/inference_services/write_available.py +1 -2
- edsl/instructions/__init__.py +6 -0
- edsl/{surveys/instructions/Instruction.py → instructions/instruction.py} +11 -6
- edsl/{surveys/instructions/InstructionCollection.py → instructions/instruction_collection.py} +10 -5
- edsl/{surveys/InstructionHandler.py → instructions/instruction_handler.py} +3 -3
- edsl/{jobs/interviews → interviews}/ReportErrors.py +2 -2
- edsl/interviews/__init__.py +4 -0
- edsl/{jobs/AnswerQuestionFunctionConstructor.py → interviews/answering_function.py} +45 -18
- edsl/{jobs/interviews/InterviewExceptionEntry.py → interviews/exception_tracking.py} +107 -22
- edsl/interviews/interview.py +638 -0
- edsl/{jobs/interviews/InterviewStatusDictionary.py → interviews/interview_status_dictionary.py} +21 -12
- edsl/{jobs/interviews/InterviewStatusLog.py → interviews/interview_status_log.py} +16 -7
- edsl/{jobs/InterviewTaskManager.py → interviews/interview_task_manager.py} +12 -7
- edsl/{jobs/RequestTokenEstimator.py → interviews/request_token_estimator.py} +8 -3
- edsl/{jobs/interviews/InterviewStatistic.py → interviews/statistics.py} +36 -10
- edsl/invigilators/__init__.py +38 -0
- edsl/invigilators/invigilator_base.py +477 -0
- edsl/{agents/Invigilator.py → invigilators/invigilators.py} +263 -10
- edsl/invigilators/prompt_constructor.py +476 -0
- edsl/{agents → invigilators}/prompt_helpers.py +2 -1
- edsl/{agents/QuestionInstructionPromptBuilder.py → invigilators/question_instructions_prompt_builder.py} +18 -13
- edsl/{agents → invigilators}/question_option_processor.py +96 -21
- edsl/{agents/QuestionTemplateReplacementsBuilder.py → invigilators/question_template_replacements_builder.py} +64 -12
- edsl/jobs/__init__.py +7 -1
- edsl/jobs/async_interview_runner.py +99 -35
- edsl/jobs/check_survey_scenario_compatibility.py +7 -5
- edsl/jobs/data_structures.py +153 -22
- edsl/{exceptions/jobs.py → jobs/exceptions.py} +2 -1
- edsl/jobs/{FetchInvigilator.py → fetch_invigilator.py} +4 -4
- edsl/jobs/{loggers/HTMLTableJobLogger.py → html_table_job_logger.py} +6 -2
- edsl/jobs/{Jobs.py → jobs.py} +313 -167
- edsl/jobs/{JobsChecks.py → jobs_checks.py} +15 -7
- edsl/jobs/{JobsComponentConstructor.py → jobs_component_constructor.py} +19 -17
- edsl/jobs/{InterviewsConstructor.py → jobs_interview_constructor.py} +10 -5
- edsl/jobs/jobs_pricing_estimation.py +347 -0
- edsl/jobs/{JobsRemoteInferenceLogger.py → jobs_remote_inference_logger.py} +4 -3
- edsl/jobs/jobs_runner_asyncio.py +282 -0
- edsl/jobs/{JobsRemoteInferenceHandler.py → remote_inference.py} +19 -22
- edsl/jobs/results_exceptions_handler.py +2 -2
- edsl/key_management/__init__.py +28 -0
- edsl/key_management/key_lookup.py +161 -0
- edsl/{language_models/key_management/KeyLookupBuilder.py → key_management/key_lookup_builder.py} +118 -47
- edsl/key_management/key_lookup_collection.py +82 -0
- edsl/key_management/models.py +218 -0
- edsl/language_models/__init__.py +7 -2
- edsl/language_models/{ComputeCost.py → compute_cost.py} +18 -3
- edsl/{exceptions/language_models.py → language_models/exceptions.py} +2 -1
- edsl/language_models/language_model.py +1080 -0
- edsl/language_models/model.py +10 -25
- edsl/language_models/{ModelList.py → model_list.py} +9 -14
- edsl/language_models/{RawResponseHandler.py → raw_response_handler.py} +1 -1
- edsl/language_models/{RegisterLanguageModelsMeta.py → registry.py} +1 -1
- edsl/language_models/repair.py +4 -4
- edsl/language_models/utilities.py +4 -4
- edsl/notebooks/__init__.py +3 -1
- edsl/notebooks/{Notebook.py → notebook.py} +7 -8
- edsl/prompts/__init__.py +1 -1
- edsl/{exceptions/prompts.py → prompts/exceptions.py} +3 -1
- edsl/prompts/{Prompt.py → prompt.py} +101 -95
- edsl/questions/HTMLQuestion.py +1 -1
- edsl/questions/__init__.py +154 -25
- edsl/questions/answer_validator_mixin.py +1 -1
- edsl/questions/compose_questions.py +4 -3
- edsl/questions/derived/question_likert_five.py +166 -0
- edsl/questions/derived/{QuestionLinearScale.py → question_linear_scale.py} +4 -4
- edsl/questions/derived/{QuestionTopK.py → question_top_k.py} +4 -4
- edsl/questions/derived/{QuestionYesNo.py → question_yes_no.py} +4 -5
- edsl/questions/descriptors.py +24 -30
- edsl/questions/loop_processor.py +65 -19
- edsl/questions/question_base.py +881 -0
- edsl/questions/question_base_gen_mixin.py +15 -16
- edsl/questions/{QuestionBasePromptsMixin.py → question_base_prompts_mixin.py} +2 -2
- edsl/questions/{QuestionBudget.py → question_budget.py} +3 -4
- edsl/questions/{QuestionCheckBox.py → question_check_box.py} +16 -16
- edsl/questions/{QuestionDict.py → question_dict.py} +39 -5
- edsl/questions/{QuestionExtract.py → question_extract.py} +9 -9
- edsl/questions/question_free_text.py +282 -0
- edsl/questions/{QuestionFunctional.py → question_functional.py} +6 -5
- edsl/questions/{QuestionList.py → question_list.py} +6 -7
- edsl/questions/{QuestionMatrix.py → question_matrix.py} +6 -5
- edsl/questions/{QuestionMultipleChoice.py → question_multiple_choice.py} +126 -21
- edsl/questions/{QuestionNumerical.py → question_numerical.py} +5 -5
- edsl/questions/{QuestionRank.py → question_rank.py} +6 -6
- edsl/questions/question_registry.py +4 -9
- edsl/questions/register_questions_meta.py +8 -4
- edsl/questions/response_validator_abc.py +17 -16
- edsl/results/__init__.py +4 -1
- edsl/{exceptions/results.py → results/exceptions.py} +1 -1
- edsl/results/report.py +197 -0
- edsl/results/{Result.py → result.py} +131 -45
- edsl/results/{Results.py → results.py} +365 -220
- edsl/results/results_selector.py +344 -25
- edsl/scenarios/__init__.py +30 -3
- edsl/scenarios/{ConstructDownloadLink.py → construct_download_link.py} +7 -0
- edsl/scenarios/directory_scanner.py +156 -13
- edsl/scenarios/document_chunker.py +186 -0
- edsl/scenarios/exceptions.py +101 -0
- edsl/scenarios/file_methods.py +2 -3
- edsl/scenarios/{FileStore.py → file_store.py} +275 -189
- edsl/scenarios/handlers/__init__.py +14 -14
- edsl/scenarios/handlers/{csv.py → csv_file_store.py} +1 -2
- edsl/scenarios/handlers/{docx.py → docx_file_store.py} +8 -7
- edsl/scenarios/handlers/{html.py → html_file_store.py} +1 -2
- edsl/scenarios/handlers/{jpeg.py → jpeg_file_store.py} +1 -1
- edsl/scenarios/handlers/{json.py → json_file_store.py} +1 -1
- edsl/scenarios/handlers/latex_file_store.py +5 -0
- edsl/scenarios/handlers/{md.py → md_file_store.py} +1 -1
- edsl/scenarios/handlers/{pdf.py → pdf_file_store.py} +2 -2
- edsl/scenarios/handlers/{png.py → png_file_store.py} +1 -1
- edsl/scenarios/handlers/{pptx.py → pptx_file_store.py} +8 -7
- edsl/scenarios/handlers/{py.py → py_file_store.py} +1 -3
- edsl/scenarios/handlers/{sql.py → sql_file_store.py} +2 -1
- edsl/scenarios/handlers/{sqlite.py → sqlite_file_store.py} +2 -3
- edsl/scenarios/handlers/{txt.py → txt_file_store.py} +1 -1
- edsl/scenarios/scenario.py +928 -0
- edsl/scenarios/scenario_join.py +18 -5
- edsl/scenarios/{ScenarioList.py → scenario_list.py} +294 -106
- edsl/scenarios/{ScenarioListPdfMixin.py → scenario_list_pdf_tools.py} +16 -15
- edsl/scenarios/scenario_selector.py +5 -1
- edsl/study/ObjectEntry.py +2 -2
- edsl/study/SnapShot.py +5 -5
- edsl/study/Study.py +18 -19
- edsl/study/__init__.py +6 -4
- edsl/surveys/__init__.py +7 -4
- edsl/surveys/dag/__init__.py +2 -0
- edsl/surveys/{ConstructDAG.py → dag/construct_dag.py} +3 -3
- edsl/surveys/{DAG.py → dag/dag.py} +13 -10
- edsl/surveys/descriptors.py +1 -1
- edsl/surveys/{EditSurvey.py → edit_survey.py} +9 -9
- edsl/{exceptions/surveys.py → surveys/exceptions.py} +1 -2
- edsl/surveys/memory/__init__.py +3 -0
- edsl/surveys/{MemoryPlan.py → memory/memory_plan.py} +10 -9
- edsl/surveys/rules/__init__.py +3 -0
- edsl/surveys/{Rule.py → rules/rule.py} +103 -43
- edsl/surveys/{RuleCollection.py → rules/rule_collection.py} +21 -30
- edsl/surveys/{RuleManager.py → rules/rule_manager.py} +19 -13
- edsl/surveys/survey.py +1743 -0
- edsl/surveys/{SurveyExportMixin.py → survey_export.py} +22 -27
- edsl/surveys/{SurveyFlowVisualization.py → survey_flow_visualization.py} +11 -2
- edsl/surveys/{Simulator.py → survey_simulator.py} +10 -3
- edsl/tasks/__init__.py +32 -0
- edsl/{jobs/tasks/QuestionTaskCreator.py → tasks/question_task_creator.py} +115 -57
- edsl/tasks/task_creators.py +135 -0
- edsl/{jobs/tasks/TaskHistory.py → tasks/task_history.py} +86 -47
- edsl/{jobs/tasks → tasks}/task_status_enum.py +91 -7
- edsl/tasks/task_status_log.py +85 -0
- edsl/tokens/__init__.py +2 -0
- edsl/tokens/interview_token_usage.py +53 -0
- edsl/utilities/PrettyList.py +1 -1
- edsl/utilities/SystemInfo.py +25 -22
- edsl/utilities/__init__.py +29 -21
- edsl/utilities/gcp_bucket/__init__.py +2 -0
- edsl/utilities/gcp_bucket/cloud_storage.py +99 -96
- edsl/utilities/interface.py +44 -536
- edsl/{results/MarkdownToPDF.py → utilities/markdown_to_pdf.py} +13 -5
- edsl/utilities/repair_functions.py +1 -1
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/METADATA +1 -1
- edsl-0.1.48.dist-info/RECORD +347 -0
- edsl/Base.py +0 -493
- edsl/BaseDiff.py +0 -260
- edsl/agents/InvigilatorBase.py +0 -260
- edsl/agents/PromptConstructor.py +0 -318
- edsl/coop/PriceFetcher.py +0 -54
- edsl/data/Cache.py +0 -582
- edsl/data/CacheEntry.py +0 -238
- edsl/data/SQLiteDict.py +0 -292
- edsl/data/__init__.py +0 -5
- edsl/data/orm.py +0 -10
- edsl/exceptions/cache.py +0 -5
- edsl/exceptions/coop.py +0 -14
- edsl/exceptions/data.py +0 -14
- edsl/exceptions/scenarios.py +0 -29
- edsl/jobs/Answers.py +0 -43
- edsl/jobs/JobsPrompts.py +0 -354
- edsl/jobs/buckets/BucketCollection.py +0 -134
- edsl/jobs/buckets/ModelBuckets.py +0 -65
- edsl/jobs/buckets/TokenBucket.py +0 -283
- edsl/jobs/buckets/TokenBucketClient.py +0 -191
- edsl/jobs/interviews/Interview.py +0 -395
- edsl/jobs/interviews/InterviewExceptionCollection.py +0 -99
- edsl/jobs/interviews/InterviewStatisticsCollection.py +0 -25
- edsl/jobs/runners/JobsRunnerAsyncio.py +0 -163
- edsl/jobs/runners/JobsRunnerStatusData.py +0 -0
- edsl/jobs/tasks/TaskCreators.py +0 -64
- edsl/jobs/tasks/TaskStatusLog.py +0 -23
- edsl/jobs/tokens/InterviewTokenUsage.py +0 -27
- edsl/language_models/LanguageModel.py +0 -635
- edsl/language_models/ServiceDataSources.py +0 -0
- edsl/language_models/key_management/KeyLookup.py +0 -63
- edsl/language_models/key_management/KeyLookupCollection.py +0 -38
- edsl/language_models/key_management/models.py +0 -137
- edsl/questions/QuestionBase.py +0 -544
- edsl/questions/QuestionFreeText.py +0 -130
- edsl/questions/derived/QuestionLikertFive.py +0 -76
- edsl/results/ResultsExportMixin.py +0 -45
- edsl/results/TextEditor.py +0 -50
- edsl/results/results_fetch_mixin.py +0 -33
- edsl/results/results_tools_mixin.py +0 -98
- edsl/scenarios/DocumentChunker.py +0 -104
- edsl/scenarios/Scenario.py +0 -548
- edsl/scenarios/ScenarioHtmlMixin.py +0 -65
- edsl/scenarios/ScenarioListExportMixin.py +0 -45
- edsl/scenarios/handlers/latex.py +0 -5
- edsl/shared.py +0 -1
- edsl/surveys/Survey.py +0 -1301
- edsl/surveys/SurveyQualtricsImport.py +0 -284
- edsl/surveys/SurveyToApp.py +0 -141
- edsl/surveys/instructions/__init__.py +0 -0
- edsl/tools/__init__.py +0 -1
- edsl/tools/clusters.py +0 -192
- edsl/tools/embeddings.py +0 -27
- edsl/tools/embeddings_plotting.py +0 -118
- edsl/tools/plotting.py +0 -112
- edsl/tools/summarize.py +0 -18
- edsl/utilities/data/Registry.py +0 -6
- edsl/utilities/data/__init__.py +0 -1
- edsl/utilities/data/scooter_results.json +0 -1
- edsl-0.1.47.dist-info/RECORD +0 -354
- /edsl/coop/{CoopFunctionsMixin.py → coop_functions.py} +0 -0
- /edsl/{results → dataset/display}/CSSParameterizer.py +0 -0
- /edsl/{language_models/key_management → dataset/display}/__init__.py +0 -0
- /edsl/{results → dataset/display}/table_data_class.py +0 -0
- /edsl/{results → dataset/display}/table_display.css +0 -0
- /edsl/{results/ResultsGGMixin.py → dataset/r/ggplot.py} +0 -0
- /edsl/{results → dataset}/tree_explore.py +0 -0
- /edsl/{surveys/instructions/ChangeInstruction.py → instructions/change_instruction.py} +0 -0
- /edsl/{jobs/interviews → interviews}/interview_status_enum.py +0 -0
- /edsl/jobs/{runners/JobsRunnerStatus.py → jobs_runner_status.py} +0 -0
- /edsl/language_models/{PriceManager.py → price_manager.py} +0 -0
- /edsl/language_models/{fake_openai_call.py → unused/fake_openai_call.py} +0 -0
- /edsl/language_models/{fake_openai_service.py → unused/fake_openai_service.py} +0 -0
- /edsl/notebooks/{NotebookToLaTeX.py → notebook_to_latex.py} +0 -0
- /edsl/{exceptions/questions.py → questions/exceptions.py} +0 -0
- /edsl/questions/{SimpleAskMixin.py → simple_ask_mixin.py} +0 -0
- /edsl/surveys/{Memory.py → memory/memory.py} +0 -0
- /edsl/surveys/{MemoryManagement.py → memory/memory_management.py} +0 -0
- /edsl/surveys/{SurveyCSS.py → survey_css.py} +0 -0
- /edsl/{jobs/tokens/TokenUsage.py → tokens/token_usage.py} +0 -0
- /edsl/{results/MarkdownToDocx.py → utilities/markdown_to_docx.py} +0 -0
- /edsl/{TemplateLoader.py → utilities/template_loader.py} +0 -0
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/LICENSE +0 -0
- {edsl-0.1.47.dist-info → edsl-0.1.48.dist-info}/WHEEL +0 -0
@@ -1,76 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
from typing import Optional
|
3
|
-
from edsl.questions.QuestionMultipleChoice import QuestionMultipleChoice
|
4
|
-
|
5
|
-
from edsl.questions.decorators import inject_exception
|
6
|
-
|
7
|
-
|
8
|
-
class QuestionLikertFive(QuestionMultipleChoice):
|
9
|
-
"""This question prompts the agent to respond to a statement on a 5-point Likert scale."""
|
10
|
-
|
11
|
-
question_type = "likert_five"
|
12
|
-
likert_options: list[str] = [
|
13
|
-
"Strongly disagree",
|
14
|
-
"Disagree",
|
15
|
-
"Neutral",
|
16
|
-
"Agree",
|
17
|
-
"Strongly agree",
|
18
|
-
]
|
19
|
-
|
20
|
-
def __init__(
|
21
|
-
self,
|
22
|
-
question_name: str,
|
23
|
-
question_text: str,
|
24
|
-
question_options: Optional[list[str]] = likert_options,
|
25
|
-
answering_instructions: Optional[str] = None,
|
26
|
-
question_presentation: Optional[str] = None,
|
27
|
-
include_comment: bool = True,
|
28
|
-
):
|
29
|
-
"""Initialize the question.
|
30
|
-
|
31
|
-
:param question_name: The name of the question.
|
32
|
-
:param question_text: The text of the question.
|
33
|
-
:param question_options: The options the respondent should select from (list of strings). If not provided, the default Likert options are used (['Strongly disagree', 'Disagree', 'Neutral', 'Agree', 'Strongly agree']). To view them, run `QuestionLikertFive.likert_options`.
|
34
|
-
"""
|
35
|
-
super().__init__(
|
36
|
-
question_name=question_name,
|
37
|
-
question_text=question_text,
|
38
|
-
question_options=question_options,
|
39
|
-
use_code=False,
|
40
|
-
include_comment=include_comment,
|
41
|
-
answering_instructions=answering_instructions,
|
42
|
-
question_presentation=question_presentation,
|
43
|
-
)
|
44
|
-
|
45
|
-
@classmethod
|
46
|
-
@inject_exception
|
47
|
-
def example(cls) -> QuestionLikertFive:
|
48
|
-
"""Return an example question."""
|
49
|
-
return cls(
|
50
|
-
question_name="happy_raining",
|
51
|
-
question_text="I'm only happy when it rains.",
|
52
|
-
)
|
53
|
-
|
54
|
-
|
55
|
-
def main():
|
56
|
-
"""Test QuestionLikertFive."""
|
57
|
-
from edsl.questions.derived.QuestionLikertFive import QuestionLikertFive
|
58
|
-
|
59
|
-
q = QuestionLikertFive.example()
|
60
|
-
q.question_text
|
61
|
-
q.question_options
|
62
|
-
q.question_name
|
63
|
-
# validate an answer
|
64
|
-
q._validate_answer({"answer": 0, "comment": "I like custard"})
|
65
|
-
# translate answer code
|
66
|
-
q._translate_answer_code_to_answer(0, {})
|
67
|
-
q._simulate_answer()
|
68
|
-
q._simulate_answer(human_readable=False)
|
69
|
-
q._validate_answer(q._simulate_answer(human_readable=False))
|
70
|
-
# serialization (inherits from Question)
|
71
|
-
q.to_dict()
|
72
|
-
assert q.from_dict(q.to_dict()) == q
|
73
|
-
|
74
|
-
import doctest
|
75
|
-
|
76
|
-
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
@@ -1,45 +0,0 @@
|
|
1
|
-
"""Mixin class for exporting results."""
|
2
|
-
|
3
|
-
from functools import wraps
|
4
|
-
from typing import Literal, Optional, Union
|
5
|
-
|
6
|
-
from edsl.results.DatasetExportMixin import DatasetExportMixin
|
7
|
-
|
8
|
-
|
9
|
-
def to_dataset(func):
|
10
|
-
"""Convert the Results object to a Dataset object before calling the function."""
|
11
|
-
|
12
|
-
@wraps(func)
|
13
|
-
def wrapper(self, *args, **kwargs):
|
14
|
-
"""Return the function with the Results object converted to a Dataset object."""
|
15
|
-
if self.__class__.__name__ == "Results":
|
16
|
-
return func(self.select(), *args, **kwargs)
|
17
|
-
elif self.__class__.__name__ == "AgentList":
|
18
|
-
return func(self.to_dataset(), *args, **kwargs)
|
19
|
-
else:
|
20
|
-
return func(self, *args, **kwargs)
|
21
|
-
|
22
|
-
wrapper._is_wrapped = True
|
23
|
-
return wrapper
|
24
|
-
|
25
|
-
|
26
|
-
def decorate_methods_from_mixin(cls, mixin_cls):
|
27
|
-
for attr_name, attr_value in mixin_cls.__dict__.items():
|
28
|
-
if callable(attr_value) and not attr_name.startswith("__"):
|
29
|
-
setattr(cls, attr_name, to_dataset(attr_value))
|
30
|
-
return cls
|
31
|
-
|
32
|
-
|
33
|
-
class ResultsExportMixin(DatasetExportMixin):
|
34
|
-
"""Mixin class for exporting Results objects."""
|
35
|
-
|
36
|
-
def __init_subclass__(cls, **kwargs):
|
37
|
-
super().__init_subclass__(**kwargs)
|
38
|
-
decorate_methods_from_mixin(cls, DatasetExportMixin)
|
39
|
-
|
40
|
-
|
41
|
-
if __name__ == "__main__":
|
42
|
-
# pass
|
43
|
-
import doctest
|
44
|
-
|
45
|
-
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
edsl/results/TextEditor.py
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
try:
|
2
|
-
import gradio as gr
|
3
|
-
except ImportError:
|
4
|
-
print("Gradio is not installed. Please install it using `pip install gradio`")
|
5
|
-
|
6
|
-
import time
|
7
|
-
|
8
|
-
|
9
|
-
class TextEditor:
|
10
|
-
def __init__(self, initial_text=""):
|
11
|
-
self.text = initial_text
|
12
|
-
self._text_saved = False
|
13
|
-
|
14
|
-
def save_text(self, new_text):
|
15
|
-
self.text = new_text
|
16
|
-
self._text_saved = True
|
17
|
-
return "Text saved successfully!"
|
18
|
-
|
19
|
-
def edit_gui(self):
|
20
|
-
js_code = """
|
21
|
-
async (text) => {
|
22
|
-
await navigator.clipboard.writeText(text);
|
23
|
-
return "Copied to clipboard!";
|
24
|
-
}
|
25
|
-
"""
|
26
|
-
|
27
|
-
with gr.Blocks() as interface:
|
28
|
-
text_area = gr.Textbox(
|
29
|
-
value=self.text, lines=10, label="Edit Text", placeholder="Type here..."
|
30
|
-
)
|
31
|
-
|
32
|
-
with gr.Row():
|
33
|
-
save_btn = gr.Button("Save")
|
34
|
-
copy_btn = gr.Button("Copy to Clipboard")
|
35
|
-
|
36
|
-
output = gr.Textbox(label="Status")
|
37
|
-
|
38
|
-
save_btn.click(fn=self.save_text, inputs=[text_area], outputs=[output])
|
39
|
-
|
40
|
-
# Add copy functionality
|
41
|
-
copy_btn.click(
|
42
|
-
fn=None, inputs=text_area, outputs=output, api_name=False, js=js_code
|
43
|
-
)
|
44
|
-
|
45
|
-
interface.launch(share=False, prevent_thread_lock=True)
|
46
|
-
|
47
|
-
while not self._text_saved:
|
48
|
-
time.sleep(0.1)
|
49
|
-
|
50
|
-
return self.text
|
@@ -1,33 +0,0 @@
|
|
1
|
-
"""Mixin for fetching data from results."""
|
2
|
-
|
3
|
-
from functools import partial
|
4
|
-
from itertools import chain
|
5
|
-
|
6
|
-
|
7
|
-
class ResultsFetchMixin:
|
8
|
-
"""Mixin for fetching data from results."""
|
9
|
-
|
10
|
-
def _fetch_list(self, data_type: str, key: str) -> list:
|
11
|
-
"""
|
12
|
-
Return a list of values from the data for a given data type and key.
|
13
|
-
|
14
|
-
Uses the filtered data, not the original data.
|
15
|
-
|
16
|
-
Example:
|
17
|
-
|
18
|
-
>>> from edsl.results import Results
|
19
|
-
>>> r = Results.example()
|
20
|
-
>>> r._fetch_list('answer', 'how_feeling')
|
21
|
-
['OK', 'Great', 'Terrible', 'OK']
|
22
|
-
"""
|
23
|
-
returned_list = []
|
24
|
-
for row in self.data:
|
25
|
-
returned_list.append(row.sub_dicts[data_type].get(key, None))
|
26
|
-
|
27
|
-
return returned_list
|
28
|
-
|
29
|
-
|
30
|
-
if __name__ == "__main__":
|
31
|
-
import doctest
|
32
|
-
|
33
|
-
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
@@ -1,98 +0,0 @@
|
|
1
|
-
class ResultsToolsMixin:
|
2
|
-
def get_themes(
|
3
|
-
self,
|
4
|
-
field: str,
|
5
|
-
context: str,
|
6
|
-
max_values=100,
|
7
|
-
num_themes: int = 10,
|
8
|
-
seed=None,
|
9
|
-
progress_bar=False,
|
10
|
-
print_exceptions=False,
|
11
|
-
) -> list:
|
12
|
-
values = [
|
13
|
-
str(txt)[:1000]
|
14
|
-
for txt in self.shuffle(seed=seed).select(field).to_list()[:max_values]
|
15
|
-
]
|
16
|
-
from edsl import ScenarioList
|
17
|
-
from edsl.questions import QuestionList, QuestionCheckBox
|
18
|
-
|
19
|
-
q = QuestionList(
|
20
|
-
question_text=f"""
|
21
|
-
{context}
|
22
|
-
Here are some examples: { values }.
|
23
|
-
What are some 5-8 word themes that would mostly capture these examples?
|
24
|
-
Please shoot for {num_themes} as target number of themes.
|
25
|
-
""",
|
26
|
-
question_name="themes",
|
27
|
-
)
|
28
|
-
results = q.run(print_exceptions=print_exceptions, progress_bar=progress_bar)
|
29
|
-
return results.select("themes").first()
|
30
|
-
|
31
|
-
def answers_to_themes(
|
32
|
-
self,
|
33
|
-
field,
|
34
|
-
context: str,
|
35
|
-
themes: list,
|
36
|
-
progress_bar=False,
|
37
|
-
print_exceptions=False,
|
38
|
-
) -> dict:
|
39
|
-
from edsl import ScenarioList
|
40
|
-
from edsl import QuestionCheckBox
|
41
|
-
|
42
|
-
values = self.select(field).to_list()
|
43
|
-
scenarios = ScenarioList.from_list("field", values).add_value(
|
44
|
-
"context", context
|
45
|
-
)
|
46
|
-
q = QuestionCheckBox(
|
47
|
-
question_text="""
|
48
|
-
{{ context }}
|
49
|
-
Consider the following response:
|
50
|
-
|
51
|
-
" {{ field }} "
|
52
|
-
|
53
|
-
Please check the themes that apply to these examples.
|
54
|
-
If blank, please check 'None'.
|
55
|
-
""",
|
56
|
-
question_options=themes + ["None", "Other"],
|
57
|
-
question_name="themes",
|
58
|
-
)
|
59
|
-
results = q.by(scenarios).run(
|
60
|
-
progress_bar=progress_bar, print_exceptions=print_exceptions
|
61
|
-
)
|
62
|
-
return {k: v for k, v in results.select("field", "themes").to_list()}
|
63
|
-
|
64
|
-
def apply_themes(self, field: str, new_field: str, answers_to_themes: dict):
|
65
|
-
def translate(x):
|
66
|
-
return answers_to_themes.get(x, "Other")
|
67
|
-
|
68
|
-
self.mutate(f"{new_field} = f({field})", functions_dict={"f": translate})
|
69
|
-
return self
|
70
|
-
|
71
|
-
def auto_theme(
|
72
|
-
self,
|
73
|
-
field: str,
|
74
|
-
context: str,
|
75
|
-
themes: list[str],
|
76
|
-
newfield: str = None,
|
77
|
-
progress_bar=False,
|
78
|
-
print_exceptions=False,
|
79
|
-
) -> tuple:
|
80
|
-
"""
|
81
|
-
:param field: The field to be themed.
|
82
|
-
:param context: The context of the field.
|
83
|
-
:param themes: The list of themes.
|
84
|
-
:param newfield: The new field name.
|
85
|
-
|
86
|
-
"""
|
87
|
-
|
88
|
-
if not newfield:
|
89
|
-
newfield = f"{field}_themes"
|
90
|
-
|
91
|
-
answers_to_themes = self.answers_to_themes(
|
92
|
-
field=field,
|
93
|
-
context=context,
|
94
|
-
themes=themes,
|
95
|
-
progress_bar=progress_bar,
|
96
|
-
print_exceptions=print_exceptions,
|
97
|
-
)
|
98
|
-
return self.apply_themes(field, newfield, answers_to_themes), themes
|
@@ -1,104 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
from typing import Optional, Generator, TYPE_CHECKING
|
3
|
-
import copy
|
4
|
-
|
5
|
-
if TYPE_CHECKING:
|
6
|
-
from edsl.scenarios.Scenario import Scenario
|
7
|
-
from edsl.scenarios.ScenarioList import ScenarioList
|
8
|
-
|
9
|
-
|
10
|
-
class DocumentChunker:
|
11
|
-
def __init__(self, scenario: "Scenario"):
|
12
|
-
self.scenario = scenario
|
13
|
-
|
14
|
-
@staticmethod
|
15
|
-
def _line_chunks(text, num_lines: int) -> Generator[str, None, None]:
|
16
|
-
"""Split a text into chunks of a given size.
|
17
|
-
|
18
|
-
:param text: The text to split.
|
19
|
-
:param num_lines: The number of lines in each chunk.
|
20
|
-
|
21
|
-
Example:
|
22
|
-
|
23
|
-
>>> list(DocumentChunker._line_chunks("This is a test.\\nThis is a test. This is a test.", 1))
|
24
|
-
['This is a test.', 'This is a test. This is a test.']
|
25
|
-
"""
|
26
|
-
lines = text.split("\n")
|
27
|
-
for i in range(0, len(lines), num_lines):
|
28
|
-
chunk = "\n".join(lines[i : i + num_lines])
|
29
|
-
yield chunk
|
30
|
-
|
31
|
-
@staticmethod
|
32
|
-
def _word_chunks(text, num_words: int) -> Generator[str, None, None]:
|
33
|
-
"""Split a text into chunks of a given size.
|
34
|
-
|
35
|
-
:param text: The text to split.
|
36
|
-
:param num_words: The number of words in each chunk.
|
37
|
-
|
38
|
-
Example:
|
39
|
-
|
40
|
-
>>> list(DocumentChunker._word_chunks("This is a test.", 2))
|
41
|
-
['This is', 'a test.']
|
42
|
-
"""
|
43
|
-
words = text.split()
|
44
|
-
for i in range(0, len(words), num_words):
|
45
|
-
chunk = " ".join(words[i : i + num_words])
|
46
|
-
yield chunk
|
47
|
-
|
48
|
-
def chunk(
|
49
|
-
self,
|
50
|
-
field,
|
51
|
-
num_words: Optional[int] = None,
|
52
|
-
num_lines: Optional[int] = None,
|
53
|
-
include_original=False,
|
54
|
-
hash_original=False,
|
55
|
-
) -> ScenarioList:
|
56
|
-
"""Split a field into chunks of a given size.
|
57
|
-
|
58
|
-
:param field: The field to split.
|
59
|
-
:param num_words: The number of words in each chunk.
|
60
|
-
:param num_lines: The number of lines in each chunk.
|
61
|
-
:param include_original: Whether to include the original field in the new scenarios.
|
62
|
-
:param hash_original: Whether to hash the original field in the new scenarios.
|
63
|
-
|
64
|
-
If you specify `include_original=True`, the original field will be included in the new scenarios with an "_original" suffix.
|
65
|
-
"""
|
66
|
-
from edsl.scenarios.ScenarioList import ScenarioList
|
67
|
-
import hashlib
|
68
|
-
|
69
|
-
if num_words is not None:
|
70
|
-
chunks = list(self._word_chunks(self.scenario[field], num_words))
|
71
|
-
|
72
|
-
if num_lines is not None:
|
73
|
-
chunks = list(self._line_chunks(self.scenario[field], num_lines))
|
74
|
-
|
75
|
-
if num_words is None and num_lines is None:
|
76
|
-
raise ValueError("You must specify either num_words or num_lines.")
|
77
|
-
|
78
|
-
if num_words is not None and num_lines is not None:
|
79
|
-
raise ValueError(
|
80
|
-
"You must specify either num_words or num_lines, but not both."
|
81
|
-
)
|
82
|
-
|
83
|
-
scenarios = []
|
84
|
-
for i, chunk in enumerate(chunks):
|
85
|
-
new_scenario = copy.deepcopy(self.scenario)
|
86
|
-
new_scenario[field] = chunk
|
87
|
-
new_scenario[field + "_chunk"] = i
|
88
|
-
new_scenario[field + "_char_count"] = len(chunk)
|
89
|
-
new_scenario[field + "_word_count"] = len(chunk.split())
|
90
|
-
if include_original:
|
91
|
-
if hash_original:
|
92
|
-
new_scenario[field + "_original"] = hashlib.md5(
|
93
|
-
self.scenario[field].encode()
|
94
|
-
).hexdigest()
|
95
|
-
else:
|
96
|
-
new_scenario[field + "_original"] = self.scenario[field]
|
97
|
-
scenarios.append(new_scenario)
|
98
|
-
return ScenarioList(scenarios)
|
99
|
-
|
100
|
-
|
101
|
-
if __name__ == "__main__":
|
102
|
-
import doctest
|
103
|
-
|
104
|
-
doctest.testmod()
|