Skip to content

Conversation

@Lucas-Prates
Copy link
Contributor

@Lucas-Prates Lucas-Prates commented Nov 28, 2024

Pull request type

  • Code changes (bugfix, features)

Checklist

  • Unit tests for the changes have been added
  • Integration tests for the changes have been added
  • Docs have been reviewed and added / updated
  • Lint (black rocketpy/ tests/) has passed locally
  • All tests (pytest tests -m slow --runslow) have passed locally
  • CHANGELOG.md has been updated (if relevant)
  • RST documentation
  • Monte Carlo comparison Feature

New behavior

This PR implements the MRS requested in #162 and described in RocketPy paper.

Breaking change

  • Yes (perhaps)

Additional information

@Lucas-Prates Lucas-Prates requested a review from a team as a code owner November 28, 2024 21:36
@Lucas-Prates Lucas-Prates added Enhancement New feature or request, including adjustments in current codes Monte Carlo Monte Carlo and related contents labels Nov 28, 2024
@Lucas-Prates Lucas-Prates linked an issue Nov 28, 2024 that may be closed by this pull request
@Lucas-Prates Lucas-Prates marked this pull request as draft November 28, 2024 21:38
@codecov
Copy link

codecov bot commented Nov 28, 2024

Codecov Report

Attention: Patch coverage is 82.80543% with 38 lines in your changes missing coverage. Please review.

Project coverage is 79.76%. Comparing base (4df0b38) to head (3530eed).
Report is 4 commits behind head on develop.

Files with missing lines Patch % Lines
rocketpy/plots/monte_carlo_plots.py 80.00% 16 Missing ⚠️
rocketpy/prints/monte_carlo_prints.py 57.69% 11 Missing ⚠️
...ketpy/simulation/multivariate_rejection_sampler.py 89.81% 11 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           develop     #738      +/-   ##
===========================================
+ Coverage    79.11%   79.76%   +0.64%     
===========================================
  Files           96       97       +1     
  Lines        11575    11877     +302     
===========================================
+ Hits          9158     9474     +316     
+ Misses        2417     2403      -14     

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

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@Lucas-Prates
Copy link
Contributor Author

This PR is ready for a first "Design Review." I would like to get your opinion if this implementation provides what you think on how the user should use the MRS.

Albeit a implementation as a function seems natural, I implemented as a class because:

  1. the function would be humongous;
  2. if the user wants to resample several times, the data monte carlo data is only read once from the harddrive.

It currently works as follows:

  1. Input: monte carlo filepath prefix, mrs filepath prefix, distribution dictionary;
  2. Load input and output data from a monte carlo simulation into memory (python objects - lists of jsons);
  3. To avoid having to read data twice, while loading, precompute some important properties required in the sampler algorithm;
  4. Select and save iteratively accepted samples;
  5. Output: files are saved in the same "scheme" as the MonteCarlo simulation.

I provided a quick and dirty notebook, which will be removed, just to show how the class is being used at the moment.

Copy link
Member

@Gui-FernandesBR Gui-FernandesBR left a comment

Choose a reason for hiding this comment

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

I don't have much time so I'll be short

  • The class dies after you sample the data once, this makes it pointless to have a class
  • Instead I'd remove the sample dictionary from arguments.
  • First read the data during initialization. Then you use a function to set the variables you are going to allow be varied. This way u can already anticipate which variables may be varied.
  • We want almost instant results for a MonteCarlo simulation after using MRS.
  • Other thing is that the user must supply the original pdf. Could we possile estimate this from data? (imagine 70k)
  • Finally, plotting is crucial for MRS, or even tables. We'd love to see more on that later.

@Lucas-Prates
Copy link
Contributor Author

Lucas-Prates commented Feb 24, 2025

This PR is ready for review again. Changes from last time:

  1. addressed some of the previous suggestions of @phmbressan;
  2. added a comparison_info method that provides a statistical summary print comparison of the results of two monte carlo simulations, similar to the method used in the regular monte carlo class;
  3. added a comparison_plots method that plots boxplots and histograms comparison of the results of two monte carlo simulations;
  4. added a compare_ellipses method that plots the ellipses for the apogee and landing point comparison of the results of two monte carlo simulations;
  5. added the mrs.rst file to the documentation explaining what is the MRS and how to use it;
  6. added the MultivariateRejectionSampler class .rst documentation;
  7. removed the test_mrs.ipynb notebook since the .rst file does the same in a much clearer way;
  8. on my pc, the MRS is 500x faster than running a monte carlo simulation of the equivalent sample size.

