edsl 0.1.39.dev3__py3-none-any.whl → 0.1.39.dev5__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 +413 -332
- edsl/BaseDiff.py +260 -260
- edsl/TemplateLoader.py +24 -24
- edsl/__init__.py +57 -49
- edsl/__version__.py +1 -1
- edsl/agents/Agent.py +1071 -867
- edsl/agents/AgentList.py +551 -413
- edsl/agents/Invigilator.py +284 -233
- edsl/agents/InvigilatorBase.py +257 -270
- edsl/agents/PromptConstructor.py +272 -354
- edsl/agents/QuestionInstructionPromptBuilder.py +128 -0
- edsl/agents/QuestionTemplateReplacementsBuilder.py +137 -0
- edsl/agents/__init__.py +2 -3
- edsl/agents/descriptors.py +99 -99
- edsl/agents/prompt_helpers.py +129 -129
- edsl/agents/question_option_processor.py +172 -0
- edsl/auto/AutoStudy.py +130 -117
- edsl/auto/StageBase.py +243 -230
- edsl/auto/StageGenerateSurvey.py +178 -178
- edsl/auto/StageLabelQuestions.py +125 -125
- edsl/auto/StagePersona.py +61 -61
- edsl/auto/StagePersonaDimensionValueRanges.py +88 -88
- edsl/auto/StagePersonaDimensionValues.py +74 -74
- edsl/auto/StagePersonaDimensions.py +69 -69
- edsl/auto/StageQuestions.py +74 -73
- edsl/auto/SurveyCreatorPipeline.py +21 -21
- edsl/auto/utilities.py +218 -224
- edsl/base/Base.py +279 -279
- edsl/config.py +177 -157
- edsl/conversation/Conversation.py +290 -290
- edsl/conversation/car_buying.py +59 -58
- edsl/conversation/chips.py +95 -95
- edsl/conversation/mug_negotiation.py +81 -81
- edsl/conversation/next_speaker_utilities.py +93 -93
- edsl/coop/CoopFunctionsMixin.py +15 -0
- edsl/coop/ExpectedParrotKeyHandler.py +125 -0
- edsl/coop/PriceFetcher.py +54 -54
- edsl/coop/__init__.py +2 -2
- edsl/coop/coop.py +1106 -1028
- edsl/coop/utils.py +131 -131
- edsl/data/Cache.py +573 -555
- edsl/data/CacheEntry.py +230 -233
- edsl/data/CacheHandler.py +168 -149
- edsl/data/RemoteCacheSync.py +186 -78
- edsl/data/SQLiteDict.py +292 -292
- edsl/data/__init__.py +5 -4
- edsl/data/orm.py +10 -10
- edsl/data_transfer_models.py +74 -73
- edsl/enums.py +202 -175
- edsl/exceptions/BaseException.py +21 -21
- edsl/exceptions/__init__.py +54 -54
- edsl/exceptions/agents.py +54 -42
- edsl/exceptions/cache.py +5 -5
- edsl/exceptions/configuration.py +16 -16
- edsl/exceptions/coop.py +10 -10
- edsl/exceptions/data.py +14 -14
- edsl/exceptions/general.py +34 -34
- edsl/exceptions/inference_services.py +5 -0
- edsl/exceptions/jobs.py +33 -33
- edsl/exceptions/language_models.py +63 -63
- edsl/exceptions/prompts.py +15 -15
- edsl/exceptions/questions.py +109 -91
- edsl/exceptions/results.py +29 -29
- edsl/exceptions/scenarios.py +29 -22
- edsl/exceptions/surveys.py +37 -37
- edsl/inference_services/AnthropicService.py +106 -87
- edsl/inference_services/AvailableModelCacheHandler.py +184 -0
- edsl/inference_services/AvailableModelFetcher.py +215 -0
- edsl/inference_services/AwsBedrock.py +118 -120
- edsl/inference_services/AzureAI.py +215 -217
- edsl/inference_services/DeepInfraService.py +18 -18
- edsl/inference_services/GoogleService.py +143 -148
- edsl/inference_services/GroqService.py +20 -20
- edsl/inference_services/InferenceServiceABC.py +80 -147
- edsl/inference_services/InferenceServicesCollection.py +138 -97
- edsl/inference_services/MistralAIService.py +120 -123
- edsl/inference_services/OllamaService.py +18 -18
- edsl/inference_services/OpenAIService.py +236 -224
- edsl/inference_services/PerplexityService.py +160 -163
- edsl/inference_services/ServiceAvailability.py +135 -0
- edsl/inference_services/TestService.py +90 -89
- edsl/inference_services/TogetherAIService.py +172 -170
- edsl/inference_services/data_structures.py +134 -0
- edsl/inference_services/models_available_cache.py +118 -118
- edsl/inference_services/rate_limits_cache.py +25 -25
- edsl/inference_services/registry.py +41 -41
- edsl/inference_services/write_available.py +10 -10
- edsl/jobs/AnswerQuestionFunctionConstructor.py +223 -0
- edsl/jobs/Answers.py +43 -56
- edsl/jobs/FetchInvigilator.py +47 -0
- edsl/jobs/InterviewTaskManager.py +98 -0
- edsl/jobs/InterviewsConstructor.py +50 -0
- edsl/jobs/Jobs.py +823 -898
- edsl/jobs/JobsChecks.py +172 -147
- edsl/jobs/JobsComponentConstructor.py +189 -0
- edsl/jobs/JobsPrompts.py +270 -268
- edsl/jobs/JobsRemoteInferenceHandler.py +311 -239
- edsl/jobs/JobsRemoteInferenceLogger.py +239 -0
- edsl/jobs/RequestTokenEstimator.py +30 -0
- edsl/jobs/__init__.py +1 -1
- edsl/jobs/async_interview_runner.py +138 -0
- edsl/jobs/buckets/BucketCollection.py +104 -63
- edsl/jobs/buckets/ModelBuckets.py +65 -65
- edsl/jobs/buckets/TokenBucket.py +283 -251
- 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 +396 -661
- edsl/jobs/interviews/InterviewExceptionCollection.py +99 -99
- edsl/jobs/interviews/InterviewExceptionEntry.py +186 -186
- edsl/jobs/interviews/InterviewStatistic.py +63 -63
- edsl/jobs/interviews/InterviewStatisticsCollection.py +25 -25
- edsl/jobs/interviews/InterviewStatusDictionary.py +78 -78
- edsl/jobs/interviews/InterviewStatusLog.py +92 -92
- edsl/jobs/interviews/ReportErrors.py +66 -66
- edsl/jobs/interviews/interview_status_enum.py +9 -9
- 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 -466
- edsl/jobs/runners/JobsRunnerStatus.py +297 -330
- edsl/jobs/tasks/QuestionTaskCreator.py +244 -242
- edsl/jobs/tasks/TaskCreators.py +64 -64
- edsl/jobs/tasks/TaskHistory.py +470 -450
- edsl/jobs/tasks/TaskStatusLog.py +23 -23
- edsl/jobs/tasks/task_status_enum.py +161 -163
- edsl/jobs/tokens/InterviewTokenUsage.py +27 -27
- edsl/jobs/tokens/TokenUsage.py +34 -34
- edsl/language_models/ComputeCost.py +63 -0
- edsl/language_models/LanguageModel.py +626 -668
- edsl/language_models/ModelList.py +164 -155
- edsl/language_models/PriceManager.py +127 -0
- edsl/language_models/RawResponseHandler.py +106 -0
- edsl/language_models/RegisterLanguageModelsMeta.py +184 -184
- edsl/language_models/ServiceDataSources.py +0 -0
- edsl/language_models/__init__.py +2 -3
- edsl/language_models/fake_openai_call.py +15 -15
- edsl/language_models/fake_openai_service.py +61 -61
- 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 +156 -156
- edsl/language_models/utilities.py +65 -64
- edsl/notebooks/Notebook.py +263 -258
- edsl/notebooks/NotebookToLaTeX.py +142 -0
- edsl/notebooks/__init__.py +1 -1
- edsl/prompts/Prompt.py +352 -362
- edsl/prompts/__init__.py +2 -2
- edsl/questions/ExceptionExplainer.py +77 -0
- edsl/questions/HTMLQuestion.py +103 -0
- edsl/questions/QuestionBase.py +518 -664
- edsl/questions/QuestionBasePromptsMixin.py +221 -217
- edsl/questions/QuestionBudget.py +227 -227
- edsl/questions/QuestionCheckBox.py +359 -359
- edsl/questions/QuestionExtract.py +180 -182
- edsl/questions/QuestionFreeText.py +113 -114
- edsl/questions/QuestionFunctional.py +166 -166
- edsl/questions/QuestionList.py +223 -231
- edsl/questions/QuestionMatrix.py +265 -0
- edsl/questions/QuestionMultipleChoice.py +330 -286
- edsl/questions/QuestionNumerical.py +151 -153
- edsl/questions/QuestionRank.py +314 -324
- edsl/questions/Quick.py +41 -41
- edsl/questions/SimpleAskMixin.py +74 -73
- edsl/questions/__init__.py +27 -26
- edsl/questions/{AnswerValidatorMixin.py → answer_validator_mixin.py} +334 -289
- edsl/questions/compose_questions.py +98 -98
- edsl/questions/data_structures.py +20 -0
- edsl/questions/decorators.py +21 -21
- edsl/questions/derived/QuestionLikertFive.py +76 -76
- edsl/questions/derived/QuestionLinearScale.py +90 -87
- edsl/questions/derived/QuestionTopK.py +93 -93
- edsl/questions/derived/QuestionYesNo.py +82 -82
- edsl/questions/descriptors.py +427 -413
- edsl/questions/loop_processor.py +149 -0
- edsl/questions/prompt_templates/question_budget.jinja +13 -13
- edsl/questions/prompt_templates/question_checkbox.jinja +32 -32
- edsl/questions/prompt_templates/question_extract.jinja +11 -11
- edsl/questions/prompt_templates/question_free_text.jinja +3 -3
- edsl/questions/prompt_templates/question_linear_scale.jinja +11 -11
- edsl/questions/prompt_templates/question_list.jinja +17 -17
- edsl/questions/prompt_templates/question_multiple_choice.jinja +33 -33
- edsl/questions/prompt_templates/question_numerical.jinja +36 -36
- edsl/questions/{QuestionBaseGenMixin.py → question_base_gen_mixin.py} +168 -161
- edsl/questions/question_registry.py +177 -177
- edsl/questions/{RegisterQuestionsMeta.py → register_questions_meta.py} +71 -71
- edsl/questions/{ResponseValidatorABC.py → response_validator_abc.py} +188 -174
- edsl/questions/response_validator_factory.py +34 -0
- edsl/questions/settings.py +12 -12
- edsl/questions/templates/budget/answering_instructions.jinja +7 -7
- edsl/questions/templates/budget/question_presentation.jinja +7 -7
- edsl/questions/templates/checkbox/answering_instructions.jinja +10 -10
- edsl/questions/templates/checkbox/question_presentation.jinja +22 -22
- edsl/questions/templates/extract/answering_instructions.jinja +7 -7
- edsl/questions/templates/likert_five/answering_instructions.jinja +10 -10
- edsl/questions/templates/likert_five/question_presentation.jinja +11 -11
- edsl/questions/templates/linear_scale/answering_instructions.jinja +5 -5
- edsl/questions/templates/linear_scale/question_presentation.jinja +5 -5
- edsl/questions/templates/list/answering_instructions.jinja +3 -3
- edsl/questions/templates/list/question_presentation.jinja +5 -5
- 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/answering_instructions.jinja +9 -9
- edsl/questions/templates/multiple_choice/question_presentation.jinja +11 -11
- edsl/questions/templates/numerical/answering_instructions.jinja +6 -6
- edsl/questions/templates/numerical/question_presentation.jinja +6 -6
- edsl/questions/templates/rank/answering_instructions.jinja +11 -11
- edsl/questions/templates/rank/question_presentation.jinja +15 -15
- edsl/questions/templates/top_k/answering_instructions.jinja +8 -8
- edsl/questions/templates/top_k/question_presentation.jinja +22 -22
- edsl/questions/templates/yes_no/answering_instructions.jinja +6 -6
- edsl/questions/templates/yes_no/question_presentation.jinja +11 -11
- edsl/results/CSSParameterizer.py +108 -108
- edsl/results/Dataset.py +587 -424
- edsl/results/DatasetExportMixin.py +594 -731
- edsl/results/DatasetTree.py +295 -275
- edsl/results/MarkdownToDocx.py +122 -0
- edsl/results/MarkdownToPDF.py +111 -0
- edsl/results/Result.py +557 -465
- edsl/results/Results.py +1183 -1165
- edsl/results/ResultsExportMixin.py +45 -43
- edsl/results/ResultsGGMixin.py +121 -121
- edsl/results/TableDisplay.py +125 -198
- edsl/results/TextEditor.py +50 -0
- edsl/results/__init__.py +2 -2
- edsl/results/file_exports.py +252 -0
- edsl/results/{ResultsFetchMixin.py → results_fetch_mixin.py} +33 -33
- edsl/results/{Selector.py → results_selector.py} +145 -135
- edsl/results/{ResultsToolsMixin.py → results_tools_mixin.py} +98 -98
- edsl/results/smart_objects.py +96 -0
- edsl/results/table_data_class.py +12 -0
- edsl/results/table_display.css +77 -77
- edsl/results/table_renderers.py +118 -0
- edsl/results/tree_explore.py +115 -115
- edsl/scenarios/ConstructDownloadLink.py +109 -0
- edsl/scenarios/DocumentChunker.py +102 -0
- edsl/scenarios/DocxScenario.py +16 -0
- edsl/scenarios/FileStore.py +511 -632
- edsl/scenarios/PdfExtractor.py +40 -0
- edsl/scenarios/Scenario.py +498 -601
- edsl/scenarios/ScenarioHtmlMixin.py +65 -64
- edsl/scenarios/ScenarioList.py +1458 -1287
- edsl/scenarios/ScenarioListExportMixin.py +45 -52
- edsl/scenarios/ScenarioListPdfMixin.py +239 -261
- edsl/scenarios/__init__.py +3 -4
- 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 +38 -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/{ScenarioJoin.py → scenario_join.py} +131 -127
- edsl/scenarios/scenario_selector.py +156 -0
- edsl/shared.py +1 -1
- edsl/study/ObjectEntry.py +173 -173
- edsl/study/ProofOfWork.py +113 -113
- edsl/study/SnapShot.py +80 -80
- edsl/study/Study.py +521 -528
- edsl/study/__init__.py +4 -4
- edsl/surveys/ConstructDAG.py +92 -0
- edsl/surveys/DAG.py +148 -148
- edsl/surveys/EditSurvey.py +221 -0
- edsl/surveys/InstructionHandler.py +100 -0
- edsl/surveys/Memory.py +31 -31
- edsl/surveys/MemoryManagement.py +72 -0
- edsl/surveys/MemoryPlan.py +244 -244
- edsl/surveys/Rule.py +327 -326
- edsl/surveys/RuleCollection.py +385 -387
- edsl/surveys/RuleManager.py +172 -0
- edsl/surveys/Simulator.py +75 -0
- edsl/surveys/Survey.py +1280 -1801
- edsl/surveys/SurveyCSS.py +273 -261
- edsl/surveys/SurveyExportMixin.py +259 -259
- edsl/surveys/{SurveyFlowVisualizationMixin.py → SurveyFlowVisualization.py} +181 -179
- edsl/surveys/SurveyQualtricsImport.py +284 -284
- edsl/surveys/SurveyToApp.py +141 -0
- edsl/surveys/__init__.py +5 -3
- edsl/surveys/base.py +53 -53
- edsl/surveys/descriptors.py +60 -56
- edsl/surveys/instructions/ChangeInstruction.py +48 -49
- edsl/surveys/instructions/Instruction.py +56 -65
- edsl/surveys/instructions/InstructionCollection.py +82 -77
- edsl/templates/error_reporting/base.html +23 -23
- edsl/templates/error_reporting/exceptions_by_model.html +34 -34
- edsl/templates/error_reporting/exceptions_by_question_name.html +16 -16
- edsl/templates/error_reporting/exceptions_by_type.html +16 -16
- edsl/templates/error_reporting/interview_details.html +115 -115
- edsl/templates/error_reporting/interviews.html +19 -19
- edsl/templates/error_reporting/overview.html +4 -4
- edsl/templates/error_reporting/performance_plot.html +1 -1
- edsl/templates/error_reporting/report.css +73 -73
- edsl/templates/error_reporting/report.html +117 -117
- edsl/templates/error_reporting/report.js +25 -25
- edsl/tools/__init__.py +1 -1
- edsl/tools/clusters.py +192 -192
- edsl/tools/embeddings.py +27 -27
- edsl/tools/embeddings_plotting.py +118 -118
- edsl/tools/plotting.py +112 -112
- edsl/tools/summarize.py +18 -18
- edsl/utilities/PrettyList.py +56 -0
- edsl/utilities/SystemInfo.py +28 -28
- edsl/utilities/__init__.py +22 -22
- edsl/utilities/ast_utilities.py +25 -25
- edsl/utilities/data/Registry.py +6 -6
- edsl/utilities/data/__init__.py +1 -1
- edsl/utilities/data/scooter_results.json +1 -1
- edsl/utilities/decorators.py +77 -77
- edsl/utilities/gcp_bucket/cloud_storage.py +96 -96
- edsl/utilities/interface.py +627 -627
- edsl/utilities/is_notebook.py +18 -0
- edsl/utilities/is_valid_variable_name.py +11 -0
- edsl/utilities/naming_utilities.py +263 -263
- edsl/utilities/remove_edsl_version.py +24 -0
- edsl/utilities/repair_functions.py +28 -28
- edsl/utilities/restricted_python.py +70 -70
- edsl/utilities/utilities.py +436 -424
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev5.dist-info}/LICENSE +21 -21
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev5.dist-info}/METADATA +13 -11
- edsl-0.1.39.dev5.dist-info/RECORD +358 -0
- {edsl-0.1.39.dev3.dist-info → edsl-0.1.39.dev5.dist-info}/WHEEL +1 -1
- edsl/language_models/KeyLookup.py +0 -30
- edsl/language_models/registry.py +0 -190
- edsl/language_models/unused/ReplicateBase.py +0 -83
- edsl/results/ResultsDBMixin.py +0 -238
- edsl-0.1.39.dev3.dist-info/RECORD +0 -277
@@ -0,0 +1,100 @@
|
|
1
|
+
from typing import TYPE_CHECKING
|
2
|
+
from dataclasses import dataclass
|
3
|
+
|
4
|
+
|
5
|
+
@dataclass
|
6
|
+
class SeparatedComponents:
|
7
|
+
true_questions: list
|
8
|
+
instruction_names_to_instructions: dict
|
9
|
+
pseudo_indices: dict
|
10
|
+
|
11
|
+
|
12
|
+
class InstructionHandler:
|
13
|
+
def __init__(self, survey):
|
14
|
+
self.survey = survey
|
15
|
+
|
16
|
+
@staticmethod
|
17
|
+
def separate_questions_and_instructions(questions_and_instructions: list) -> tuple:
|
18
|
+
"""
|
19
|
+
The 'pseudo_indices' attribute is a dictionary that maps question names to pseudo-indices
|
20
|
+
that are used to order questions and instructions in the survey.
|
21
|
+
Only questions get real indices; instructions get pseudo-indices.
|
22
|
+
However, the order of the pseudo-indices is the same as the order questions and instructions are added to the survey.
|
23
|
+
|
24
|
+
We don't have to know how many instructions there are to calculate the pseudo-indices because they are
|
25
|
+
calculated by the inverse of one minus the sum of 1/2^n for n in the number of instructions run so far.
|
26
|
+
|
27
|
+
>>> from edsl import Survey
|
28
|
+
>>> from edsl import Instruction
|
29
|
+
>>> i = Instruction(text = "Pay attention to the following questions.", name = "intro")
|
30
|
+
>>> i2 = Instruction(text = "How are you feeling today?", name = "followon_intro")
|
31
|
+
>>> from edsl import QuestionFreeText; q1 = QuestionFreeText.example()
|
32
|
+
>>> from edsl import QuestionMultipleChoice; q2 = QuestionMultipleChoice.example()
|
33
|
+
>>> s = Survey([q1, i, i2, q2])
|
34
|
+
>>> len(s._instruction_names_to_instructions)
|
35
|
+
2
|
36
|
+
>>> s._pseudo_indices
|
37
|
+
{'how_are_you': 0, 'intro': 0.5, 'followon_intro': 0.75, 'how_feeling': 1}
|
38
|
+
|
39
|
+
>>> from edsl import ChangeInstruction
|
40
|
+
>>> q3 = QuestionFreeText(question_text = "What is your favorite color?", question_name = "color")
|
41
|
+
>>> i_change = ChangeInstruction(drop = ["intro"])
|
42
|
+
>>> s = Survey([q1, i, q2, i_change, q3])
|
43
|
+
>>> [i.name for i in s._relevant_instructions(q1)]
|
44
|
+
[]
|
45
|
+
>>> [i.name for i in s._relevant_instructions(q2)]
|
46
|
+
['intro']
|
47
|
+
>>> [i.name for i in s._relevant_instructions(q3)]
|
48
|
+
[]
|
49
|
+
|
50
|
+
>>> i_change = ChangeInstruction(keep = ["poop"], drop = [])
|
51
|
+
>>> s = Survey([q1, i, q2, i_change])
|
52
|
+
Traceback (most recent call last):
|
53
|
+
...
|
54
|
+
ValueError: ChangeInstruction change_instruction_0 references instruction poop which does not exist.
|
55
|
+
"""
|
56
|
+
from edsl.surveys.instructions.Instruction import Instruction
|
57
|
+
from edsl.surveys.instructions.ChangeInstruction import ChangeInstruction
|
58
|
+
from edsl.questions.QuestionBase import QuestionBase
|
59
|
+
|
60
|
+
true_questions = []
|
61
|
+
instruction_names_to_instructions = {}
|
62
|
+
|
63
|
+
num_change_instructions = 0
|
64
|
+
pseudo_indices = {}
|
65
|
+
instructions_run_length = 0
|
66
|
+
for entry in questions_and_instructions:
|
67
|
+
if isinstance(entry, Instruction) or isinstance(entry, ChangeInstruction):
|
68
|
+
if isinstance(entry, ChangeInstruction):
|
69
|
+
entry.add_name(num_change_instructions)
|
70
|
+
num_change_instructions += 1
|
71
|
+
for prior_instruction in entry.keep + entry.drop:
|
72
|
+
if prior_instruction not in instruction_names_to_instructions:
|
73
|
+
raise ValueError(
|
74
|
+
f"ChangeInstruction {entry.name} references instruction {prior_instruction} which does not exist."
|
75
|
+
)
|
76
|
+
instructions_run_length += 1
|
77
|
+
delta = 1 - 1.0 / (2.0**instructions_run_length)
|
78
|
+
pseudo_index = (len(true_questions) - 1) + delta
|
79
|
+
entry.pseudo_index = pseudo_index
|
80
|
+
instruction_names_to_instructions[entry.name] = entry
|
81
|
+
elif isinstance(entry, QuestionBase):
|
82
|
+
pseudo_index = len(true_questions)
|
83
|
+
instructions_run_length = 0
|
84
|
+
true_questions.append(entry)
|
85
|
+
else:
|
86
|
+
raise ValueError(
|
87
|
+
f"Entry {repr(entry)} is not a QuestionBase or an Instruction."
|
88
|
+
)
|
89
|
+
|
90
|
+
pseudo_indices[entry.name] = pseudo_index
|
91
|
+
|
92
|
+
return SeparatedComponents(
|
93
|
+
true_questions, instruction_names_to_instructions, pseudo_indices
|
94
|
+
)
|
95
|
+
|
96
|
+
|
97
|
+
if __name__ == "__main__":
|
98
|
+
import doctest
|
99
|
+
|
100
|
+
doctest.testmod()
|
edsl/surveys/Memory.py
CHANGED
@@ -1,31 +1,31 @@
|
|
1
|
-
"""This module contains the Memory class, which is a list of prior questions."""
|
2
|
-
|
3
|
-
from collections import UserList
|
4
|
-
|
5
|
-
|
6
|
-
class Memory(UserList):
|
7
|
-
"""Class for holding the questions (stored as names) that we want the the agent to have available when answering a question."""
|
8
|
-
|
9
|
-
def __init__(self, prior_questions: list[str] = None):
|
10
|
-
"""Initialize the Memory object."""
|
11
|
-
super().__init__(prior_questions or [])
|
12
|
-
|
13
|
-
def add_prior_question(self, prior_question):
|
14
|
-
"""Add a prior question to the memory."""
|
15
|
-
if prior_question not in self:
|
16
|
-
self.append(prior_question)
|
17
|
-
else:
|
18
|
-
raise ValueError(f"{prior_question} is already in the memory.")
|
19
|
-
|
20
|
-
def __repr__(self):
|
21
|
-
"""Return a string representation of the Memory object."""
|
22
|
-
return f"Memory(prior_questions={self.data})"
|
23
|
-
|
24
|
-
def to_dict(self):
|
25
|
-
"""Create a dictionary representation of the Memory object."""
|
26
|
-
return {"prior_questions": self.data}
|
27
|
-
|
28
|
-
@classmethod
|
29
|
-
def from_dict(cls, data):
|
30
|
-
"""Create a Memory object from a dictionary."""
|
31
|
-
return cls(**data)
|
1
|
+
"""This module contains the Memory class, which is a list of prior questions."""
|
2
|
+
|
3
|
+
from collections import UserList
|
4
|
+
|
5
|
+
|
6
|
+
class Memory(UserList):
|
7
|
+
"""Class for holding the questions (stored as names) that we want the the agent to have available when answering a question."""
|
8
|
+
|
9
|
+
def __init__(self, prior_questions: list[str] = None):
|
10
|
+
"""Initialize the Memory object."""
|
11
|
+
super().__init__(prior_questions or [])
|
12
|
+
|
13
|
+
def add_prior_question(self, prior_question):
|
14
|
+
"""Add a prior question to the memory."""
|
15
|
+
if prior_question not in self:
|
16
|
+
self.append(prior_question)
|
17
|
+
else:
|
18
|
+
raise ValueError(f"{prior_question} is already in the memory.")
|
19
|
+
|
20
|
+
def __repr__(self):
|
21
|
+
"""Return a string representation of the Memory object."""
|
22
|
+
return f"Memory(prior_questions={self.data})"
|
23
|
+
|
24
|
+
def to_dict(self):
|
25
|
+
"""Create a dictionary representation of the Memory object."""
|
26
|
+
return {"prior_questions": self.data}
|
27
|
+
|
28
|
+
@classmethod
|
29
|
+
def from_dict(cls, data):
|
30
|
+
"""Create a Memory object from a dictionary."""
|
31
|
+
return cls(**data)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
from typing import Callable, Union, List, TYPE_CHECKING
|
3
|
+
|
4
|
+
if TYPE_CHECKING:
|
5
|
+
from edsl.questions.QuestionBase import QuestionBase
|
6
|
+
|
7
|
+
|
8
|
+
class MemoryManagement:
|
9
|
+
def __init__(self, survey):
|
10
|
+
self.survey = survey
|
11
|
+
|
12
|
+
def _set_memory_plan(self, prior_questions_func: Callable) -> None:
|
13
|
+
"""Set memory plan based on a provided function determining prior questions.
|
14
|
+
:param prior_questions_func: A function that takes an index and returns a list of prior questions.
|
15
|
+
"""
|
16
|
+
for i, question_name in enumerate(self.survey.question_names):
|
17
|
+
self.survey.memory_plan.add_memory_collection(
|
18
|
+
focal_question=question_name,
|
19
|
+
prior_questions=prior_questions_func(i),
|
20
|
+
)
|
21
|
+
|
22
|
+
def add_targeted_memory(
|
23
|
+
self,
|
24
|
+
focal_question: Union[QuestionBase, str],
|
25
|
+
prior_question: Union[QuestionBase, str],
|
26
|
+
) -> "Survey":
|
27
|
+
"""Add instructions to a survey than when answering focal_question.
|
28
|
+
|
29
|
+
:param focal_question: The question that the agent is answering.
|
30
|
+
:param prior_question: The question that the agent should remember when answering the focal question.
|
31
|
+
|
32
|
+
Here we add instructions to a survey than when answering q2 they should remember q1:
|
33
|
+
"""
|
34
|
+
focal_question_name = self.survey.question_names[
|
35
|
+
self.survey._get_question_index(focal_question)
|
36
|
+
]
|
37
|
+
prior_question_name = self.survey.question_names[
|
38
|
+
self.survey._get_question_index(prior_question)
|
39
|
+
]
|
40
|
+
|
41
|
+
self.survey.memory_plan.add_single_memory(
|
42
|
+
focal_question=focal_question_name,
|
43
|
+
prior_question=prior_question_name,
|
44
|
+
)
|
45
|
+
|
46
|
+
return self.survey
|
47
|
+
|
48
|
+
def add_memory_collection(
|
49
|
+
self,
|
50
|
+
focal_question: Union[QuestionBase, str],
|
51
|
+
prior_questions: List[Union[QuestionBase, str]],
|
52
|
+
) -> "Survey":
|
53
|
+
"""Add prior questions and responses so the agent has them when answering.
|
54
|
+
|
55
|
+
This adds instructions to a survey than when answering focal_question, the agent should also remember the answers to prior_questions listed in prior_questions.
|
56
|
+
|
57
|
+
:param focal_question: The question that the agent is answering.
|
58
|
+
:param prior_questions: The questions that the agent should remember when answering the focal question.
|
59
|
+
"""
|
60
|
+
focal_question_name = self.survey.question_names[
|
61
|
+
self.survey._get_question_index(focal_question)
|
62
|
+
]
|
63
|
+
|
64
|
+
prior_question_names = [
|
65
|
+
self.survey.question_names[self.survey._get_question_index(prior_question)]
|
66
|
+
for prior_question in prior_questions
|
67
|
+
]
|
68
|
+
|
69
|
+
self.survey.memory_plan.add_memory_collection(
|
70
|
+
focal_question=focal_question_name, prior_questions=prior_question_names
|
71
|
+
)
|
72
|
+
return self.survey
|