Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve handling of missing responses.json #9589

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

jonathan-eq
Copy link
Contributor

@jonathan-eq jonathan-eq commented Dec 18, 2024

Issue
Resolves #9493

Approach
The commit in this PR:

  • Makes storage reload and re-validate when changing between ert modes (manage experiment, run experiment, plot experiment)
  • Disables ensembles with invalid experiments from ensemble_selectors (error is shown as tooltip on hover)
  • Filters out invalid experiments from dark storage, so plotter won't attempt to plot it.
  • Reloads storage and re-validates on end of experiment, so ert wont crash if responses.json is deleted mid-run.

(Screenshot of new behavior in GUI if applicable)
image
(This is when the responses.json file is deleted mid run. Prior to this PR, ert would crash with ValueError: responses.json does not exist)

image
(This is when responses.json is deleted, and we open the plotter. The ensemble exists, but is not given as a option to plot due to it having an invalid experiment)

image
(This is when responses.json is deleted and we open manage-experiment. The experiment is shown, but cannot be selected. It is greyed out, and gives error as a tooltip when hovered)

  • PR title captures the intent of the changes, and is fitting for release notes.
  • Added appropriate release note label
  • Commit history is consistent and clean, in line with the contribution guidelines.
  • Make sure unit tests pass locally after every commit (git rebase -i main --exec 'pytest tests/ert/unit_tests -n logical -m "not integration_test"')

When applicable

  • When there are user facing changes: Updated documentation
  • New behavior or changes to existing untested code: Ensured that unit tests are added (See Ground Rules).
  • Large PR: Prepare changes in small commits for more convenient review
  • Bug fix: Add regression test for the bug
  • Bug fix: Create Backport PR to latest release

Copy link

codspeed-hq bot commented Dec 18, 2024

CodSpeed Performance Report

Merging #9589 will not alter performance

Comparing jonathan-eq:fix-missing_responses_error (5226e19) with main (c43f97f)

Summary

✅ 24 untouched benchmarks

@jonathan-eq jonathan-eq force-pushed the fix-missing_responses_error branch from d644aee to 2fe1d74 Compare December 18, 2024 14:30
@codecov-commenter
Copy link

codecov-commenter commented Dec 18, 2024

Codecov Report

Attention: Patch coverage is 80.00000% with 15 lines in your changes missing coverage. Please review.

Project coverage is 91.83%. Comparing base (01156bb) to head (869f845).
Report is 20 commits behind head on main.

Files with missing lines Patch % Lines
.../ert/gui/tools/manage_experiments/storage_model.py 77.77% 6 Missing ⚠️
src/ert/gui/ertwidgets/ensembleselector.py 66.66% 4 Missing ⚠️
src/ert/storage/local_experiment.py 82.35% 3 Missing ⚠️
src/ert/storage/local_ensemble.py 50.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9589      +/-   ##
==========================================
- Coverage   91.85%   91.83%   -0.03%     
==========================================
  Files         433      433              
  Lines       26768    26879     +111     
==========================================
+ Hits        24587    24683      +96     
- Misses       2181     2196      +15     
Flag Coverage Δ
cli-tests 39.69% <22.66%> (-0.07%) ⬇️
everest-models-test 34.55% <18.66%> (-0.04%) ⬇️
gui-tests 72.13% <77.33%> (+0.02%) ⬆️
integration-test 38.71% <22.66%> (+1.51%) ⬆️
performance-tests 51.88% <36.00%> (-0.06%) ⬇️
test 40.02% <22.66%> (-0.43%) ⬇️
unit-tests 74.06% <48.00%> (-0.11%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@@ -63,3 +64,10 @@ def set_current_ensemble(self, ensemble: Ensemble | None = None) -> None:
@Slot(bool)
def set_is_simulation_running(self, is_running: bool) -> None:
self._is_simulation_running = is_running

def refresh(self):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add None return

and not ensemble.experiment.is_valid()
):
index = self.count() - 1
model_item = model.item(index)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it works well. Should I use ItemData instead?

return default_flags
item = index.internalPointer()
if isinstance(item, ExperimentModel) and not item._is_valid:
return default_flags & ~Qt.ItemFlag.ItemIsEnabled
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could the be resolved if you create a typed variable and apply the flag change?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had to wrap the itemflag in ItemFlags, and then mypy was happy :)

@@ -108,7 +111,7 @@ def __init__(
search_bar.setPlaceholderText("Filter")
proxy_model = _SortingProxyModel(storage_model)
proxy_model.setFilterKeyColumn(-1) # Search all columns.
proxy_model.setSourceModel(storage_model)
proxy_model.setSourceModel(storage_model) # JONAK - CAN THIS BE REMOVED?
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This requires a bigger rewrite of the GUI, so it will be in a separate PR.

@jonathan-eq jonathan-eq force-pushed the fix-missing_responses_error branch 2 times, most recently from abb616c to d6e1bdd Compare January 14, 2025 08:55
@@ -154,6 +154,7 @@ def right_clicked(self) -> None:
def select_central_widget(self) -> None:
actor = self.sender()
if actor:
self.notifier.refresh()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This refreshes storage to make sure the experiment files (responses, index, metadata, and parameters) are still valid.

@jonathan-eq
Copy link
Contributor Author

There is a bug where it crashes if you are already in the manage experiment window, tab out to delete the responses.json file, and then put focus back on the ert window. I am trying to have ert refresh storage when gaining focus, but reimplementing focusInEvent on the main window does not work (it is never called). Is there a way I can make this work so that I can force refresh/revalidate storage before the child widgets start selecting invalid experiments @andreas-el?

The handling of the missing file should in the future be extended to
also handle the other experiment files in a similar manner (index.json,
metadata.json, and parameters.json)

This commit:
* Makes storage reload and re-validate when changing between ert modes
  (manage experient, run experiment, and plot tool)
* Disables ensemble with invalid experiments from ensemble_selectors
  (error is shown as tooltip on hover)
* Filters out invalid experiments from dark storage, so plotter won't
  attempt to plot them.
* Reloads and re-validates storage on end of experiment, so ert won't
  crash if responses.json is deleted mid-run.
@jonathan-eq jonathan-eq force-pushed the fix-missing_responses_error branch from 4658d21 to 5226e19 Compare January 14, 2025 13:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Missing responses.json when opening ert
3 participants