Skip to content

[ana6, com8]: Add ana6Optimisation Module, apply changes in com8MoTPSA#1245

Open
RolandFischbacher wants to merge 24 commits intomasterfrom
RF_com8MoTPSA
Open

[ana6, com8]: Add ana6Optimisation Module, apply changes in com8MoTPSA#1245
RolandFischbacher wants to merge 24 commits intomasterfrom
RF_com8MoTPSA

Conversation

@RolandFischbacher
Copy link
Copy Markdown
Contributor

This PR introduces a new optimisation module ana6Optimisation for com8MoTPSA and updates the simulation workflow.


The module ana6Optimisation includes:

  • Calculation of combined loss function (runout + tversky)
  • Morris sensitivity analysis for parameter ranking
  • Sequential and non-sequential surrogate based optimisation routines

New files in ana6Opitmisaton:

  • runMorrisSA.py (configuration: runMorrisSACfg.ini)
  • runPlotMorrisConvergence.py (uses runMorrisSACfg.ini)
  • runOptimisation.py (configuration: runOptimisationCfg.ini)
  • optimisationUtils.py
  • README_ana6.md (contains usage instructions)

New file in out3Plot:

  • outAna6Plots.py

Changed workflow of runing com8MoTPSA:

  • Check prior if simulation is run already
  • Process in chunks not all simulations at once

@RolandFischbacher RolandFischbacher self-assigned this Feb 23, 2026
@RolandFischbacher RolandFischbacher added the enhancement New feature or request label Feb 23, 2026
@qltysh
Copy link
Copy Markdown
Contributor

qltysh bot commented Feb 23, 2026

❌ 3 blocking issues (3 total)

Tool Category Rule Count
black Style Incorrect formatting, autoformat by running qlty fmt. 3

@qltysh one-click actions:

  • Auto-fix formatting (qlty fmt && git push)

@fso42 fso42 added this to the Version 2.0 milestone Feb 23, 2026
@fso42 fso42 changed the title [ana6Opitmisation], [com8MoTPSA]: Add ana6Optimisation Module, apply changes in com8MoTPSA [ana6, com8]: Add ana6Optimisation Module, apply changes in com8MoTPSA Feb 24, 2026
@fso42 fso42 assigned fso42 and unassigned RolandFischbacher Feb 24, 2026
Squash of 20 commits from RF_com8MoTPSA branch including:
- com8MoTPSA workflow improvements (chunked multiprocessing, path handling)
- Bayesian optimisation integration (ana6Optimisation module)
- Morris sensitivity analysis scripts
- AIMEC runout reference implementation
- probAna pickle saving and bounds
- Plotting and config improvements
@qltysh
Copy link
Copy Markdown
Contributor

qltysh bot commented Feb 24, 2026

Qlty

Coverage Impact

⬇️ Merging this pull request will decrease total coverage on master by 0.19%.

Modified Components (1)

RatingComponent% Diff
Coverage rating: C Coverage rating: C
com1DFA

Modified Files with Diff Coverage (2)

RatingFile% DiffUncovered Line #s
Coverage rating: F Coverage rating: F
avaframe/com8MoTPSA/com8MoTPSA.py0.0%21-182
Coverage rating: A Coverage rating: A
avaframe/in3Utils/cfgUtils.py71.4%995, 1016
Total10.0%
🤖 Increase coverage with AI coding...

In the `RF_com8MoTPSA` branch, add test coverage for this new code:

- `avaframe/com8MoTPSA/com8MoTPSA.py` -- Line 21-182
- `avaframe/in3Utils/cfgUtils.py` -- Lines 995 and 1016

🚦 See full report on Qlty Cloud »

🛟 Help
  • Diff Coverage: Coverage for added or modified lines of code (excludes deleted files). Learn more.

  • Total Coverage: Coverage for the whole repository, calculated as the sum of all File Coverage. Learn more.

  • File Coverage: Covered Lines divided by Covered Lines plus Missed Lines. (Excludes non-executable lines including blank lines and comments.)

    • Indirect Changes: Changes to File Coverage for files that were not modified in this PR. Learn more.

@fso42 fso42 assigned RolandFischbacher and unassigned fso42 Feb 24, 2026
- Add bounds to paramValuesD in createSamplesWithVariation (StandardParameters)
- Add writing of visualisation scenario and sampling method to com8MoTPSACfg.ini
@OpenNHM OpenNHM deleted a comment from qltysh bot Feb 27, 2026
@OpenNHM OpenNHM deleted a comment from qltysh bot Feb 27, 2026
…Files in optimisationUtils.py), add possibility to RUN writeCfgFiles with counter
…clean header

Implement modName to make code general and remove adjustText package
…ror and stale values and remove copy paste error.
… added to cfgStart.

And read sample method with fallback; meaning if 'PROBANA' or 'sampleMethod' is missing sample_method contains an empty string
… docstring, tidy up code, add if __name__='__main__': in runPlotMorrisConvergence.py and improve BOConvergencePlot.
Copy link
Copy Markdown
Contributor