For review, I recommend mostly checking the .rst documentation. Here are some previews of the comparisons if you do not have the time to compile the html:

Print comparison:
image

Plot comparison:
image

Ellipses comparison:
image

@Lucas-Prates
Copy link
Contributor Author

A second comment: I made the design choice to implement the comparison methods in the MonteCarlo class instead of the MultivariateRejectionSampler. Here are the most relevant arguments:

  1. It makes sense to compare monte carlo simulations even outside of MRS, i.e. even one is not a sub-sample of the other. Hence, implementing this inside the MRS would make this usage extremely odd;
  2. It keeps the MultivariateRejectionSampler class implementation really simple and with only one job: to sample.

One option is, of course, to create another class for that job, but it did not seem to be the best option.

@Gui-FernandesBR
Copy link
Member

Also, please update the CHANGELOG file!

@Gui-FernandesBR Gui-FernandesBR changed the title ENH: Implementing Multivariate Rejection Sampling (MRS) in RocketPy ENH: Implement Multivariate Rejection Sampling (MRS) Feb 25, 2025
@Lucas-Prates
Copy link
Contributor Author

I have addressed the suggestions made by @Gui-FernandesBR, implemented unit and integration tests for the MRS, and updated the CHANGELOG.

Copy link
Member

@Gui-FernandesBR Gui-FernandesBR left a comment

Choose a reason for hiding this comment

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

LGTM

@Gui-FernandesBR
Copy link
Member

@Lucas-Prates good work. Please squash and merge at your earliest convinience

Copy link
Member

@MateusStano MateusStano left a comment

Choose a reason for hiding this comment

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

This is really good overall! Great job

Comment on lines 373 to 389
plt.scatter(
original_apogee_x,
original_apogee_y,
s=5,
marker="^",
color="green",
label="Original Apogee",
)
plt.scatter(
original_impact_x,
original_impact_y,
s=5,
marker="v",
color="blue",
label="Original Landing Point",
)

Copy link
Member

Choose a reason for hiding this comment

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

Improve colors of the points/ellipses. Using oposite colors is probably best

Copy link
Member

Choose a reason for hiding this comment

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

There's no such thing as "opposite colors", but matplotlib does offer a fair good guide to selecting colormaps: https://matplotlib.org/stable/users/explain/colors/colormaps.html

I suggest blue/orange or blue/red.

Ideally the user should be able to select their specific color... But I understand the current limitations.

Copy link
Member

Choose a reason for hiding this comment

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

I guess the right term in complementary not "oposite". Anyway, I meant something like this:
image

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 will use then a "tetradic" color combination I found in this site. Here is the pallete I got, just for reference:

image

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 is the tetradic colors for the ellipses plot:
image

@Lucas-Prates
Copy link
Contributor Author

This PR is ready again for review. Since last time:

1 - addressed the points in Stano's review about documentation and color;
2 - removed some input checks which I think were not that useful but were a bit trick to do correctly;
3 - modified the flatten_dict function to better handle variables in inner levels.

The most important point is 3 since it might introduce a breaking change.

Copy link
Member

@Gui-FernandesBR Gui-FernandesBR left a comment

Choose a reason for hiding this comment

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

All looking good to me, great implementation.
I don't see the changes to flatten_dict as a problem.
Nobody is using that function right now.

Waiting for @MateusStano 's final comments so we can proceed.

@Gui-FernandesBR Gui-FernandesBR requested a review from Copilot April 7, 2025 13:56
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot reviewed 14 out of 21 changed files in this pull request and generated 1 comment.

Files not reviewed (7)
  • .vscode/settings.json: Language not supported
  • docs/notebooks/monte_carlo_analysis/monte_carlo_analysis_outputs/mrs.outputs.txt: Language not supported
  • docs/reference/classes/MultivariateRejectionSampler.rst: Language not supported
  • docs/reference/index.rst: Language not supported
  • docs/user/index.rst: Language not supported
  • docs/user/mrs.rst: Language not supported
  • docs/user/sensitivity.rst: Language not supported
Comments suppressed due to low confidence (1)

rocketpy/tools.py:595

  • [nitpick] Consider renaming 'flatted_dict' to 'flattened_dict' for clarity and consistency with common terminology.
flatted_dict = {}

