edsl 0.1.15__py3-none-any.whl → 0.1.40__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/Base.py +348 -38
- edsl/BaseDiff.py +260 -0
- edsl/TemplateLoader.py +24 -0
- edsl/__init__.py +45 -10
- edsl/__version__.py +1 -1
- edsl/agents/Agent.py +842 -144
- edsl/agents/AgentList.py +521 -25
- edsl/agents/Invigilator.py +250 -374
- edsl/agents/InvigilatorBase.py +257 -0
- edsl/agents/PromptConstructor.py +272 -0
- edsl/agents/QuestionInstructionPromptBuilder.py +128 -0
- edsl/agents/QuestionTemplateReplacementsBuilder.py +137 -0
- edsl/agents/descriptors.py +43 -13
- edsl/agents/prompt_helpers.py +129 -0
- edsl/agents/question_option_processor.py +172 -0
- edsl/auto/AutoStudy.py +130 -0
- edsl/auto/StageBase.py +243 -0
- edsl/auto/StageGenerateSurvey.py +178 -0
- edsl/auto/StageLabelQuestions.py +125 -0
- edsl/auto/StagePersona.py +61 -0
- edsl/auto/StagePersonaDimensionValueRanges.py +88 -0
- edsl/auto/StagePersonaDimensionValues.py +74 -0
- edsl/auto/StagePersonaDimensions.py +69 -0
- edsl/auto/StageQuestions.py +74 -0
- edsl/auto/SurveyCreatorPipeline.py +21 -0
- edsl/auto/utilities.py +218 -0
- edsl/base/Base.py +279 -0
- edsl/config.py +115 -113
- edsl/conversation/Conversation.py +290 -0
- edsl/conversation/car_buying.py +59 -0
- edsl/conversation/chips.py +95 -0
- edsl/conversation/mug_negotiation.py +81 -0
- edsl/conversation/next_speaker_utilities.py +93 -0
- edsl/coop/CoopFunctionsMixin.py +15 -0
- edsl/coop/ExpectedParrotKeyHandler.py +125 -0
- edsl/coop/PriceFetcher.py +54 -0
- edsl/coop/__init__.py +1 -0
- edsl/coop/coop.py +1029 -134
- edsl/coop/utils.py +131 -0
- edsl/data/Cache.py +560 -89
- edsl/data/CacheEntry.py +230 -0
- edsl/data/CacheHandler.py +168 -0
- edsl/data/RemoteCacheSync.py +186 -0
- edsl/data/SQLiteDict.py +292 -0
- edsl/data/__init__.py +5 -3
- edsl/data/orm.py +6 -33
- edsl/data_transfer_models.py +74 -27
- edsl/enums.py +165 -8
- edsl/exceptions/BaseException.py +21 -0
- edsl/exceptions/__init__.py +52 -46
- edsl/exceptions/agents.py +33 -15
- edsl/exceptions/cache.py +5 -0
- edsl/exceptions/coop.py +8 -0
- edsl/exceptions/general.py +34 -0
- edsl/exceptions/inference_services.py +5 -0
- edsl/exceptions/jobs.py +15 -0
- edsl/exceptions/language_models.py +46 -1
- edsl/exceptions/questions.py +80 -5
- edsl/exceptions/results.py +16 -5
- edsl/exceptions/scenarios.py +29 -0
- edsl/exceptions/surveys.py +13 -10
- edsl/inference_services/AnthropicService.py +106 -0
- edsl/inference_services/AvailableModelCacheHandler.py +184 -0
- edsl/inference_services/AvailableModelFetcher.py +215 -0
- edsl/inference_services/AwsBedrock.py +118 -0
- edsl/inference_services/AzureAI.py +215 -0
- edsl/inference_services/DeepInfraService.py +18 -0
- edsl/inference_services/GoogleService.py +143 -0
- edsl/inference_services/GroqService.py +20 -0
- edsl/inference_services/InferenceServiceABC.py +80 -0
- edsl/inference_services/InferenceServicesCollection.py +138 -0
- edsl/inference_services/MistralAIService.py +120 -0
- edsl/inference_services/OllamaService.py +18 -0
- edsl/inference_services/OpenAIService.py +236 -0
- edsl/inference_services/PerplexityService.py +160 -0
- edsl/inference_services/ServiceAvailability.py +135 -0
- edsl/inference_services/TestService.py +90 -0
- edsl/inference_services/TogetherAIService.py +172 -0
- edsl/inference_services/data_structures.py +134 -0
- edsl/inference_services/models_available_cache.py +118 -0
- edsl/inference_services/rate_limits_cache.py +25 -0
- edsl/inference_services/registry.py +41 -0
- edsl/inference_services/write_available.py +10 -0
- edsl/jobs/AnswerQuestionFunctionConstructor.py +223 -0
- edsl/jobs/Answers.py +21 -20
- edsl/jobs/FetchInvigilator.py +47 -0
- edsl/jobs/InterviewTaskManager.py +98 -0
- edsl/jobs/InterviewsConstructor.py +50 -0
- edsl/jobs/Jobs.py +684 -206
- edsl/jobs/JobsChecks.py +172 -0
- edsl/jobs/JobsComponentConstructor.py +189 -0
- edsl/jobs/JobsPrompts.py +270 -0
- edsl/jobs/JobsRemoteInferenceHandler.py +311 -0
- edsl/jobs/JobsRemoteInferenceLogger.py +239 -0
- edsl/jobs/RequestTokenEstimator.py +30 -0
- edsl/jobs/async_interview_runner.py +138 -0
- edsl/jobs/buckets/BucketCollection.py +104 -0
- edsl/jobs/buckets/ModelBuckets.py +65 -0
- edsl/jobs/buckets/TokenBucket.py +283 -0
- edsl/jobs/buckets/TokenBucketAPI.py +211 -0
- edsl/jobs/buckets/TokenBucketClient.py +191 -0
- edsl/jobs/check_survey_scenario_compatibility.py +85 -0
- edsl/jobs/data_structures.py +120 -0
- edsl/jobs/decorators.py +35 -0
- edsl/jobs/interviews/Interview.py +392 -0
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -0
- edsl/jobs/interviews/InterviewExceptionEntry.py +186 -0
- edsl/jobs/interviews/InterviewStatistic.py +63 -0
- edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -0
- edsl/jobs/interviews/InterviewStatusDictionary.py +78 -0
- edsl/jobs/interviews/InterviewStatusLog.py +92 -0
- edsl/jobs/interviews/ReportErrors.py +66 -0
- edsl/jobs/interviews/interview_status_enum.py +9 -0
- edsl/jobs/jobs_status_enums.py +9 -0
- edsl/jobs/loggers/HTMLTableJobLogger.py +304 -0
- edsl/jobs/results_exceptions_handler.py +98 -0
- edsl/jobs/runners/JobsRunnerAsyncio.py +151 -110
- edsl/jobs/runners/JobsRunnerStatus.py +298 -0
- edsl/jobs/tasks/QuestionTaskCreator.py +244 -0
- edsl/jobs/tasks/TaskCreators.py +64 -0
- edsl/jobs/tasks/TaskHistory.py +470 -0
- edsl/jobs/tasks/TaskStatusLog.py +23 -0
- edsl/jobs/tasks/task_status_enum.py +161 -0
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -0
- edsl/jobs/tokens/TokenUsage.py +34 -0
- edsl/language_models/ComputeCost.py +63 -0
- edsl/language_models/LanguageModel.py +507 -386
- edsl/language_models/ModelList.py +164 -0
- edsl/language_models/PriceManager.py +127 -0
- edsl/language_models/RawResponseHandler.py +106 -0
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -0
- edsl/language_models/__init__.py +1 -8
- edsl/language_models/fake_openai_call.py +15 -0
- edsl/language_models/fake_openai_service.py +61 -0
- edsl/language_models/key_management/KeyLookup.py +63 -0
- edsl/language_models/key_management/KeyLookupBuilder.py +273 -0
- edsl/language_models/key_management/KeyLookupCollection.py +38 -0
- edsl/language_models/key_management/__init__.py +0 -0
- edsl/language_models/key_management/models.py +131 -0
- edsl/language_models/model.py +256 -0
- edsl/language_models/repair.py +109 -41
- edsl/language_models/utilities.py +65 -0
- edsl/notebooks/Notebook.py +263 -0
- edsl/notebooks/NotebookToLaTeX.py +142 -0
- edsl/notebooks/__init__.py +1 -0
- edsl/prompts/Prompt.py +222 -93
- edsl/prompts/__init__.py +1 -1
- edsl/questions/ExceptionExplainer.py +77 -0
- edsl/questions/HTMLQuestion.py +103 -0
- edsl/questions/QuestionBase.py +518 -0
- edsl/questions/QuestionBasePromptsMixin.py +221 -0
- edsl/questions/QuestionBudget.py +164 -67
- edsl/questions/QuestionCheckBox.py +281 -62
- edsl/questions/QuestionDict.py +343 -0
- edsl/questions/QuestionExtract.py +136 -50
- edsl/questions/QuestionFreeText.py +79 -55
- edsl/questions/QuestionFunctional.py +138 -41
- edsl/questions/QuestionList.py +184 -57
- edsl/questions/QuestionMatrix.py +265 -0
- edsl/questions/QuestionMultipleChoice.py +293 -69
- edsl/questions/QuestionNumerical.py +109 -56
- edsl/questions/QuestionRank.py +244 -49
- edsl/questions/Quick.py +41 -0
- edsl/questions/SimpleAskMixin.py +74 -0
- edsl/questions/__init__.py +9 -6
- edsl/questions/{AnswerValidatorMixin.py → answer_validator_mixin.py} +153 -38
- edsl/questions/compose_questions.py +13 -7
- edsl/questions/data_structures.py +20 -0
- edsl/questions/decorators.py +21 -0
- edsl/questions/derived/QuestionLikertFive.py +28 -26
- edsl/questions/derived/QuestionLinearScale.py +41 -28
- edsl/questions/derived/QuestionTopK.py +34 -26
- edsl/questions/derived/QuestionYesNo.py +40 -27
- edsl/questions/descriptors.py +228 -74
- edsl/questions/loop_processor.py +149 -0
- edsl/questions/prompt_templates/question_budget.jinja +13 -0
- edsl/questions/prompt_templates/question_checkbox.jinja +32 -0
- edsl/questions/prompt_templates/question_extract.jinja +11 -0
- edsl/questions/prompt_templates/question_free_text.jinja +3 -0
- edsl/questions/prompt_templates/question_linear_scale.jinja +11 -0
- edsl/questions/prompt_templates/question_list.jinja +17 -0
- edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -0
- edsl/questions/prompt_templates/question_numerical.jinja +37 -0
- edsl/questions/question_base_gen_mixin.py +168 -0
- edsl/questions/question_registry.py +130 -46
- edsl/questions/register_questions_meta.py +71 -0
- edsl/questions/response_validator_abc.py +188 -0
- edsl/questions/response_validator_factory.py +34 -0
- edsl/questions/settings.py +5 -2
- edsl/questions/templates/__init__.py +0 -0
- edsl/questions/templates/budget/__init__.py +0 -0
- edsl/questions/templates/budget/answering_instructions.jinja +7 -0
- edsl/questions/templates/budget/question_presentation.jinja +7 -0
- edsl/questions/templates/checkbox/__init__.py +0 -0
- edsl/questions/templates/checkbox/answering_instructions.jinja +10 -0
- edsl/questions/templates/checkbox/question_presentation.jinja +22 -0
- edsl/questions/templates/dict/__init__.py +0 -0
- edsl/questions/templates/dict/answering_instructions.jinja +21 -0
- edsl/questions/templates/dict/question_presentation.jinja +1 -0
- edsl/questions/templates/extract/__init__.py +0 -0
- edsl/questions/templates/extract/answering_instructions.jinja +7 -0
- edsl/questions/templates/extract/question_presentation.jinja +1 -0
- edsl/questions/templates/free_text/__init__.py +0 -0
- edsl/questions/templates/free_text/answering_instructions.jinja +0 -0
- edsl/questions/templates/free_text/question_presentation.jinja +1 -0
- edsl/questions/templates/likert_five/__init__.py +0 -0
- edsl/questions/templates/likert_five/answering_instructions.jinja +10 -0
- edsl/questions/templates/likert_five/question_presentation.jinja +12 -0
- edsl/questions/templates/linear_scale/__init__.py +0 -0
- edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -0
- edsl/questions/templates/linear_scale/question_presentation.jinja +5 -0
- edsl/questions/templates/list/__init__.py +0 -0
- edsl/questions/templates/list/answering_instructions.jinja +4 -0
- edsl/questions/templates/list/question_presentation.jinja +5 -0
- edsl/questions/templates/matrix/__init__.py +1 -0
- edsl/questions/templates/matrix/answering_instructions.jinja +5 -0
- edsl/questions/templates/matrix/question_presentation.jinja +20 -0
- edsl/questions/templates/multiple_choice/__init__.py +0 -0
- edsl/questions/templates/multiple_choice/answering_instructions.jinja +9 -0
- edsl/questions/templates/multiple_choice/html.jinja +0 -0
- edsl/questions/templates/multiple_choice/question_presentation.jinja +12 -0
- edsl/questions/templates/numerical/__init__.py +0 -0
- edsl/questions/templates/numerical/answering_instructions.jinja +7 -0
- edsl/questions/templates/numerical/question_presentation.jinja +7 -0
- edsl/questions/templates/rank/__init__.py +0 -0
- edsl/questions/templates/rank/answering_instructions.jinja +11 -0
- edsl/questions/templates/rank/question_presentation.jinja +15 -0
- edsl/questions/templates/top_k/__init__.py +0 -0
- edsl/questions/templates/top_k/answering_instructions.jinja +8 -0
- edsl/questions/templates/top_k/question_presentation.jinja +22 -0
- edsl/questions/templates/yes_no/__init__.py +0 -0
- edsl/questions/templates/yes_no/answering_instructions.jinja +6 -0
- edsl/questions/templates/yes_no/question_presentation.jinja +12 -0
- edsl/results/CSSParameterizer.py +108 -0
- edsl/results/Dataset.py +550 -19
- edsl/results/DatasetExportMixin.py +594 -0
- edsl/results/DatasetTree.py +295 -0
- edsl/results/MarkdownToDocx.py +122 -0
- edsl/results/MarkdownToPDF.py +111 -0
- edsl/results/Result.py +477 -173
- edsl/results/Results.py +987 -269
- edsl/results/ResultsExportMixin.py +28 -125
- edsl/results/ResultsGGMixin.py +83 -15
- edsl/results/TableDisplay.py +125 -0
- edsl/results/TextEditor.py +50 -0
- edsl/results/__init__.py +1 -1
- edsl/results/file_exports.py +252 -0
- edsl/results/results_fetch_mixin.py +33 -0
- edsl/results/results_selector.py +145 -0
- edsl/results/results_tools_mixin.py +98 -0
- edsl/results/smart_objects.py +96 -0
- edsl/results/table_data_class.py +12 -0
- edsl/results/table_display.css +78 -0
- edsl/results/table_renderers.py +118 -0
- edsl/results/tree_explore.py +115 -0
- edsl/scenarios/ConstructDownloadLink.py +109 -0
- edsl/scenarios/DocumentChunker.py +102 -0
- edsl/scenarios/DocxScenario.py +16 -0
- edsl/scenarios/FileStore.py +543 -0
- edsl/scenarios/PdfExtractor.py +40 -0
- edsl/scenarios/Scenario.py +431 -62
- edsl/scenarios/ScenarioHtmlMixin.py +65 -0
- edsl/scenarios/ScenarioList.py +1415 -45
- edsl/scenarios/ScenarioListExportMixin.py +45 -0
- edsl/scenarios/ScenarioListPdfMixin.py +239 -0
- edsl/scenarios/__init__.py +2 -0
- edsl/scenarios/directory_scanner.py +96 -0
- edsl/scenarios/file_methods.py +85 -0
- edsl/scenarios/handlers/__init__.py +13 -0
- edsl/scenarios/handlers/csv.py +49 -0
- edsl/scenarios/handlers/docx.py +76 -0
- edsl/scenarios/handlers/html.py +37 -0
- edsl/scenarios/handlers/json.py +111 -0
- edsl/scenarios/handlers/latex.py +5 -0
- edsl/scenarios/handlers/md.py +51 -0
- edsl/scenarios/handlers/pdf.py +68 -0
- edsl/scenarios/handlers/png.py +39 -0
- edsl/scenarios/handlers/pptx.py +105 -0
- edsl/scenarios/handlers/py.py +294 -0
- edsl/scenarios/handlers/sql.py +313 -0
- edsl/scenarios/handlers/sqlite.py +149 -0
- edsl/scenarios/handlers/txt.py +33 -0
- edsl/scenarios/scenario_join.py +131 -0
- edsl/scenarios/scenario_selector.py +156 -0
- edsl/shared.py +1 -0
- edsl/study/ObjectEntry.py +173 -0
- edsl/study/ProofOfWork.py +113 -0
- edsl/study/SnapShot.py +80 -0
- edsl/study/Study.py +521 -0
- edsl/study/__init__.py +4 -0
- edsl/surveys/ConstructDAG.py +92 -0
- edsl/surveys/DAG.py +92 -11
- edsl/surveys/EditSurvey.py +221 -0
- edsl/surveys/InstructionHandler.py +100 -0
- edsl/surveys/Memory.py +9 -4
- edsl/surveys/MemoryManagement.py +72 -0
- edsl/surveys/MemoryPlan.py +156 -35
- edsl/surveys/Rule.py +221 -74
- edsl/surveys/RuleCollection.py +241 -61
- edsl/surveys/RuleManager.py +172 -0
- edsl/surveys/Simulator.py +75 -0
- edsl/surveys/Survey.py +1079 -339
- edsl/surveys/SurveyCSS.py +273 -0
- edsl/surveys/SurveyExportMixin.py +235 -40
- edsl/surveys/SurveyFlowVisualization.py +181 -0
- edsl/surveys/SurveyQualtricsImport.py +284 -0
- edsl/surveys/SurveyToApp.py +141 -0
- edsl/surveys/__init__.py +4 -2
- edsl/surveys/base.py +19 -3
- edsl/surveys/descriptors.py +17 -6
- edsl/surveys/instructions/ChangeInstruction.py +48 -0
- edsl/surveys/instructions/Instruction.py +56 -0
- edsl/surveys/instructions/InstructionCollection.py +82 -0
- edsl/surveys/instructions/__init__.py +0 -0
- edsl/templates/error_reporting/base.html +24 -0
- edsl/templates/error_reporting/exceptions_by_model.html +35 -0
- edsl/templates/error_reporting/exceptions_by_question_name.html +17 -0
- edsl/templates/error_reporting/exceptions_by_type.html +17 -0
- edsl/templates/error_reporting/interview_details.html +116 -0
- edsl/templates/error_reporting/interviews.html +19 -0
- edsl/templates/error_reporting/overview.html +5 -0
- edsl/templates/error_reporting/performance_plot.html +2 -0
- edsl/templates/error_reporting/report.css +74 -0
- edsl/templates/error_reporting/report.html +118 -0
- edsl/templates/error_reporting/report.js +25 -0
- edsl/tools/__init__.py +1 -0
- edsl/tools/clusters.py +192 -0
- edsl/tools/embeddings.py +27 -0
- edsl/tools/embeddings_plotting.py +118 -0
- edsl/tools/plotting.py +112 -0
- edsl/tools/summarize.py +18 -0
- edsl/utilities/PrettyList.py +56 -0
- edsl/utilities/SystemInfo.py +5 -0
- edsl/utilities/__init__.py +21 -20
- edsl/utilities/ast_utilities.py +3 -0
- edsl/utilities/data/Registry.py +2 -0
- edsl/utilities/decorators.py +41 -0
- edsl/utilities/gcp_bucket/__init__.py +0 -0
- edsl/utilities/gcp_bucket/cloud_storage.py +96 -0
- edsl/utilities/interface.py +310 -60
- edsl/utilities/is_notebook.py +18 -0
- edsl/utilities/is_valid_variable_name.py +11 -0
- edsl/utilities/naming_utilities.py +263 -0
- edsl/utilities/remove_edsl_version.py +24 -0
- edsl/utilities/repair_functions.py +28 -0
- edsl/utilities/restricted_python.py +70 -0
- edsl/utilities/utilities.py +203 -13
- edsl-0.1.40.dist-info/METADATA +111 -0
- edsl-0.1.40.dist-info/RECORD +362 -0
- {edsl-0.1.15.dist-info → edsl-0.1.40.dist-info}/WHEEL +1 -1
- edsl/agents/AgentListExportMixin.py +0 -24
- edsl/coop/old.py +0 -31
- edsl/data/Database.py +0 -141
- edsl/data/crud.py +0 -121
- edsl/jobs/Interview.py +0 -435
- edsl/jobs/JobsRunner.py +0 -63
- edsl/jobs/JobsRunnerStatusMixin.py +0 -115
- edsl/jobs/base.py +0 -47
- edsl/jobs/buckets.py +0 -178
- edsl/jobs/runners/JobsRunnerDryRun.py +0 -19
- edsl/jobs/runners/JobsRunnerStreaming.py +0 -54
- edsl/jobs/task_management.py +0 -215
- edsl/jobs/token_tracking.py +0 -78
- edsl/language_models/DeepInfra.py +0 -69
- edsl/language_models/OpenAI.py +0 -98
- edsl/language_models/model_interfaces/GeminiPro.py +0 -66
- edsl/language_models/model_interfaces/LanguageModelOpenAIFour.py +0 -8
- edsl/language_models/model_interfaces/LanguageModelOpenAIThreeFiveTurbo.py +0 -8
- edsl/language_models/model_interfaces/LlamaTwo13B.py +0 -21
- edsl/language_models/model_interfaces/LlamaTwo70B.py +0 -21
- edsl/language_models/model_interfaces/Mixtral8x7B.py +0 -24
- edsl/language_models/registry.py +0 -81
- edsl/language_models/schemas.py +0 -15
- edsl/language_models/unused/ReplicateBase.py +0 -83
- edsl/prompts/QuestionInstructionsBase.py +0 -6
- edsl/prompts/library/agent_instructions.py +0 -29
- edsl/prompts/library/agent_persona.py +0 -17
- edsl/prompts/library/question_budget.py +0 -26
- edsl/prompts/library/question_checkbox.py +0 -32
- edsl/prompts/library/question_extract.py +0 -19
- edsl/prompts/library/question_freetext.py +0 -14
- edsl/prompts/library/question_linear_scale.py +0 -20
- edsl/prompts/library/question_list.py +0 -22
- edsl/prompts/library/question_multiple_choice.py +0 -44
- edsl/prompts/library/question_numerical.py +0 -31
- edsl/prompts/library/question_rank.py +0 -21
- edsl/prompts/prompt_config.py +0 -33
- edsl/prompts/registry.py +0 -185
- edsl/questions/Question.py +0 -240
- edsl/report/InputOutputDataTypes.py +0 -134
- edsl/report/RegressionMixin.py +0 -28
- edsl/report/ReportOutputs.py +0 -1228
- edsl/report/ResultsFetchMixin.py +0 -106
- edsl/report/ResultsOutputMixin.py +0 -14
- edsl/report/demo.ipynb +0 -645
- edsl/results/ResultsDBMixin.py +0 -184
- edsl/surveys/SurveyFlowVisualizationMixin.py +0 -92
- edsl/trackers/Tracker.py +0 -91
- edsl/trackers/TrackerAPI.py +0 -196
- edsl/trackers/TrackerTasks.py +0 -70
- edsl/utilities/pastebin.py +0 -141
- edsl-0.1.15.dist-info/METADATA +0 -69
- edsl-0.1.15.dist-info/RECORD +0 -142
- /edsl/{language_models/model_interfaces → inference_services}/__init__.py +0 -0
- /edsl/{report/__init__.py → jobs/runners/JobsRunnerStatusData.py} +0 -0
- /edsl/{trackers/__init__.py → language_models/ServiceDataSources.py} +0 -0
- {edsl-0.1.15.dist-info → edsl-0.1.40.dist-info}/LICENSE +0 -0
@@ -1,26 +1,14 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
-
import textwrap
|
3
2
|
from typing import Optional
|
3
|
+
|
4
4
|
from edsl.questions.descriptors import QuestionOptionsDescriptor, OptionLabelDescriptor
|
5
5
|
from edsl.questions.QuestionMultipleChoice import QuestionMultipleChoice
|
6
6
|
|
7
|
+
from edsl.questions.decorators import inject_exception
|
7
8
|
|
8
|
-
class QuestionLinearScale(QuestionMultipleChoice):
|
9
|
-
"""
|
10
|
-
This question asks the user to respond to a statement on a linear scale.
|
11
|
-
|
12
|
-
Arguments:
|
13
|
-
- `question_name` is the name of the question (string)
|
14
|
-
- `question_text` is the text of the question (string)
|
15
|
-
- `question_options` are the options the user should select from (list of integers)
|
16
|
-
|
17
|
-
Optional arguments:
|
18
|
-
- `instructions` are the instructions for the question (string). If not provided, the default instructions are used. To view them, run `QuestionLinearScale.default_instructions`
|
19
|
-
- `option_labels` maps question_options to labels (dictionary mapping integers to strings)
|
20
|
-
- `short_names_dict` maps question_options to short names (dictionary mapping strings to strings)
|
21
9
|
|
22
|
-
|
23
|
-
"""
|
10
|
+
class QuestionLinearScale(QuestionMultipleChoice):
|
11
|
+
"""This question prompts the agent to respond to a statement on a linear scale."""
|
24
12
|
|
25
13
|
question_type = "linear_scale"
|
26
14
|
option_labels: Optional[dict[int, str]] = OptionLabelDescriptor()
|
@@ -28,50 +16,75 @@ class QuestionLinearScale(QuestionMultipleChoice):
|
|
28
16
|
|
29
17
|
def __init__(
|
30
18
|
self,
|
19
|
+
question_name: str,
|
31
20
|
question_text: str,
|
32
21
|
question_options: list[int],
|
33
|
-
question_name: str,
|
34
|
-
short_names_dict: Optional[dict[str, str]] = None,
|
35
22
|
option_labels: Optional[dict[int, str]] = None,
|
23
|
+
answering_instructions: Optional[str] = None,
|
24
|
+
question_presentation: Optional[str] = None,
|
25
|
+
include_comment: Optional[bool] = True,
|
36
26
|
):
|
27
|
+
"""Instantiate a new QuestionLinearScale.
|
28
|
+
|
29
|
+
:param question_name: The name of the question.
|
30
|
+
:param question_text: The text of the question.
|
31
|
+
:param question_options: The options the respondent should select from.
|
32
|
+
:param option_labels: Maps question_options to labels.
|
33
|
+
:param instructions: Instructions for the question. If not provided, the default instructions are used. To view them, run `QuestionLinearScale.default_instructions`.
|
34
|
+
"""
|
37
35
|
super().__init__(
|
36
|
+
question_name=question_name,
|
38
37
|
question_text=question_text,
|
39
38
|
question_options=question_options,
|
40
|
-
|
41
|
-
|
39
|
+
use_code=False, # question linear scale will have its own code
|
40
|
+
include_comment=include_comment,
|
42
41
|
)
|
43
42
|
self.question_options = question_options
|
44
|
-
|
43
|
+
if isinstance(option_labels, str):
|
44
|
+
self.option_labels = option_labels
|
45
|
+
else:
|
46
|
+
self.option_labels = (
|
47
|
+
{int(k): v for k, v in option_labels.items()} if option_labels else {}
|
48
|
+
)
|
49
|
+
self.answering_instructions = answering_instructions
|
50
|
+
self.question_presentation = question_presentation
|
45
51
|
|
46
52
|
################
|
47
53
|
# Helpful
|
48
54
|
################
|
49
55
|
@classmethod
|
50
|
-
|
56
|
+
@inject_exception
|
57
|
+
def example(cls, include_comment: bool = True) -> QuestionLinearScale:
|
58
|
+
"""Return an example of a linear scale question."""
|
51
59
|
return cls(
|
52
60
|
question_text="How much do you like ice cream?",
|
53
61
|
question_options=[1, 2, 3, 4, 5],
|
54
62
|
question_name="ice_cream",
|
55
63
|
option_labels={1: "I hate it", 5: "I love it"},
|
64
|
+
include_comment=include_comment,
|
56
65
|
)
|
57
66
|
|
58
67
|
|
59
68
|
def main():
|
69
|
+
"""Create an example of a linear scale question and demonstrate its functionality."""
|
60
70
|
from edsl.questions.derived.QuestionLinearScale import QuestionLinearScale
|
61
71
|
|
62
72
|
q = QuestionLinearScale.example()
|
63
73
|
q.question_text
|
64
74
|
q.question_options
|
65
75
|
q.question_name
|
66
|
-
q.short_names_dict
|
67
76
|
# validate an answer
|
68
|
-
q.
|
77
|
+
q._validate_answer({"answer": 3, "comment": "I like custard"})
|
69
78
|
# translate answer code
|
70
|
-
q.
|
79
|
+
q._translate_answer_code_to_answer(3, {})
|
71
80
|
# simulate answer
|
72
|
-
q.
|
73
|
-
q.
|
74
|
-
q.
|
81
|
+
q._simulate_answer()
|
82
|
+
q._simulate_answer(human_readable=False)
|
83
|
+
q._validate_answer(q._simulate_answer(human_readable=False))
|
75
84
|
# serialization (inherits from Question)
|
76
85
|
q.to_dict()
|
77
86
|
assert q.from_dict(q.to_dict()) == q
|
87
|
+
|
88
|
+
import doctest
|
89
|
+
|
90
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
@@ -1,26 +1,13 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
from typing import Optional
|
3
|
-
|
3
|
+
|
4
|
+
from edsl.exceptions.questions import QuestionCreationValidationError
|
4
5
|
from edsl.questions.QuestionCheckBox import QuestionCheckBox
|
6
|
+
from edsl.questions.decorators import inject_exception
|
5
7
|
|
6
8
|
|
7
9
|
class QuestionTopK(QuestionCheckBox):
|
8
|
-
"""
|
9
|
-
This question asks the user to select exactly K options from a list.
|
10
|
-
|
11
|
-
Arguments:
|
12
|
-
- `question_name` is the name of the question (string)
|
13
|
-
- `question_text` is the text of the question (string)
|
14
|
-
- `question_options` are the options the user should select from (list of strings)
|
15
|
-
- `min_selections` is the minimum number of options that must be selected (positive integer).
|
16
|
-
- `max_selections` is the maximum number of options that must be selected (positive integer). Must be equal to `min_selections`
|
17
|
-
|
18
|
-
Optional arguments:
|
19
|
-
- `instructions` are the instructions for the question (string). If not provided, the default instructions are used. To view them, run `QuestionTopK.default_instructions`
|
20
|
-
- `short_names_dict` maps question_options to short names (dictionary mapping strings to strings)
|
21
|
-
|
22
|
-
For an example, run `QuestionTopK.example()`
|
23
|
-
"""
|
10
|
+
"""This question prompts the agent to select exactly K options from a list."""
|
24
11
|
|
25
12
|
question_type = "top_k"
|
26
13
|
|
@@ -31,15 +18,29 @@ class QuestionTopK(QuestionCheckBox):
|
|
31
18
|
question_options: list[str],
|
32
19
|
min_selections: int,
|
33
20
|
max_selections: int,
|
34
|
-
|
21
|
+
question_presentation: Optional[str] = None,
|
22
|
+
answering_instructions: Optional[str] = None,
|
23
|
+
include_comment: Optional[bool] = True,
|
24
|
+
use_code: Optional[bool] = True,
|
35
25
|
):
|
26
|
+
"""Initialize the question.
|
27
|
+
|
28
|
+
:param question_name: The name of the question.
|
29
|
+
:param question_text: The text of the question.
|
30
|
+
:param question_options: The options the respondent should select from.
|
31
|
+
:param instructions: Instructions for the question. If not provided, the default instructions are used. To view them, run `QuestionTopK.default_instructions`.
|
32
|
+
:param num_selections: The number of options that must be selected.
|
33
|
+
"""
|
36
34
|
super().__init__(
|
37
35
|
question_name=question_name,
|
38
36
|
question_text=question_text,
|
39
37
|
question_options=question_options,
|
40
|
-
short_names_dict=short_names_dict,
|
41
38
|
min_selections=min_selections,
|
42
39
|
max_selections=max_selections,
|
40
|
+
question_presentation=question_presentation,
|
41
|
+
answering_instructions=answering_instructions,
|
42
|
+
include_comment=include_comment,
|
43
|
+
use_code=use_code,
|
43
44
|
)
|
44
45
|
if min_selections != max_selections:
|
45
46
|
raise QuestionCreationValidationError(
|
@@ -54,32 +55,39 @@ class QuestionTopK(QuestionCheckBox):
|
|
54
55
|
# Helpful
|
55
56
|
################
|
56
57
|
@classmethod
|
57
|
-
|
58
|
+
@inject_exception
|
59
|
+
def example(cls, include_comment: bool = True) -> QuestionTopK:
|
60
|
+
"""Return an example question."""
|
58
61
|
return cls(
|
59
62
|
question_name="two_fruits",
|
60
63
|
question_text="Which of the following fruits do you prefer?",
|
61
64
|
question_options=["apple", "banana", "carrot", "durian"],
|
62
65
|
min_selections=2,
|
63
66
|
max_selections=2,
|
67
|
+
include_comment=include_comment,
|
64
68
|
)
|
65
69
|
|
66
70
|
|
67
71
|
def main():
|
72
|
+
"""Test QuestionTopK."""
|
68
73
|
from edsl.questions.derived.QuestionTopK import QuestionTopK
|
69
74
|
|
70
75
|
q = QuestionTopK.example()
|
71
76
|
q.question_text
|
72
77
|
q.question_options
|
73
78
|
q.question_name
|
74
|
-
q.short_names_dict
|
75
79
|
# validate an answer
|
76
|
-
q.
|
80
|
+
q._validate_answer({"answer": [0, 3], "comment": "I like custard"})
|
77
81
|
# translate answer code
|
78
|
-
q.
|
82
|
+
q._translate_answer_code_to_answer([0, 3], {})
|
79
83
|
# simulate answer
|
80
|
-
q.
|
81
|
-
q.
|
82
|
-
q.
|
84
|
+
q._simulate_answer()
|
85
|
+
q._simulate_answer(human_readable=False)
|
86
|
+
q._validate_answer(q._simulate_answer(human_readable=False))
|
83
87
|
# serialization (inherits from Question)
|
84
88
|
q.to_dict()
|
85
89
|
assert q.from_dict(q.to_dict()) == q
|
90
|
+
|
91
|
+
import doctest
|
92
|
+
|
93
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
@@ -1,23 +1,13 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
+
from typing import Optional
|
2
3
|
from edsl.questions.descriptors import QuestionOptionsDescriptor
|
3
4
|
from edsl.questions.QuestionMultipleChoice import QuestionMultipleChoice
|
4
5
|
|
6
|
+
from edsl.questions.decorators import inject_exception
|
5
7
|
|
6
|
-
class QuestionYesNo(QuestionMultipleChoice):
|
7
|
-
"""
|
8
|
-
This question asks the user to respond with "Yes" or "No".
|
9
|
-
|
10
|
-
Arguments:
|
11
|
-
- `question_name` is the name of the question (string)
|
12
|
-
- `question_text` is the text of the question (string)
|
13
|
-
- `question_options` are the options the user should select from (list of strings)
|
14
|
-
|
15
|
-
Optional arguments:
|
16
|
-
- `instructions` are the instructions for the question (string). If not provided, the default instructions are used. To view them, run `QuestionYesNo.default_instructions`
|
17
|
-
- `short_names_dict` maps question_options to short names (dictionary mapping strings to strings)
|
18
8
|
|
19
|
-
|
20
|
-
"""
|
9
|
+
class QuestionYesNo(QuestionMultipleChoice):
|
10
|
+
"""This question prompts the agent to respond with 'Yes' or 'No'."""
|
21
11
|
|
22
12
|
question_type = "yes_no"
|
23
13
|
question_options = QuestionOptionsDescriptor(num_choices=2)
|
@@ -26,14 +16,25 @@ class QuestionYesNo(QuestionMultipleChoice):
|
|
26
16
|
self,
|
27
17
|
question_name: str,
|
28
18
|
question_text: str,
|
29
|
-
|
30
|
-
|
19
|
+
question_options: list[str] = ["No", "Yes"],
|
20
|
+
answering_instructions: Optional[str] = None,
|
21
|
+
question_presentation: Optional[str] = None,
|
22
|
+
include_comment: Optional[bool] = True,
|
31
23
|
):
|
24
|
+
"""Instantiate a new QuestionYesNo.
|
25
|
+
|
26
|
+
:param question_name: The name of the question.
|
27
|
+
:param question_text: The text of the question.
|
28
|
+
:param instructions: Instructions for the question. If not provided, the default instructions are used. To view them, run `QuestionYesNo.default_instructions`.
|
29
|
+
"""
|
32
30
|
super().__init__(
|
33
31
|
question_name=question_name,
|
34
32
|
question_text=question_text,
|
35
33
|
question_options=question_options,
|
36
|
-
|
34
|
+
use_code=False,
|
35
|
+
answering_instructions=answering_instructions,
|
36
|
+
question_presentation=question_presentation,
|
37
|
+
include_comment=include_comment,
|
37
38
|
)
|
38
39
|
self.question_options = question_options
|
39
40
|
|
@@ -41,29 +42,41 @@ class QuestionYesNo(QuestionMultipleChoice):
|
|
41
42
|
# Helpful
|
42
43
|
################
|
43
44
|
@classmethod
|
44
|
-
|
45
|
+
@inject_exception
|
46
|
+
def example(cls, include_comment: bool = True) -> QuestionYesNo:
|
47
|
+
"""Return an example of a yes/no question."""
|
45
48
|
return cls(
|
46
|
-
question_name="
|
47
|
-
question_text="Is
|
48
|
-
|
49
|
+
question_name="is_it_equal",
|
50
|
+
question_text="Is 5 + 5 equal to 11?",
|
51
|
+
include_comment=include_comment,
|
49
52
|
)
|
50
53
|
|
51
54
|
|
52
55
|
def main():
|
56
|
+
"""Create an example of a yes/no question and demonstrate its functionality."""
|
53
57
|
from edsl.questions.derived.QuestionYesNo import QuestionYesNo
|
54
58
|
|
55
59
|
q = QuestionYesNo.example()
|
56
60
|
q.question_text
|
57
61
|
q.question_options
|
58
62
|
q.question_name
|
59
|
-
q.short_names_dict
|
60
63
|
# validate an answer
|
61
|
-
q.
|
64
|
+
q._validate_answer({"answer": 0, "comment": "I like custard"})
|
62
65
|
# translate answer code
|
63
|
-
q.
|
64
|
-
q.
|
65
|
-
q.
|
66
|
-
q.
|
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))
|
67
70
|
# serialization (inherits from Question)
|
68
71
|
q.to_dict()
|
69
72
|
assert q.from_dict(q.to_dict()) == q
|
73
|
+
|
74
|
+
import doctest
|
75
|
+
|
76
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|
77
|
+
|
78
|
+
|
79
|
+
if __name__ == "__main__":
|
80
|
+
import doctest
|
81
|
+
|
82
|
+
doctest.testmod(optionflags=doctest.ELLIPSIS)
|