@awirb awirb left a comment

Choose a reason for hiding this comment

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

first comments, more to come

# check for allConfigurationsInfo to find computation info and add to info fetched from ini files
if latest == False and isinstance(simDF, pd.DataFrame):
# check if in allConfigurationsInfo also info for existing sims
simDFALL, _ = readAllConfigurationInfo(avaDir, specDir="", configCsvName="allConfigurations")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

would you also require here to set the modName variable that it doesn't just read the allConfigurations.csv from the Outputs of com1DFA?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

allConfigurations.csv is currently not available for com8MoTPSA module

@@ -0,0 +1,64 @@
### Config File - This file contains the main settings for the optimisation process

# Sidenote: (1) when running runOptimisation.py the working directory needs to be in the ana6Optimisation folder
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why is it actually located here and not in the runScripts directory?



[GENERAL]
# USER input for running and plotting a comparison of simulation result to reference polygon
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

does this refer to the settings in runPlotAreaProfile?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yes this refers to the settings in runPlotAreaRefDiffs.py

- **Digital Elevation Model (DEM)**
Must be placed directly in the `Inputs` directory and must cover the entire affected area.

More Details here: https://docs.avaframe.org/en/latest/moduleCom1DFA.html
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

add #input

Copy link
Copy Markdown
Contributor Author

@RolandFischbacher RolandFischbacher Mar 10, 2026

Choose a reason for hiding this comment

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

Do you mean that in provided link in section Inputs?

# Conflicts:
#	avaframe/ana6Optimisation/README_ana6.md
Copy link
Copy Markdown
Contributor

@awirb awirb left a comment

Choose a reason for hiding this comment

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

comments for the optimisation part and plotting still missing

Comment on lines +55 to +56
cfgAIMEC = cfgUtils.getModuleConfig(ana3AIMEC)
rasterTransfo, resAnalysisDF, plotDict, _, pathDict = ana3AIMEC.fullAimecAnalysis(avalancheDir, cfgAIMEC)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of using the passed module, consider loading the config already in the runScript before you call the function and just pass the config, then also the override is easier (using ana3AIMEC_ana3AIMEC_override) or is there a special reason for passing the module?

Copy link
Copy Markdown
Contributor Author

@RolandFischbacher RolandFischbacher Mar 12, 2026

Choose a reason for hiding this comment

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

passing the module in to the calcArealIndicatorsAndAIMEC function is not necessary, since the AIMEC settings are not overridden, i think that not passing the module and loading config here should be sufficient?

)
raise ValueError(message)

paramLossSubsetDF = paramLossDF.sort_values(by='Loss', ascending=True)[:N]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

why is the [:N] needed - is that from start to the end if len(DF) is N no?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

It defines how much of the best ranked morris samples to use for statistics. (e.g. parameter distribution within this topN samples). I changed the name to topN.


def createDFParameterLoss(df, paramSelected):
"""
Create DataFrames linking selected parameters with the loss function.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

does selected mean - the ones that were used for the parameter variation using the morris sampling method?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

selected depends on scenario: if morris is not run prior, then selected means all parameters that were varied, and if morris is run prior, selected means take only topN most important parameters

- The top-N most influential parameters are selected for optimisation.

Scenario 2 (Manual definition):
- No prior Morris screening.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If I understood correctly, Morris analysis could have been performed previously to decide which parameters should be considered in the optimisation and which ones do not have a strong effect on the loss function and are therefore not considered? So scenario 2 just means that first simulations have to be performed to start the optimisation with or used from the ana4Prob run?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

so in contrast in scenario 1 the simulations performed for the morris analysis using the morris sampling are used directly?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yes, the statement is correct.

def loadVariationData(cfgOpt, outDir, avaDir):
"""
Load parameter bounds and selected parameters for optimisation. Two execution modes are supported, controlled via
cfgOpt['PARAM_BOUNDS']['scenario']:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

in the description of the scenarios below, both say that the parameter bounds are either read from sa_parameter_bounds.pkl (scenario 1) or from paramValuesD.pickle created in the runAna4ProbAna (scenario 2) - so cfgOpt['PARAM_BOUNDS'] is not used? consider mentioning already here that this relies on previous simulation runs performed using Morris analysis or ana4ProbAna

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

cfgOpt['PARAM_BOUNDS'] is used to determine which file is read, either sa_parameter_bounds.pkl or paramValuesD.pickle

paramBounds, paramSelected = optimisationUtils.loadVariationData(cfgOpt, inDir, avalancheDir)

# Calculate Areal indicators and AIMEC and save the results in Outputs/ana3AIMEC and Outputs/out1Peak
optimisationUtils.calcArealIndicatorsAndAimec(cfgOpt, avalancheDir, ana3AIMEC)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

so for the areal indicators, the settings are read from cfgOpt for aimec from the aimecCfg - here we could use the override config functionality

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

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants