revisit 0.0.11__py2.py3-none-any.whl → 0.0.12__py2.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.
- revisit/StudyConfigSchema.json +2130 -0
- revisit/revisit.py +90 -5
- revisit/static/widget.css +0 -1
- revisit/static/widget.js +5 -6
- revisit/widget.py +9 -35
- revisit-0.0.12.dist-info/METADATA +291 -0
- revisit-0.0.12.dist-info/RECORD +10 -0
- revisit-0.0.11.dist-info/METADATA +0 -74
- revisit-0.0.11.dist-info/RECORD +0 -9
- {revisit-0.0.11.dist-info → revisit-0.0.12.dist-info}/WHEEL +0 -0
revisit/revisit.py
CHANGED
@@ -59,7 +59,7 @@ class _WrappedResponse(_JSONableBaseModel):
|
|
59
59
|
return self
|
60
60
|
|
61
61
|
def clone(self):
|
62
|
-
return
|
62
|
+
return __response__(**self.root.__dict__)
|
63
63
|
|
64
64
|
|
65
65
|
# Private
|
@@ -77,7 +77,7 @@ class _WrappedComponent(_JSONableBaseModel):
|
|
77
77
|
def responses(self, responses: List[_WrappedResponse]) -> _WrappedComponent:
|
78
78
|
for item in responses:
|
79
79
|
if not isinstance(item, _WrappedResponse):
|
80
|
-
raise
|
80
|
+
raise RevisitError(message=f'Expecting type Response but got {type(item)}')
|
81
81
|
self.root.response = responses
|
82
82
|
return self
|
83
83
|
|
@@ -93,7 +93,7 @@ class _WrappedComponent(_JSONableBaseModel):
|
|
93
93
|
# Get dict
|
94
94
|
response_dict = r.root.__dict__
|
95
95
|
# Create new response
|
96
|
-
new_response =
|
96
|
+
new_response = __response__(**response_dict)
|
97
97
|
# Set with new values
|
98
98
|
new_response.set(**kwargs)
|
99
99
|
# Filter out old response
|
@@ -119,7 +119,7 @@ class _WrappedComponent(_JSONableBaseModel):
|
|
119
119
|
return self
|
120
120
|
|
121
121
|
def clone(self, component_name__):
|
122
|
-
return
|
122
|
+
return __component__(**self.root.__dict__, component_name__=component_name__)
|
123
123
|
|
124
124
|
|
125
125
|
class _WrappedStudyMetadata(_JSONableBaseModel):
|
@@ -156,6 +156,26 @@ class _WrappedComponentBlock(_JSONableBaseModel):
|
|
156
156
|
)
|
157
157
|
return DataIterator(data_list, self)
|
158
158
|
|
159
|
+
def get_component(self, name: str) -> _WrappedComponent:
|
160
|
+
for entry in self.component_objects__:
|
161
|
+
print(f'Comp Name: {entry.component_name__}')
|
162
|
+
print(f'Name: {name}')
|
163
|
+
if entry.component_name__ == name:
|
164
|
+
return entry
|
165
|
+
|
166
|
+
def permute(self, factors: List[str], order: rvt_models.Order, numSamples: Optional[int] = None,) -> None:
|
167
|
+
# Convert to JSON
|
168
|
+
self_json = json.loads(self.__str__())
|
169
|
+
# Get all current component dictionaries
|
170
|
+
components_dict = {c.component_name__: c for c in self.component_objects__}
|
171
|
+
# Recursively start permutation function
|
172
|
+
new_permuted_component_block = _recursive_json_permutation(self_json, factors=factors, order=order, numSamples=numSamples, input_components=components_dict)
|
173
|
+
# Set new objects
|
174
|
+
self.component_objects__ = new_permuted_component_block.component_objects__
|
175
|
+
# Set new root
|
176
|
+
self.root = new_permuted_component_block.root
|
177
|
+
return self
|
178
|
+
|
159
179
|
|
160
180
|
class _WrappedStudyConfig(_JSONableBaseModel):
|
161
181
|
root: rvt_models.StudyConfig
|
@@ -198,7 +218,7 @@ class DataIterator:
|
|
198
218
|
current_dict[key] = value
|
199
219
|
else:
|
200
220
|
current_dict[key] = value
|
201
|
-
curr_component =
|
221
|
+
curr_component = __component__(**current_dict)
|
202
222
|
self.parent_class = self.parent_class + curr_component
|
203
223
|
# Return the parent class calling iterator when component is finished.
|
204
224
|
return self.parent_class
|
@@ -276,6 +296,10 @@ def component(**kwargs) -> _WrappedComponent:
|
|
276
296
|
raise RevisitError(e.errors())
|
277
297
|
|
278
298
|
|
299
|
+
# Shadowing
|
300
|
+
__component__ = component
|
301
|
+
|
302
|
+
|
279
303
|
# Response factory function
|
280
304
|
@overload
|
281
305
|
def response(**kwargs: Unpack[rvt_models.NumericalResponseType]) -> _WrappedResponse: ...
|
@@ -312,6 +336,10 @@ def response(**kwargs) -> _WrappedResponse:
|
|
312
336
|
raise RevisitError(e.errors())
|
313
337
|
|
314
338
|
|
339
|
+
# Shadowing
|
340
|
+
__response__ = response
|
341
|
+
|
342
|
+
|
315
343
|
def studyMetadata(**kwargs: Unpack[rvt_models.StudyMetadataType]):
|
316
344
|
filter_kwargs = _get_filtered_kwargs(rvt_models.StudyMetadata, kwargs)
|
317
345
|
base_model = rvt_models.StudyMetadata(**filter_kwargs)
|
@@ -350,6 +378,10 @@ def sequence(**kwargs: Unpack[rvt_models.ComponentBlockType]):
|
|
350
378
|
return _WrappedComponentBlock(**kwargs, root=base_model, component_objects__=valid_components)
|
351
379
|
|
352
380
|
|
381
|
+
# Shadowing
|
382
|
+
__sequence__ = sequence
|
383
|
+
|
384
|
+
|
353
385
|
@overload
|
354
386
|
def studyConfig(**kwargs: Unpack[_StudyConfigType]) -> _WrappedStudyConfig: ...
|
355
387
|
@overload
|
@@ -646,3 +678,56 @@ def _copy_file(src: str, dest: str):
|
|
646
678
|
|
647
679
|
print(f'Copying file from {src} to {dest}')
|
648
680
|
shutil.copyfile(src, dest)
|
681
|
+
|
682
|
+
|
683
|
+
def _recursive_json_permutation(
|
684
|
+
input_json: dict,
|
685
|
+
factors: List[str],
|
686
|
+
order: rvt_models.Order,
|
687
|
+
numSamples: int,
|
688
|
+
input_components: dict
|
689
|
+
):
|
690
|
+
new_seq = __sequence__(order=order, numSamples=numSamples)
|
691
|
+
while input_json['components']:
|
692
|
+
c = input_json['components'].pop()
|
693
|
+
# If component name
|
694
|
+
if isinstance(c, str):
|
695
|
+
# Get orig component
|
696
|
+
curr_comp = input_components[c]
|
697
|
+
# Create new comp block for permuting this component across all factors
|
698
|
+
curr_seq = __sequence__(order=order, numSamples=numSamples)
|
699
|
+
# Generate new comp for each
|
700
|
+
for entry in factors:
|
701
|
+
# Split factor entry
|
702
|
+
[name, value] = entry.split(":")
|
703
|
+
# Assign params
|
704
|
+
new_params = {name: value}
|
705
|
+
if curr_comp.root.parameters is not None:
|
706
|
+
new_params = {**curr_comp.root.parameters, **new_params}
|
707
|
+
# Create new component
|
708
|
+
curr_comp = __component__(
|
709
|
+
base__=curr_comp,
|
710
|
+
component_name__=f"{c}__{entry}",
|
711
|
+
parameters=new_params
|
712
|
+
)
|
713
|
+
# Add to curr seq block
|
714
|
+
curr_seq = curr_seq + curr_comp
|
715
|
+
# Add seq block to outer seq block
|
716
|
+
else:
|
717
|
+
new_input_json = c
|
718
|
+
temp_num_samples = None
|
719
|
+
if new_input_json.get('numSamples') is not None:
|
720
|
+
temp_num_samples = new_input_json['numSamples']
|
721
|
+
|
722
|
+
curr_seq = _recursive_json_permutation(
|
723
|
+
input_json=new_input_json,
|
724
|
+
order=order,
|
725
|
+
numSamples=numSamples,
|
726
|
+
input_components=input_components,
|
727
|
+
factors=factors
|
728
|
+
)
|
729
|
+
curr_seq.root.order = new_input_json['order']
|
730
|
+
curr_seq.root.numSamples = temp_num_samples
|
731
|
+
new_seq = new_seq + curr_seq
|
732
|
+
return new_seq
|
733
|
+
|
revisit/static/widget.css
CHANGED
@@ -1,2 +1 @@
|
|
1
1
|
.revisit_notebook_widget button{background:#f0f0f0;border-radius:5px;border:1px solid #ccc;cursor:pointer;font-family:Roboto,sans-serif;font-size:1em;margin:5px;padding:5px 10px;transition:box-shadow .25s ease-in-out;&:hover{background:#e0e0e0;box-shadow:0 0 5px #ccc}&:active{background:#d0d0d0;box-shadow:0 0 5px #ccc inset}}.revisit_notebook_widget iframe{border:0;margin:0;width:100%}.revisit_notebook_widget{.sequence{width:100%;display:flex}.sequenceComponent{display:flex;padding-left:4px;padding-right:4px;padding-bottom:2px;&:hover{background:#0000001a}}.sequenceComponentIndividual{background:#000;width:5px;height:20px;margin-top:5px}}
|
2
|
-
/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vanMvd2lkZ2V0LmNzcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLnJldmlzaXRfbm90ZWJvb2tfd2lkZ2V0IGJ1dHRvbiB7XG5cdGJhY2tncm91bmQ6ICNmMGYwZjA7XG5cdGJvcmRlci1yYWRpdXM6IDVweDtcblx0Ym9yZGVyOiAxcHggc29saWQgI2NjYztcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRmb250LWZhbWlseTogXCJSb2JvdG9cIiwgc2Fucy1zZXJpZjtcblx0Zm9udC1zaXplOiAxZW07XG5cdG1hcmdpbjogNXB4O1xuXHRwYWRkaW5nOiA1cHggMTBweDtcblx0dHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI1cyBlYXNlLWluLW91dDtcblxuXHQmOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kOiAjZTBlMGUwO1xuXHRcdGJveC1zaGFkb3c6IDAgMCA1cHggMCAjY2NjO1xuXHR9XG5cblx0JjphY3RpdmUge1xuXHRcdGJhY2tncm91bmQ6ICNkMGQwZDA7XG5cdFx0Ym94LXNoYWRvdzogMCAwIDVweCAwICNjY2MgaW5zZXQ7XG5cblx0fVxufVxuXG4ucmV2aXNpdF9ub3RlYm9va193aWRnZXQgaWZyYW1lIHtcblx0Ym9yZGVyOiAwO1xuXHRtYXJnaW46IDA7XG5cdHdpZHRoOiAxMDAlO1xufVxuXG4ucmV2aXNpdF9ub3RlYm9va193aWRnZXQge1xuXHQuc2VxdWVuY2Uge1xuXHRcdHdpZHRoOiAxMDAlO1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdH1cblxuXHQuc2VxdWVuY2VDb21wb25lbnQge1xuXHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0cGFkZGluZy1sZWZ0OiA0cHg7XG5cdFx0cGFkZGluZy1yaWdodDogNHB4O1xuXHRcdHBhZGRpbmctYm90dG9tOiAycHg7XG5cblx0XHQmOmhvdmVyIHtcblx0XHRcdGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjEpO1xuXHRcdH1cblx0fVxuXG5cdC5zZXF1ZW5jZUNvbXBvbmVudEluZGl2aWR1YWwge1xuXHRcdGJhY2tncm91bmQ6ICMwMDAwMDA7XG5cdFx0d2lkdGg6IDVweDtcblx0XHRoZWlnaHQ6IDIwcHg7XG5cdFx0bWFyZ2luLXRvcDogNXB4O1xuXHR9XG59Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsQ0FBQyx3QkFBd0IsT0FDeEIsV0FBWSxRQURiLGNBRWdCLElBQ2YsT0FBUSxJQUFJLE1BQU0sS0FDbEIsT0FBUSxRQUNSLFlBQWEsTUFBUSxDQUFFLFdBQ3ZCLFVBQVcsSUFOWixPQU9TLElBUFQsUUFRVSxJQUFJLEtBQ2IsV0FBWSxXQUFXLEtBQU0sWUFFN0IsQ0FBQyxPQUNBLFdBQVksUUFDWixXQUFZLEVBQUUsRUFBRSxJQUFNLElBQ3ZCLENBRUEsQ0FBQyxRQUNBLFdBQVksUUFDWixXQUFZLEVBQUUsRUFBRSxJQUFNLEtBQUssS0FFNUIsQ0FDRCxDQUVBLENBdkJDLHdCQXVCd0IsT0FDeEIsT0FBUSxFQXhCVCxPQXlCUyxFQUNSLE1BQU8sSUFDUixDQUVBLENBN0JDLHdCQThCQSxDQUFDLFNBQ0EsTUFBTyxLQUNQLFFBQVMsSUFDVixDQUVBLENBQUMsa0JBQ0EsUUFBUyxLQUNULGFBQWMsSUFDZCxjQUFlLElBQ2YsZUFBZ0IsSUFFaEIsQ0FBQyxPQUNBLFdBQVksU0FDYixDQUNELENBRUEsQ0FBQyw0QkFDQSxXQUFZLEtBQ1osTUFBTyxJQUNQLE9BQVEsS0FDUixXQUFZLEdBQ2IsQ0FDRCIsCiAgIm5hbWVzIjogW10KfQo= */
|