@Lucas-Prates Lucas-Prates merged commit 9f2644a into develop Apr 12, 2025
10 checks passed
@Lucas-Prates Lucas-Prates deleted the enh/MRS branch April 12, 2025 09:27
@github-project-automation github-project-automation bot moved this from Next Version to Closed in LibDev Roadmap Apr 12, 2025
MateusStano added a commit that referenced this pull request Apr 21, 2025
commit c674725
Author: Kevin Alcañiz <[email protected]>
Date:   Sat Apr 12 13:40:25 2025 +0200

    ENH: Introduce Net Thrust with pressure corrections (#789)

    * wind factor bug corrected

    the wind factor wasn't applied to the env.wind_velocity properties

    * BUG: StochasticModel visualize attributes of a uniform distribution

    It showed the nominal and the standard deviation values and it doesn't make sense in a uniform distribution. In a np.random.uniform the 'nominal value' is the lower bound of the distribution, and the 'standard deviation' value is the upper bound. Now, a new condition has been added for the uniform distributions where the mean and semi range are calculated and showed. This way the visualize_attribute function will show the whole range where the random values are uniformly taken in

    * variable names corrections

    * Corrections requested by the pylint test

    * ENH: Add pressure corrections for thrust in SolidMotor

    The thrust generated by a SolidMotor is now adjusted for the atmospheric pressure. To achieve that, a new attribute, 'vacuum_thrust', has been created. The 'net_thrust' is the result of 'vacuum_thrust' minus the atmospheric pressure multiplied by the nozzle area.

    * ENH: pylint recommendations done

    * ENH: net thrust method extended to the rest of the motor classes

    * BUG: __post_processed_variables inconsistent array

    * ENH: ruff reformatting

    * Update rocketpy/motors/motor.py

    Co-authored-by: Gui-FernandesBR <[email protected]>

    * ENH: Avoid breaking change

    * ENH: Pressure Thrust method added

    * BUG: call to the thrust function wrong

    * BUG: pressure thrust evaluated when motor is turned off

    * ENH: CHANGELOG updated

    * DOC: definition of exhaust velocity improved

    ---------

    Co-authored-by: Gui-FernandesBR <[email protected]>

commit 9f2644a
Author: Lucas Prates <[email protected]>
Date:   Sat Apr 12 11:27:53 2025 +0200

    ENH: Implement Multivariate Rejection Sampling (MRS) (#738)

    * ENH: implementing a draft version of the Multivarite Rejectio Sampler (MRS).

    * MNT: quick notebook to test MRS during development

    * MNT: refactoring class to match review suggestions

    * ENH: add comparison prints, plots and ellipses to MonteCarlo and finally checks in MRS

    * MNT: add MultivariateRejectionSampler class to inits and apply format

    * DOC: writting .rst documentation for MRS

    * MNT: adding pylint flags to skip checks

    * DOC: completing missing sections in mrs.rst

    * DOC: add changelog and apply sugestions in MRS class

    * DOC: apply suggestions to the MRS.rst

    * MNT: use Union instead of | for type hinting since we have to support python3.9

    * TST: adding unit and integration tests to MRS

    * MNT: use pylint flag to fix linter

    * TST: adding tests to MonteCarlo comparison features

    * MNT: applying suggestions in .rst, better handling nested variables in MRS and applying linters

    * MNT: removing TODO comments from monte_carlo_plots

    * MNT: remove useless TODO

    * MNT: inserting pragmas for no cover and resolving changelog conflict

commit d49c40e
Author: ArthurJWH <[email protected]>
Date:   Fri Apr 11 16:11:20 2025 -0400

    ENH: Create a rocketpy file to store flight simulations (#800)

    * ENH: added .rpy file functionality (see issue 668)

    This commit add 'save_to_rpy' and 'load_from_rpy' functions, that allows saving and loading flights.

    * MNT: adjusting minor changes to .rpy functions and tests.

    Formatted docstrings correctly.
    Reverted duplication of `test_encoding.py` files.
    Version warning will be called when loaded version is more recent.

    * MNT: incorporating previous comments

    Change file management from os to Path
    Adjust docstrings

    * DOC: Added comment about outputs in `to_dict` method

    * MNT: Refactoring `RocketPyDecoder` unpacking operation and other small adjustments

    * DOC: update changelog

    * STY: formatted according to ruff

    * MNT: changing `str | Path` operation to support Python 3.9

    * MNT: fixed trailing commas on .rpy and added shield against `ruff` formatting .rpy and .json files

    * MNT: fixing error related to `test_flight_save_load_no_resimulate`

    When `include_outputs` were set to `True`, it would try to include the additional data into the flight, breaking the test

    * MNT: fixing a typo and adding comment on test coverage

    ---------

    Co-authored-by: Gui-FernandesBR <[email protected]>

commit 6bf70f3
Author: Júlio Machado <[email protected]>
Date:   Sat Apr 5 15:08:53 2025 -0300

    ENH: Support for the RSE file format has been added to the library (#798)

    * ENH: Support for the RSE file format has been added to the library. The import_rse method in the Abstract Motor class and the load_from_rse_file method in the GenericMotor class are now available. With this update, the library natively supports Rock Sim software data, eliminating the need for users to manually convert motor files. The implementation was based on the import_eng and load_from_eng_file methods, utilizing Python's standard XML library.

    * ENH: Adding tests to the methods of .rse file treatment.

    * ENH: fixing mistakes on the method and test file

    * MNT: Running ruff

    * MNT: Adding the PR to CHANGELOG.md

commit 220bb59
Merge: 4a41f7a 4df0b38
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Mar 27 06:14:22 2025 -0300

    Merge pull request #797 from RocketPy-Team/master

    Updates develop after 1.9.0

commit 4df0b38
Author: MateusStano <[email protected]>
Date:   Mon Mar 24 17:35:03 2025 +0100

    REL: Update version to 1.9.0 (#795)

commit 5328d66
Author: MateusStano <[email protected]>
Date:   Mon Mar 24 13:07:52 2025 +0100

    DEP: Remove Pending Deprecations and Add Warnings Where Needed (#794)

    * DEP: Add deprecation warnings for outdated methods and functions

    * DEP: Remove deprecated methods for NOAA RUC soundings and power drag plots

    * DEV: changelog

    * MNT: ruff

    * DEP: Update deprecation warning for post_process method to specify removal in v1.10

    * MNT: Remove unused imports

commit 76fb5ef
Merge: a4b42c3 4a41f7a
Author: Gui-FernandesBR <[email protected]>
Date:   Sun Mar 23 19:17:16 2025 -0300

    Merge pull request #793 from RocketPy-Team/develop

    DEV: Master to v1.9.0

commit 4a41f7a
Author: Kevin Alcañiz <[email protected]>
Date:   Sun Mar 23 21:52:51 2025 +0100

    ENH: Introduce the StochasticAirBrakes class (#785)

    * wind factor bug corrected

    the wind factor wasn't applied to the env.wind_velocity properties

    * BUG: StochasticModel visualize attributes of a uniform distribution

    It showed the nominal and the standard deviation values and it doesn't make sense in a uniform distribution. In a np.random.uniform the 'nominal value' is the lower bound of the distribution, and the 'standard deviation' value is the upper bound. Now, a new condition has been added for the uniform distributions where the mean and semi range are calculated and showed. This way the visualize_attribute function will show the whole range where the random values are uniformly taken in

    * variable names corrections

    * Corrections requested by the pylint test

    * ENH: add multiplication for 2D functions in rocketpy.function

    Added the ability to multiply functions with 2D domains in the __mul__ function

    * ENH: StochasticAirBrakes class created

    The StochasticAirBrakes class has been created. The __init__.py files in the stochastic and rocketpy folders have also been modified accordingly to incorporate this new class

    * ENH: set_air_brakes function created

    This functions appends an airbrake and controller objects previuosly created to the rocket

    * ENH: add StochasticAirBrake to rocketpy.stochastic_rocket

    Some functions has been modified and other has been created in order to include the new StochasticAirBrakes feature into the StochasticRocket class. A new function named 'add_air_brakes' has been created to append a StochasticAirBrakes and Controller objects to the StochasticRocket object. A new function '_create_air_brake' has been introduced to create a sample of an AirBrake object through a StochasticAirBrake object. Enventually, the 'create_object' function has been modified to add the sampled AirBrakes to the sampled Rocket

    * BUG: StochasticAirBrake object input in _Controller

    When defining the _Controller object a StochasticAirBrake was input. This is already corrected and a AirBrake object is now introduced

    * ENH: add time_overshoot option to rocketpy.stochastic_flight

    Since the new StochasticAirBrake class is defined, we need the 'time_overshoot' option in the Flight class to ensure that the time step defined in the simulation is the controller sampling rate. The MonteCarlo class has had to be modified as well to include this option.

    * DOC: StochasticAirBrakes related documentation added

    Documentation related to the StochasticAirBrakes implementation has been added in StochasticAirBrakes, StochasticRocket and Rocket classes.

    * ENH: pylint recommendations done

    * ENH: Reformatted files to pass Ruff linting checks

    * ENH: Update rocketpy/stochastic/stochastic_rocket.py

    Unnecessary comment

    Co-authored-by: Gui-FernandesBR <[email protected]>

    * DOC: improve drag curve factor definition in StochasticAirBrakes

    * ENH: Change assert statement to if

    Co-authored-by: Gui-FernandesBR <[email protected]>

    * DOC: better explanation of __mul__ function

    Co-authored-by: MateusStano <[email protected]>

    * ENH: delete set_air_brakes function for simplicity

    * DOC: CHANGELOG file updated

    ---------

    Co-authored-by: Gui-FernandesBR <[email protected]>
    Co-authored-by: MateusStano <[email protected]>

commit 90553f5
Author: Kevin Alcañiz <[email protected]>
Date:   Sun Mar 23 20:31:50 2025 +0100

    ENH: Add Eccentricity to Stochastic Simulations (#792)

    * wind factor bug corrected

    the wind factor wasn't applied to the env.wind_velocity properties

    * BUG: StochasticModel visualize attributes of a uniform distribution

    It showed the nominal and the standard deviation values and it doesn't make sense in a uniform distribution. In a np.random.uniform the 'nominal value' is the lower bound of the distribution, and the 'standard deviation' value is the upper bound. Now, a new condition has been added for the uniform distributions where the mean and semi range are calculated and showed. This way the visualize_attribute function will show the whole range where the random values are uniformly taken in

    * variable names corrections

    * Corrections requested by the pylint test

    * ENH: more intuitive uniform distribution display in StochasticModel

    Co-authored-by: MateusStano <[email protected]>

    * ENH: Eccentricities added to the StochasticRocket class

    A bug has been corrected in Flight class and an enhancement has been performed in the Rocket class as well

    * BUG: thrust eccentricity bug corrected

    eccentricity_y was defined by x coordinate and eccentricity_x was defined by y coordinate

    * BUG: Undo some Rocket class changes

    * ENH: add eccentricities to StochasticRocket

    * BUG: fix MonteCarlo eccentricity inputs

    * ENH: pylint and ruff recommended changes

    * TST: fix tests with eccentricity

    ---------

    Co-authored-by: Gui-FernandesBR <[email protected]>

commit 7348053
Author: Kevin Alcañiz <[email protected]>
Date:   Sun Mar 23 13:49:35 2025 +0100

    BUG: fix the wind velocity factors usage and better visualization of uniform distributions in Stochastic Classes (#783)

    * wind factor bug corrected

    the wind factor wasn't applied to the env.wind_velocity properties

    * BUG: StochasticModel visualize attributes of a uniform distribution

    It showed the nominal and the standard deviation values and it doesn't make sense in a uniform distribution. In a np.random.uniform the 'nominal value' is the lower bound of the distribution, and the 'standard deviation' value is the upper bound. Now, a new condition has been added for the uniform distributions where the mean and semi range are calculated and showed. This way the visualize_attribute function will show the whole range where the random values are uniformly taken in

    * variable names corrections

    * Corrections requested by the pylint test

    * ENH: more intuitive uniform distribution display in StochasticModel

    Co-authored-by: MateusStano <[email protected]>

    ---------

    Co-authored-by: MateusStano <[email protected]>

commit d2f89ba
Author: Leonardo Rosa <[email protected]>
Date:   Fri Mar 21 18:57:49 2025 -0300

    DEV: add requirements-tests.txt on make install target (#791)

    * DEV: adds 'pip install -r requirements-tests.txt' recipe to 'make install' target on Makefile

    Co-authored-by: Gui-FernandesBR <[email protected]>

commit 91ac567
Author: Leonardo Rosa <[email protected]>
Date:   Fri Mar 21 18:53:53 2025 -0300

    BUG: fixes get_instance_attributes for Flight objects containing a Rocket object without rail buttons (#786)

    * DOC: fixed a typo in funcify_method() description

    * TST: created test for get_instante_attributes() with flight without rail buttons

    * BUG: fixed __calculate_rail_button_forces() by assigning a Function(0) to null_force instead of an empty array

    * DEV: updates CHANGELOG

commit 9407470
Author: Leonard <[email protected]>
Date:   Wed Mar 19 16:01:59 2025 +0100

    BUG: fixed AGL altitude in _FlightPrints.events_registered (#788)

    * BUG: fixed AGL altitude in _FlightPrints.events_registered

    * updeted CHANGELOG
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Enhancement New feature or request, including adjustments in current codes Monte Carlo Monte Carlo and related contents

Projects

Status: Closed

Development

Successfully merging this pull request may close these issues.

ENH: Implement MRS method on RocketPy!

5 participants