From 3e79436fc9bec13353cf58d23e5277491a2cffa6 Mon Sep 17 00:00:00 2001 From: Jean-Philippe ARGAUD Date: Tue, 15 Oct 2024 16:10:18 +0200 Subject: [PATCH] Documentation and code update and corrections --- doc/en/examples.rst | 2 + doc/en/images/sampling_01_SampleAsnUplet.png | Bin 14632 -> 14632 bytes .../sampling_02_SampleAsExplicitHyperCube.png | Bin 14632 -> 14632 bytes ...ampling_03_SampleAsMinMaxStepHyperCube.png | Bin 14632 -> 14632 bytes ...mpling_04_SampleAsMinMaxLatinHyperCube.png | Bin 15799 -> 15799 bytes ...ampling_05_SampleAsMinMaxSobolSequence.png | Bin 16216 -> 16216 bytes ...pleAsIndependantRandomVariables_normal.png | Bin 16708 -> 16708 bytes ...leAsIndependantRandomVariables_uniform.png | Bin 14004 -> 14004 bytes ...leAsIndependantRandomVariables_weibull.png | Bin 13608 -> 13608 bytes doc/en/index.rst | 24 +- ...ef_algorithm_ParticleSwarmOptimization.rst | 2 + doc/en/ref_observations_requirements.rst | 2 +- doc/en/ref_output_variables.rst | 2 +- doc/en/scripts/simple_3DVAR1.png | Bin 40888 -> 40888 bytes doc/en/scripts/simple_3DVAR1Plus.png | Bin 42650 -> 42650 bytes doc/en/scripts/simple_3DVAR2_state.png | Bin 33178 -> 33178 bytes doc/en/scripts/simple_3DVAR2_variance.png | Bin 18819 -> 18819 bytes doc/en/scripts/simple_3DVAR3_state.png | Bin 36035 -> 36035 bytes doc/en/scripts/simple_3DVAR3_variance.png | Bin 26719 -> 26719 bytes .../simple_DerivativeFreeOptimization.png | Bin 40186 -> 40186 bytes doc/en/scripts/simple_KalmanFilter1_state.png | Bin 31508 -> 31508 bytes .../scripts/simple_KalmanFilter1_variance.png | Bin 25190 -> 25190 bytes doc/en/scripts/simple_KalmanFilter2_state.png | Bin 31508 -> 31508 bytes .../scripts/simple_KalmanFilter2_variance.png | Bin 25190 -> 25190 bytes ...le_MeasurementsOptimalPositioningTask3.png | Bin 233059 -> 233059 bytes .../scripts/simple_NonLinearLeastSquares.png | Bin 40186 -> 40186 bytes .../simple_ParticleSwarmOptimization1.png | Bin 40413 -> 40413 bytes .../scripts/simple_ReducedModelingTest1.png | Bin 93132 -> 93132 bytes doc/en/scripts/tui_example_07.res | 2 +- doc/en/scripts/tui_example_12.png | Bin 0 -> 93701 bytes doc/en/scripts/tui_example_12.py | 101 + doc/en/scripts/tui_example_12.res | 26 + doc/en/snippets/EntryTypeDataFile.rst | 5 +- doc/en/snippets/Header2Algo04.rst | 2 +- doc/en/snippets/ModuleCompatibility.rst | 14 +- doc/en/snippets/ModuleValidation.rst | 3 +- doc/en/snippets/NoConditionalOutput.rst | 2 +- doc/en/snippets/StoreInitialState.rst | 11 + doc/en/tui.rst | 192 +- doc/fr/examples.rst | 2 + doc/fr/images/sampling_01_SampleAsnUplet.png | Bin 15888 -> 15888 bytes .../sampling_02_SampleAsExplicitHyperCube.png | Bin 15888 -> 15888 bytes ...ampling_03_SampleAsMinMaxStepHyperCube.png | Bin 15888 -> 15888 bytes ...mpling_04_SampleAsMinMaxLatinHyperCube.png | Bin 17108 -> 17108 bytes ...ampling_05_SampleAsMinMaxSobolSequence.png | Bin 17436 -> 17436 bytes ...pleAsIndependantRandomVariables_normal.png | Bin 17891 -> 17891 bytes ...leAsIndependantRandomVariables_uniform.png | Bin 15251 -> 15251 bytes ...leAsIndependantRandomVariables_weibull.png | Bin 14777 -> 14777 bytes doc/fr/index.rst | 29 +- ...thm_EnsembleOfSimulationGenerationTask.rst | 2 +- ...ef_algorithm_ParticleSwarmOptimization.rst | 2 + doc/fr/ref_output_variables.rst | 4 +- doc/fr/ref_sampling_requirements.rst | 2 +- doc/fr/scripts/simple_3DVAR1.png | Bin 41144 -> 41144 bytes doc/fr/scripts/simple_3DVAR1Plus.png | Bin 43869 -> 43869 bytes doc/fr/scripts/simple_3DVAR2_state.png | Bin 31971 -> 31971 bytes doc/fr/scripts/simple_3DVAR2_variance.png | Bin 19002 -> 19002 bytes doc/fr/scripts/simple_3DVAR3_state.png | Bin 34719 -> 34719 bytes doc/fr/scripts/simple_3DVAR3_variance.png | Bin 26989 -> 26989 bytes .../simple_DerivativeFreeOptimization.png | Bin 40395 -> 40395 bytes doc/fr/scripts/simple_KalmanFilter1_state.png | Bin 30177 -> 30177 bytes .../scripts/simple_KalmanFilter1_variance.png | Bin 25376 -> 25376 bytes doc/fr/scripts/simple_KalmanFilter2_state.png | Bin 30177 -> 30177 bytes .../scripts/simple_KalmanFilter2_variance.png | Bin 25376 -> 25376 bytes ...le_MeasurementsOptimalPositioningTask3.png | Bin 237609 -> 237609 bytes .../scripts/simple_NonLinearLeastSquares.png | Bin 40395 -> 40395 bytes .../simple_ParticleSwarmOptimization1.png | Bin 40622 -> 40622 bytes .../scripts/simple_ReducedModelingTest1.png | Bin 93132 -> 93132 bytes doc/fr/scripts/tui_example_07.res | 2 +- doc/fr/scripts/tui_example_11.py | 2 +- doc/fr/scripts/tui_example_12.png | Bin 0 -> 97602 bytes doc/fr/scripts/tui_example_12.py | 101 + doc/fr/scripts/tui_example_12.res | 26 + doc/fr/snippets/Header2Algo04.rst | 11 +- doc/fr/snippets/MaximumNumberOfLocations.rst | 2 +- doc/fr/snippets/ModuleCompatibility.rst | 14 +- doc/fr/snippets/ModuleValidation.rst | 1 + doc/fr/snippets/NoUnconditionalOutput.rst | 2 +- .../SampleAsIndependantRandomVariables.rst | 2 +- .../snippets/SampleAsMinMaxLatinHyperCube.rst | 2 +- .../snippets/SampleAsMinMaxSobolSequence.rst | 2 +- doc/fr/snippets/StoreInitialState.rst | 11 + doc/fr/tui.rst | 194 +- src/daComposant/daAlgorithms/Atoms/ecwapso.py | 10 + src/daComposant/daAlgorithms/Atoms/ecwnpso.py | 10 + src/daComposant/daAlgorithms/Atoms/ecwopso.py | 10 + .../daAlgorithms/Atoms/ecwpspso.py | 9 + src/daComposant/daAlgorithms/Atoms/ecwspso.py | 9 + .../daAlgorithms/Atoms/incr3dvar.py | 4 +- .../daAlgorithms/Atoms/std3dvar.py | 4 +- .../daAlgorithms/Atoms/van3dvar.py | 4 +- .../InterpolationByReducedModelTask.py | 2 +- .../daAlgorithms/ParticleSwarmOptimization.py | 6 + src/daComposant/daCore/Aidsm.py | 1019 +++--- src/daComposant/daCore/AssimilationStudy.py | 5 +- src/daComposant/daCore/BasicObjects.py | 3127 ++++++++++++----- src/daComposant/daCore/ExtendedLogging.py | 83 +- src/daComposant/daCore/Interfaces.py | 1175 ++++--- src/daComposant/daCore/NumericObjects.py | 1360 ++++--- src/daComposant/daCore/Persistence.py | 545 +-- src/daComposant/daCore/PlatformInfo.py | 459 ++- src/daComposant/daCore/Reporting.py | 58 +- src/daComposant/daCore/Templates.py | 361 +- .../daNumerics/Models/Lorenz1963.py | 106 + .../TwoDimensionalInverseDistanceCS2010.py | 28 +- .../TwoDimensionalRosenbrockFunctionR1960.py | 44 +- src/daEficas/prefs_ADAO.py.in | 2 +- 107 files changed, 6314 insertions(+), 2929 deletions(-) create mode 100644 doc/en/scripts/tui_example_12.png create mode 100644 doc/en/scripts/tui_example_12.py create mode 100644 doc/en/scripts/tui_example_12.res create mode 100644 doc/en/snippets/StoreInitialState.rst create mode 100644 doc/fr/scripts/tui_example_12.png create mode 100644 doc/fr/scripts/tui_example_12.py create mode 100644 doc/fr/scripts/tui_example_12.res create mode 100644 doc/fr/snippets/StoreInitialState.rst create mode 100644 src/daComposant/daNumerics/Models/Lorenz1963.py diff --git a/doc/en/examples.rst b/doc/en/examples.rst index 6cd8b44..a42dc85 100644 --- a/doc/en/examples.rst +++ b/doc/en/examples.rst @@ -71,6 +71,8 @@ Dedicated tasks or study oriented cases uses Advanced uses ------------- +#. :ref:`subsection_tui_advanced_ex11` +#. :ref:`subsection_tui_advanced_ex12` #. :ref:`section_advanced_convert_JDC` #. :ref:`section_advanced_YACS_tui` #. :ref:`section_advanced_R` diff --git a/doc/en/images/sampling_01_SampleAsnUplet.png b/doc/en/images/sampling_01_SampleAsnUplet.png index a10feeb3933637e9db62ddafaea52c8915b61396..97907e5ae94efb066c6639cb826f2c47da93dd02 100644 GIT binary patch delta 43 ycmZ2cw4!K&n}VgDk&Z$}Nl8JmmA-y%Vo5Nl8JmmA-y%Vo5Nl8JmmA-y%Vo5Nl8JmmA-y%Vo5Nl8JmmA-y%Vo5l{d=SC_ delta 43 ycmcanccX5Cn}UU&iH<@>Nl8JmmA-y%Vo52PG*u`eo?x2PG*u`eo?xJO{{ delta 43 ycmdmzyCrvmn}UU&iH<@>Nl8JmmA-y%Vo5JR_` delta 43 ycmZ3HwIXYRn}UU&iH<@>Nl8JmmA-y%Vo51y3K=CO1;tkS`nicE1v&X8Ihjd%`9L&62LOHi B5Xk@l delta 45 zcmdn7pJ~T_rU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Q~^0|0nC B5Rw1@ delta 45 zcmbPrmTA^mrU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`92PG*u`eo?x2PG*u`eo?xg09`>3 AYXATM diff --git a/doc/en/scripts/simple_3DVAR2_variance.png b/doc/en/scripts/simple_3DVAR2_variance.png index 7c0181c3e913938b5e6887ed34530e78881cfa45..9715326754d0c8922161d960feb9ef5bcdff7e0d 100644 GIT binary patch delta 45 zcmZpk%-B4cae|wIrJj+FLPkkRL9vy-er{q(K~8>2PG*u`eo?x2PG*u`eo?x+lj-nGrU`BemU>1y3K=CO1;tkS`nicE1v&X8Ihjd%`9Sn*004C! B5Q_i+ delta 45 zcmX>+lj-nGrU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Uke2LO?! B5vBkD delta 45 zcmcbAf${zY#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9ORQ0|1ik B5r6;y delta 45 zcmeyhlj+w^rU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Rzt0sw?V B5hMTr delta 45 zcmbR8jd991#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Rzt0sw?V B5hMTr delta 45 zcmbR8jd991#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9ORQ0|1ik B5r6;y delta 45 zcmeyhlj+w^rU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Q=(1ptYI B5iS4# delta 45 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/en/scripts/tui_example_12.py b/doc/en/scripts/tui_example_12.py new file mode 100644 index 0000000..260dc6d --- /dev/null +++ b/doc/en/scripts/tui_example_12.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# +from matplotlib import pyplot as plt +from numpy import array, set_printoptions +from adao import adaoBuilder +set_printoptions(precision=4, floatmode='fixed') +# +#------------------------------------------------------------------------------- +# +case = adaoBuilder.New() +case.set( 'AlgorithmParameters', + Algorithm='3DVAR', + Parameters = { + "StoreSupplementaryCalculations":[ + "CostFunctionJ", + "CurrentState", + "InnovationAtCurrentState", + ], + } +) +case.set( 'Background', Vector=[0, 1, 2] ) +case.set( 'BackgroundError', ScalarSparseMatrix=1.0 ) +case.set( 'Observation', Vector=array([0.5, 1.5, 2.5]) ) +case.set( 'ObservationError', DiagonalSparseMatrix='1 1 1' ) +case.set( 'ObservationOperator', Matrix='1 0 0;0 2 0;0 0 3' ) +case.set( 'Observer', + Variable="CurrentState", + Template="ValuePrinter", + Info=" Current state:", +) +# +print("Displays current state values, at each step:") +case.execute() +print("") +# +#------------------------------------------------------------------------------- +# +print("Calculation-measurement deviation (or error) indicators") +print(" (display only first 3 steps)") +print("") +CalculMeasureErrors = case.get("InnovationAtCurrentState") +# +print("===> Maximum error between calculations and measurements, at each step:") +print(" ",array( + CalculMeasureErrors.maxs() + [0:3] )) +print("===> Minimum error between calculations and measurements, at each step:") +print(" ",array( + CalculMeasureErrors.mins() + [0:3] )) +print("===> Norm of the error between calculation and measurement, at each step:") +print(" ",array( + CalculMeasureErrors.norms() + [0:3] )) +print("===> Mean absolute error (MAE) between calculations and measurements, at each step:") +print(" ",array( + CalculMeasureErrors.maes() + [0:3] )) +print("===> Mean square error (MSE) between calculations and measurements, at each step:") +print(" ",array( + CalculMeasureErrors.mses() + [0:3] )) +print("===> Root mean square error (RMSE) between calculations and measurements, at each step:") +print(" ",array( + CalculMeasureErrors.rmses() + [0:3] )) +# +#------------------------------------------------------------------------------- +# +import matplotlib.pyplot as plt +plt.rcParams['figure.figsize'] = (8, 12) +# +plt.figure() +plt.suptitle('Indicators built on the current value of the calculation-measurement deviation (or error)\n', fontweight='bold') +plt.subplot(611) +plt.plot(CalculMeasureErrors.maxs(), 'bx--', label='Indicator at current step') +plt.ylabel('Maximum (a.u.)') +plt.legend() +plt.subplot(612) +plt.plot(CalculMeasureErrors.mins(), 'bx--', label='Indicator at current step') +plt.ylabel('Minimum (a.u.)') +plt.legend() +plt.subplot(613) +plt.plot(CalculMeasureErrors.norms(), 'bx-', label='Indicator at current step') +plt.ylabel('Norm (a.u.)') +plt.legend() +plt.subplot(614) +plt.plot(CalculMeasureErrors.maes(), 'kx-', label='Indicator at current step') +plt.ylabel('MAE (a.u.)') +plt.legend() +plt.subplot(615) +plt.plot(CalculMeasureErrors.mses(), 'gx-', label='Indicator at current step') +plt.ylabel('MSE (a.u.)') +plt.legend() +plt.subplot(616) +plt.plot(CalculMeasureErrors.rmses(), 'rx-', label='Indicator at current step') +plt.ylabel('RMSE (a.u.)') +plt.legend() +plt.xlabel('Step size calculation (step number or rank)') +plt.tight_layout() +plt.savefig("tui_example_12.png") diff --git a/doc/en/scripts/tui_example_12.res b/doc/en/scripts/tui_example_12.res new file mode 100644 index 0000000..469fbd6 --- /dev/null +++ b/doc/en/scripts/tui_example_12.res @@ -0,0 +1,26 @@ +Displays current state values, at each step: + Current state: [0.0000 1.0000 2.0000] + Current state: [0.0474 0.9053 1.0056] + Current state: [0.0905 0.8492 0.9461] + Current state: [0.1529 0.7984 0.9367] + Current state: [0.2245 0.7899 0.9436] + Current state: [0.2508 0.8005 0.9486] + Current state: [0.2500 0.7998 0.9502] + Current state: [0.2500 0.8000 0.9500] + Current state: [0.2500 0.8000 0.9500] + +Calculation-measurement deviation (or error) indicators + (display only first 3 steps) + +===> Maximum error between calculations and measurements, at each step: + [0.5000 0.4526 0.4095] +===> Minimum error between calculations and measurements, at each step: + [-3.5000 -0.5169 -0.3384] +===> Norm of the error between calculation and measurement, at each step: + [3.5707 0.7540 0.5670] +===> Mean absolute error (MAE) between calculations and measurements, at each step: + [1.5000 0.4267 0.3154] +===> Mean square error (MSE) between calculations and measurements, at each step: + [4.2500 0.1895 0.1072] +===> Root mean square error (RMSE) between calculations and measurements, at each step: + [2.0616 0.4353 0.3274] diff --git a/doc/en/snippets/EntryTypeDataFile.rst b/doc/en/snippets/EntryTypeDataFile.rst index 855e69b..003c367 100644 --- a/doc/en/snippets/EntryTypeDataFile.rst +++ b/doc/en/snippets/EntryTypeDataFile.rst @@ -43,11 +43,10 @@ Example of TXT file for "*Observation*" variable in "*DataFile*" :: - # Fichier TXT à séparateur espace # TXT file with space delimiter # ============================= - # Ligne de commentaires quelconques débutant par # - # Ligne suivante réservée au nommage des variables + # Comment line beginning with # + # The next line is dedicated to variable naming Alpha1 Observation Alpha2 0.1234 5.6789 9.0123 1.2345 2.3456 3. diff --git a/doc/en/snippets/Header2Algo04.rst b/doc/en/snippets/Header2Algo04.rst index d778b79..92e3781 100644 --- a/doc/en/snippets/Header2Algo04.rst +++ b/doc/en/snippets/Header2Algo04.rst @@ -7,7 +7,7 @@ variables originating from the calculation. The description of named ``get``, of the variable "*ADD*" of the post-processing in graphical interface, or of the case in textual interface. The input variables, available to the user at the output in order to facilitate the writing of post-processing -procedures, are described in the :ref:`subsection_r_o_v_Inventaire`. +procedures, are described in an :ref:`subsection_r_o_v_Inventaire`. **Permanent outputs (non conditional)** diff --git a/doc/en/snippets/ModuleCompatibility.rst b/doc/en/snippets/ModuleCompatibility.rst index dc99912..44ddb74 100644 --- a/doc/en/snippets/ModuleCompatibility.rst +++ b/doc/en/snippets/ModuleCompatibility.rst @@ -10,13 +10,15 @@ remains without guarantee. If an unusual error is encountered for previously running calculations, it is strongly recommended to revert to supporting tool versions within the range described below. -.. csv-table:: Support tool verification intervals for ADAO +.. csv-table:: Support tool verification version intervals for ADAO :header: "Tool", "Minimal version", "Reached version" :widths: 20, 10, 10 + :align: center - Python, 3.6.5, 3.12.3 - Numpy, 1.14.3, 1.26.4 - Scipy, 0.19.1, 1.14.0 - MatplotLib, 2.2.2, 3.8.4 + Python, 3.6.5, 3.12.6 + Numpy, 1.14.3, 2.1.2 + Scipy, 0.19.1, 1.14.1 + MatplotLib, 2.2.2, 3.9.2 GnuplotPy, 1.8, 1.8 - NLopt, 2.4.2, 2.7.1 + NLopt, 2.4.2, 2.8.0 + FMPy, 0.3.20, 0.3.20 diff --git a/doc/en/snippets/ModuleValidation.rst b/doc/en/snippets/ModuleValidation.rst index 4ef9258..494a93b 100644 --- a/doc/en/snippets/ModuleValidation.rst +++ b/doc/en/snippets/ModuleValidation.rst @@ -5,9 +5,10 @@ current document. The validation versions are indicated here for information purposes only, knowing that, in case of doubt, the SALOME version sheet [Salome]_ is the official validation version. -.. csv-table:: Validation versions of support tools for ADAO +.. csv-table:: Validation versions of the support tools for ADAO :header: "Tool", "Version" :widths: 20, 10 + :align: center ADAO, |release| EFICAS, |release| diff --git a/doc/en/snippets/NoConditionalOutput.rst b/doc/en/snippets/NoConditionalOutput.rst index 6bd824c..d99c316 100644 --- a/doc/en/snippets/NoConditionalOutput.rst +++ b/doc/en/snippets/NoConditionalOutput.rst @@ -1 +1 @@ - *None* + *None* (messages or statistics are nevertheless displayed) diff --git a/doc/en/snippets/StoreInitialState.rst b/doc/en/snippets/StoreInitialState.rst new file mode 100644 index 0000000..df9e7e5 --- /dev/null +++ b/doc/en/snippets/StoreInitialState.rst @@ -0,0 +1,11 @@ +.. index:: single: StoreInitialState + +StoreInitialState + *Boolean value*. This variable defines whether the algorithm's initial state + is stored (with True) or not (with False, by default) as the first state in + the iterative sequence of found states. This makes algorithmic iterative + storage identical to temporal iterative storage (similar, for example, to + Kalman filters). + + Example : + ``{"StoreInitialState":False}`` diff --git a/doc/en/tui.rst b/doc/en/tui.rst index 0cda027..54ca033 100644 --- a/doc/en/tui.rst +++ b/doc/en/tui.rst @@ -71,6 +71,7 @@ command, in the SALOME Python command window of the interface, or by the script execution entry of the menu) is the following: .. literalinclude:: scripts/tui_example_01.res + :language: none Detailed setup of an ADAO TUI calculation case +++++++++++++++++++++++++++++++++++++++++++++++ @@ -625,7 +626,7 @@ Get the calculation results separately visualization. Its argument the name of a variable "*Concept*" and returns back the quantity as a list (even if there is only one specimen) of this base variable. For a list of variables and use them, the user has to refer - to the :ref:`subsection_r_o_v_Inventaire` and more generally to the + to an :ref:`subsection_r_o_v_Inventaire` and more generally to the :ref:`section_ref_output_variables` and to the individual documentations of the algorithms. @@ -634,8 +635,8 @@ Saving, loading or converting calculation case commands The saving or loading of a calculation case deals with quantities and actions that are linked by the previous commands, excepted case external operations -(such as, for example, post-processing that can be developped after the -calculation cas). The registered or loaded commands remain fully compatible +(such as, for example, post-processing that can be developed after the +calculation case). The registered or loaded commands remain fully compatible with these Python external case operations. .. index:: single: load @@ -672,47 +673,54 @@ with these Python external case operations. one the commands establishing the current calculation case. Some formats are only available as input or as output. -Obtain information on the case, the computation or the system -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +Getting information about the case, the calculation or the system ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -It's easy to obtain **aggregate information on the study case** as defined by -the user, by using Python's "*print*" command directly on the case, at any -stage during its completion. For example: +There are various ways to obtain global information relating to the calculation +case, the run or the system on which a case is run. -.. literalinclude:: scripts/tui_example_07.py - :language: python +*print* (*case*) + It's easy to obtain **aggregate information on the study case** as defined + by the user, by using Python's "*print*" command directly on the case, at + any stage during its construction. For example: -which result is here: + .. literalinclude:: scripts/tui_example_07.py + :language: python -.. literalinclude:: scripts/tui_example_07.res + which result is here: -.. index:: single: callinfo + .. literalinclude:: scripts/tui_example_07.res + :language: none -**Synthetic information on the number of calls to operator computations** can -be dynamically obtained with the "**callinfo()**" command. These operator -computations are those defined by the user in an ADAO case, for the observation -and evolution operators. It is used after the calculation has been performed in -the ADAO case, bearing in mind that the result of this command is simply empty -when no calculation has been performed: -:: +.. index:: single: callinfo - from adao import adaoBuilder - case = adaoBuilder.New() - ... - case.execute() - print(case.callinfo()) +**callinfo** () + A **synthesized information on the number of calls to operator + calculations** can be dynamically obtained with the "**callinfo()**" + command. These operator calculations are those defined by the user in an + ADAO case, for the observation and evolution operators. It is used after + the case calculation has been executed, bearing in mind that the result of + this command is simply empty when no calculation has been performed: + :: + + from adao import adaoBuilder + case = adaoBuilder.New() + ... + case.execute() + print(case.callinfo()) .. index:: single: sysinfo -Synthetic **system information** can be obtained with the "**sysinfo()**" -command, present in every calculation case. It dynamically returns system -information and details of Python modules useful for ADAO. It is used as -follows: -:: +**sysinfo** () + **Synthetic system information** can be obtained with the "**sysinfo()**" + command, present in every ADAO calculation case. It dynamically returns system + information and details of Python modules useful for ADAO. It is used as + follows: + :: - from adao import adaoBuilder - case = adaoBuilder.New() - print(case.sysinfo()) + from adao import adaoBuilder + case = adaoBuilder.New() + print(case.sysinfo()) .. _subsection_tui_advanced: @@ -722,6 +730,8 @@ More advanced examples of ADAO TUI calculation case We propose here more comprehensive examples of ADAO TUI calculation, by giving the purpose of the example and a set of commands that can achieve this goal. +.. _subsection_tui_advanced_ex11: + Independent holding of the results of a calculation case ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -750,11 +760,127 @@ Finally, the whole problem is set and solved by the following script: The command set execution gives the following results: .. literalinclude:: scripts/tui_example_11.res + :language: none As it should be in twin experiments, when we trust mainly in observations, it is found that we get correctly the parameters that were used to artificially build the observations. +.. _subsection_tui_advanced_ex12: + +Some common numerical indicators : norm, RMS, MSE et RMSE... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +The numerical quantities obtained from an ADAO calculation are often vectors +(such as the analysis :math:`\mathbf{x}^a`) or matrices (such as the analysis +covariance :math:`\mathbf{A}`). They are requested by the user through the +standard "*StoreSupplementaryCalculations*" variable of the ADAO case +algorithm. These quantities are available at each step of an iterative +algorithm, and therefore take the form of a series of vectors, or a series of +matrices. + +These objects support special methods for computing commonly used indicators. +The methods are named by the name of the indicator followed by "*s*" to note +that they apply to a series of elementary objects, and that they themselves +return a series of values. + +Note: some indicators are intended to qualify, for example, a "*value +increment*", a "*value deviation*" or a "*value difference*", rather than a +"*value*" itself. However, there is no computational impossibility to compute +indicators for any given quantity, so it's up to the user to check that the +indicator he is requesting is being used as intended. + +.. index:: single: means + +**means** () + Average of the quantity values, available at each step. + +.. index:: single: stds + +**stds** () + Standard deviation of the quantity values, available at each step. + +.. index:: single: sums + +**sums** () + Sum of the quantity values, available at each step. + +.. index:: single: mins + +**mins** () + Minimum of the quantity values, available at each step. + +.. index:: single: maxs + +**maxs** () + Maximum of the quantity values, available at each step. + +.. index:: single: norms + +**norms** (*_ord=None*) + Norm of the quantity, available at each step (*_ord*: see + *numpy.linalg.norm*). + +.. index:: single: traces + +**traces** (*offset=0*) + Trace of the quantity, available at each step (*offset*: see + *numpy.trace*). + +.. index:: single: maes +.. index:: single: Mean Absolute Error (MAE) + +**maes** (*predictor=None*) + Mean absolute error (**MAE**). This indicator is computed as the average of + the absolute deviations of the quantity from the predictor, and is + available at each step. If the predictor is not specified, this indicator + theoretically applies only to an increment or a difference. + +.. index:: single: mses +.. index:: single: msds +.. index:: single: Mean-Square Error (MSE) +.. index:: single: Mean-Square Deviation (MSD) + +**mses** (*predictor=None*) ou **msds** (*predictor=None*) + Mean square error (**MSE**) or mean-square deviation* (**MSD**). This + indicator is computed as the root-mean-square deviation of the quantity + from the predictor, and is available at each step. If the predictor is not + specified, this indicator theoretically applies only to an increment or + difference. + +.. index:: single: rmses +.. index:: single: rmsds +.. index:: single: Root-Mean-Square Error (RMSE) +.. index:: single: Root-Mean-Square Deviation (RMSD) +.. index:: single: Root-Mean-Square (RMS) + +**rmses** (*predictor=None*) or **rmsds** (*predictor=None*) + Root-mean-square error (**RMSE**) or root-mean-square deviation (**RMSD**). + This indicator is calculated as the root mean square of the deviations of + the quantity from the predictor, and is available at each step. If the + predictor is not specified, this indicator theoretically applies only to an + increment or a difference. In the latter case, it is a **RMS** of the + quantity. + +As a simple example, we can use the calculation example presented above: + +.. literalinclude:: scripts/tui_example_12.py + :language: python + +Execution of the command set gives the following results, which illustrate the +series structure of the indicators, associated with the series of values of the +incremental quantity "*InnovationAtCurrentState*" required: + +.. literalinclude:: scripts/tui_example_12.res + :language: none + +In graphical form, the indicators are displayed over all the steps: + +.. _tui_example_12: +.. image:: scripts/tui_example_12.png + :align: center + :width: 90% + .. [HOMARD] For more information on HOMARD, see the *HOMARD module* and its integrated help available from the main menu *Help* of the SALOME platform. .. [PARAVIS] For more information on PARAVIS, see the *PARAVIS module* and its integrated help available from the main menu *Help* of the SALOME platform. diff --git a/doc/fr/examples.rst b/doc/fr/examples.rst index 076f5f3..d029f51 100644 --- a/doc/fr/examples.rst +++ b/doc/fr/examples.rst @@ -71,6 +71,8 @@ Utilisations d'algorithmes orientés tâches ou études dédiées Utilisations avancées --------------------- +#. :ref:`subsection_tui_advanced_ex11` +#. :ref:`subsection_tui_advanced_ex12` #. :ref:`section_advanced_convert_JDC` #. :ref:`section_advanced_YACS_tui` #. :ref:`section_advanced_R` diff --git a/doc/fr/images/sampling_01_SampleAsnUplet.png b/doc/fr/images/sampling_01_SampleAsnUplet.png index e903025b78fab364cf80735e59cce699ee553a83..f53731c034d4601eea26d88149bd06532cf50acb 100644 GIT binary patch delta 43 ycmbPGGofaJn}VgDk&Z$}Nl8JmmA-y%Vo5Nl8JmmA-y%Vo5Nl8JmmA-y%Vo5Nl8JmmA-y%Vo52PG*u`eo?x2PG*u`eo?x2PG*u`eo?x2PG*u`eo?x2PG*u`eo?x2PG*u`eo?x9) A7ytkO diff --git a/doc/fr/images/sampling_07_SampleAsIndependantRandomVariables_uniform.png b/doc/fr/images/sampling_07_SampleAsIndependantRandomVariables_uniform.png index 894f67ff5f3ac13be2718440e903789b84957b8d..21c90848f1e2b71718110c85c43e1c4fac86f750 100644 GIT binary patch delta 43 ycmbPSKDm5?n}VgDk&Z$}Nl8JmmA-y%Vo5Nl8JmmA-y%Vo5Nl8JmmA-y%Vo51y3K=CO1;tkS`nicE1v&X8Ihjd%`9L$G004fc B5Y7Mq delta 45 zcmdmSkZH$3rU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Q1G1pt$W B5%B;3 delta 45 zcmcb6jp^<+rU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9TCr005u6 B5t#r0 delta 45 zcmaF-lkxFS#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`9lyu#tCi;mU>1y3K=CO1;tkS`nicE1v&X8Ihjd%`9O?j1ORZp B5TO77 delta 45 zcmdlrg>lyu#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`92PG*u`eo?x2PG*u`eo?x1y3K=CO1;tkS`nicE1v&X8Ihjd%`9R;?0sxgS B5Y_+y delta 45 zcmaERiSg|v#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Rb|1ptFV B5cmK9 delta 45 zcmX@To9Xm!rU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9OpW0sxv^ B5pVzi delta 45 zcmaF(n(^Ul#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9T}M0swet B5YPYs delta 45 zcmZ2*jB&v+#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9OpW0sxv^ B5pVzi delta 45 zcmaF(n(^Ul#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9T}M0swet B5YPYs delta 45 zcmZ2*jB&v+#tCi;7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9Y diff --git a/doc/fr/scripts/simple_NonLinearLeastSquares.png b/doc/fr/scripts/simple_NonLinearLeastSquares.png index 74a51d88eba628b1e48fd2d423c70845879c23c5..aefecd4a02ed0bf7263f18c868a2b6e88368d0ba 100644 GIT binary patch delta 45 zcmX@To9Xm!rU`BemU>1y3K=CO1;tkS`nicE1v&X8Ihjd%`9Rb|1ptFV B5cmK9 delta 45 zcmX@To9Xm!rU`Be7J4Q+3K=CO1;tkS`nicE1v&X8Ihjd%`91y3K=CO1;tkS`nicE1v&X8Ihjd%`9P>a0|0r~ B5T*bC delta 45 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 int(yyyymmddhhmm) """ __date = __date.strip() - if __date.count('/') == 2 and __date.count(':') == 0 and __date.count(' ') == 0: + if __date.count("/") == 2 and __date.count(":") == 0 and __date.count(" ") == 0: d, m, y = __date.split("/") __number = (10**4) * int(y) + (10**2) * int(m) + int(d) - elif __date.count('/') == 2 and __date.count(':') == 1 and __date.count(' ') > 0: + elif __date.count("/") == 2 and __date.count(":") == 1 and __date.count(" ") > 0: part1, part2 = __date.split() d, m, y = part1.strip().split("/") h, n = part2.strip().split(":") - __number = (10**8) * int(y) + (10**6) * int(m) + (10**4) * int(d) + (10**2) * int(h) + int(n) + __number = ( + (10**8) * int(y) + + (10**6) * int(m) + + (10**4) * int(d) + + (10**2) * int(h) + + int(n) + ) else: - raise ValueError("Cannot convert \"%s\" as a D/M/Y H:M date"%__date) + raise ValueError('Cannot convert "%s" as a D/M/Y H:M date' % __date) return __number + def vfloat(__value: numpy.ndarray): """ Conversion en flottant d'un vecteur de taille 1 et de dimensions quelconques @@ -516,9 +666,12 @@ def vfloat(__value: numpy.ndarray): elif isinstance(__value, (float, int)): return float(__value) else: - raise ValueError("Error in converting multiple float values from array when waiting for only one") + raise ValueError( + "Error in converting multiple float values from array when waiting for only one" + ) + -def strvect2liststr( __strvect ): +def strvect2liststr(__strvect): """ Fonction de secours, conversion d'une chaîne de caractères de représentation de vecteur en une liste de chaînes de caractères de @@ -530,7 +683,8 @@ def strvect2liststr( __strvect ): __strvect = __strvect.replace(st, " ") # Blanc return __strvect.split() -def strmatrix2liststr( __strvect ): + +def strmatrix2liststr(__strvect): """ Fonction de secours, conversion d'une chaîne de caractères de représentation de matrice en une liste de chaînes de caractères de @@ -541,19 +695,21 @@ def strmatrix2liststr( __strvect ): __strvect = __strvect.replace(",", " ") # Blanc for st in ("]", ")"): __strvect = __strvect.replace(st, ";") # "]" et ")" par ";" - __strvect = re.sub(r';\s*;', r';', __strvect) + __strvect = re.sub(r";\s*;", r";", __strvect) __strvect = __strvect.rstrip(";") # Après ^ et avant v __strmat = [__l.split() for __l in __strvect.split(";")] return __strmat -def checkFileNameConformity( __filename, __warnInsteadOfPrint=True ): + +def checkFileNameConformity(__filename, __warnInsteadOfPrint=True): if sys.platform.startswith("win") and len(__filename) > 256: __conform = False __msg = ( - " For some shared or older file systems on Windows, a file " + \ - "name longer than 256 characters can lead to access problems." + \ - "\n The name of the file in question is the following:" + \ - "\n %s")%(__filename,) + " For some shared or older file systems on Windows, a file " + + "name longer than 256 characters can lead to access problems." + + "\n The name of the file in question is the following:" + + "\n %s" + ) % (__filename,) if __warnInsteadOfPrint: logging.warning(__msg) else: @@ -563,19 +719,21 @@ def checkFileNameConformity( __filename, __warnInsteadOfPrint=True ): # return __conform -def checkFileNameImportability( __filename, __warnInsteadOfPrint=True ): + +def checkFileNameImportability(__filename, __warnInsteadOfPrint=True): if str(__filename).count(".") > 1: __conform = False __msg = ( - " The file name contains %i point(s) before the extension " + \ - "separator, which can potentially lead to problems when " + \ - "importing this file into Python, as it can then be recognized " + \ - "as a sub-module (generating a \"ModuleNotFoundError\"). If it " + \ - "is intentional, make sure that there is no module with the " + \ - "same name as the part before the first point, and that there is " + \ - "no \"__init__.py\" file in the same directory." + \ - "\n The name of the file in question is the following:" + \ - "\n %s")%(int(str(__filename).count(".") - 1), __filename) + " The file name contains %i point(s) before the extension " + + "separator, which can potentially lead to problems when " + + "importing this file into Python, as it can then be recognized " + + 'as a sub-module (generating a "ModuleNotFoundError"). If it ' + + "is intentional, make sure that there is no module with the " + + "same name as the part before the first point, and that there is " + + 'no "__init__.py" file in the same directory.' + + "\n The name of the file in question is the following:" + + "\n %s" + ) % (int(str(__filename).count(".") - 1), __filename) if __warnInsteadOfPrint is None: pass elif __warnInsteadOfPrint: @@ -587,30 +745,32 @@ def checkFileNameImportability( __filename, __warnInsteadOfPrint=True ): # return __conform + # ============================================================================== class SystemUsage(object): """ Permet de récupérer les différentes tailles mémoires du process courant """ + __slots__ = () # # Le module resource renvoie 0 pour les tailles mémoire. On utilise donc # plutôt : http://code.activestate.com/recipes/286222/ et Wikipedia # - _proc_status = '/proc/%d/status' % os.getpid() - _memo_status = '/proc/meminfo' + _proc_status = "/proc/%d/status" % os.getpid() + _memo_status = "/proc/meminfo" _scale = { - 'o' : 1.0, # Multiples SI de l'octet # noqa: E203 - 'ko' : 1.e3, # noqa: E203 - 'Mo' : 1.e6, # noqa: E203 - 'Go' : 1.e9, # noqa: E203 - 'kio': 1024.0, # Multiples binaires de l'octet # noqa: E203 - 'Mio': 1024.0 * 1024.0, # noqa: E203 - 'Gio': 1024.0 * 1024.0 * 1024.0, # noqa: E203 - 'B' : 1.0, # Multiples binaires du byte=octet # noqa: E203 - 'kB' : 1024.0, # noqa: E203 - 'MB' : 1024.0 * 1024.0, # noqa: E203 - 'GB' : 1024.0 * 1024.0 * 1024.0, # noqa: E203 + "o": 1.0, # Multiples SI de l'octet + "ko": 1.0e3, + "Mo": 1.0e6, + "Go": 1.0e9, + "kio": 1024.0, # Multiples binaires de l'octet + "Mio": 1024.0 * 1024.0, + "Gio": 1024.0 * 1024.0 * 1024.0, + "B": 1.0, # Multiples binaires du byte=octet + "kB": 1024.0, + "MB": 1024.0 * 1024.0, + "GB": 1024.0 * 1024.0 * 1024.0, } def __init__(self): @@ -624,33 +784,37 @@ class SystemUsage(object): v = t.read() t.close() except IOError: - return 0.0 # non-Linux? - i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' + return 0.0 # non-Linux? + i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' v = v[i:].split(None, 3) # whitespace if len(v) < 3: - return 0.0 # invalid format? + return 0.0 # invalid format? # convert Vm value to bytes mem = float(v[1]) * self._scale[v[2]] return mem / self._scale[unit] def getAvailablePhysicalMemory(self, unit="o"): "Renvoie la mémoire physique utilisable en octets" - return self._VmA('MemTotal:', unit) + return self._VmA("MemTotal:", unit) def getAvailableSwapMemory(self, unit="o"): "Renvoie la mémoire swap utilisable en octets" - return self._VmA('SwapTotal:', unit) + return self._VmA("SwapTotal:", unit) def getAvailableMemory(self, unit="o"): "Renvoie la mémoire totale (physique+swap) utilisable en octets" - return self._VmA('MemTotal:', unit) + self._VmA('SwapTotal:', unit) + return self._VmA("MemTotal:", unit) + self._VmA("SwapTotal:", unit) def getUsableMemory(self, unit="o"): """Renvoie la mémoire utilisable en octets Rq : il n'est pas sûr que ce décompte soit juste... """ - return self._VmA('MemFree:', unit) + self._VmA('SwapFree:', unit) + \ - self._VmA('Cached:', unit) + self._VmA('SwapCached:', unit) + return ( + self._VmA("MemFree:", unit) + + self._VmA("SwapFree:", unit) + + self._VmA("Cached:", unit) + + self._VmA("SwapCached:", unit) + ) def _VmB(self, VmKey, unit): "Lecture des paramètres mémoire du processus" @@ -659,34 +823,35 @@ class SystemUsage(object): v = t.read() t.close() except IOError: - return 0.0 # non-Linux? - i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' + return 0.0 # non-Linux? + i = v.index(VmKey) # get VmKey line e.g. 'VmRSS: 9999 kB\n ...' v = v[i:].split(None, 3) # whitespace if len(v) < 3: - return 0.0 # invalid format? + return 0.0 # invalid format? # convert Vm value to bytes mem = float(v[1]) * self._scale[v[2]] return mem / self._scale[unit] def getUsedMemory(self, unit="o"): "Renvoie la mémoire résidente utilisée en octets" - return self._VmB('VmRSS:', unit) + return self._VmB("VmRSS:", unit) def getVirtualMemory(self, unit="o"): "Renvoie la mémoire totale utilisée en octets" - return self._VmB('VmSize:', unit) + return self._VmB("VmSize:", unit) def getUsedStacksize(self, unit="o"): "Renvoie la taille du stack utilisé en octets" - return self._VmB('VmStk:', unit) + return self._VmB("VmStk:", unit) def getMaxUsedMemory(self, unit="o"): "Renvoie la mémoire résidente maximale mesurée" - return self._VmB('VmHWM:', unit) + return self._VmB("VmHWM:", unit) def getMaxVirtualMemory(self, unit="o"): "Renvoie la mémoire totale maximale mesurée" - return self._VmB('VmPeak:', unit) + return self._VmB("VmPeak:", unit) + # ============================================================================== if __name__ == "__main__": diff --git a/src/daComposant/daCore/Reporting.py b/src/daComposant/daCore/Reporting.py index 5d2af38..b5a934d 100644 --- a/src/daComposant/daCore/Reporting.py +++ b/src/daComposant/daCore/Reporting.py @@ -31,15 +31,17 @@ import os.path # ============================================================================== # Classes de services non utilisateur + class _ReportPartM__(object): """ Store and retrieve the data for C: internal class """ + __slots__ = ("__part", "__styles", "__content") def __init__(self, part="default"): - self.__part = str(part) - self.__styles = [] + self.__part = str(part) + self.__styles = [] self.__content = [] def append(self, content, style="p", position=-1): @@ -57,17 +59,19 @@ class _ReportPartM__(object): def get_content(self): return self.__content + class _ReportM__(object): """ Store and retrieve the data for C: internal class """ - __slots__ = ("__document") - def __init__(self, part='default'): + __slots__ = ("__document",) + + def __init__(self, part="default"): self.__document = {} self.__document[part] = _ReportPartM__(part) - def append(self, content, style="p", position=-1, part='default'): + def append(self, content, style="p", position=-1, part="default"): if part not in self.__document: self.__document[part] = _ReportPartM__(part) self.__document[part].append(content, style, position) @@ -86,10 +90,12 @@ class _ReportM__(object): def clear(self): self.__init__() + class __ReportC__(object): """ Get user commands, update M and V: user intertace to create the report """ + __slots__ = () # m = _ReportM__() @@ -105,11 +111,13 @@ class __ReportC__(object): def clear(self): self.m.clear() + class __ReportV__(object): """ Interact with user and C: template for reports """ - __slots__ = ("c") + + __slots__ = ("c",) # default_filename = "report.txt" @@ -122,7 +130,7 @@ class __ReportV__(object): _filename = os.path.abspath(filename) # _inside = self.get() - fid = open(_filename, 'w') + fid = open(_filename, "w") fid.write(_inside) fid.close() return filename, _filename @@ -137,14 +145,17 @@ class __ReportV__(object): del self.c return 0 + # ============================================================================== # Classes d'interface utilisateur : ReportViewIn*, ReportStorage # Tags de structure : (title, h1, h2, h3, p, uli, oli, , ) + class ReportViewInHtml(__ReportV__): """ Report in HTML """ + __slots__ = () # default_filename = "report.html" @@ -164,7 +175,11 @@ class ReportViewInHtml(__ReportV__): try: ii = ps.index("title") title = pc[ii] - pg += "%s\n%s\n%s"%('

', title, '


') + pg += "%s\n%s\n%s" % ( + '

', + title, + "


", + ) except Exception: pass for ip, sp in enumerate(ps): @@ -186,14 +201,16 @@ class ReportViewInHtml(__ReportV__): for tp in self.tags: if sp == tp: sp = self.tags[tp] - pg += "\n<%s>%s"%(sp, cp, sp) + pg += "\n<%s>%s" % (sp, cp, sp) pg += "\n\n" return pg + class ReportViewInRst(__ReportV__): """ Report in RST """ + __slots__ = () # default_filename = "report.rst" @@ -223,7 +240,7 @@ class ReportViewInRst(__ReportV__): try: ii = ps.index("title") title = pc[ii] - pg += "%s\n%s\n%s"%("=" * 80, title, "=" * 80) + pg += "%s\n%s\n%s" % ("=" * 80, title, "=" * 80) except Exception: pass for ip, sp in enumerate(ps): @@ -243,16 +260,22 @@ class ReportViewInRst(__ReportV__): for tp in self.translation: cp = cp.replace(tp, self.translation[tp]) if sp in self.titles.keys(): - pg += "\n%s\n%s\n%s"%(self.titles[sp][0] * len(cp), cp, self.titles[sp][1] * len(cp)) + pg += "\n%s\n%s\n%s" % ( + self.titles[sp][0] * len(cp), + cp, + self.titles[sp][1] * len(cp), + ) elif sp in self.tags.keys(): - pg += "%s%s%s"%(self.tags[sp][0], cp, self.tags[sp][1]) + pg += "%s%s%s" % (self.tags[sp][0], cp, self.tags[sp][1]) pg += "\n" return pg + class ReportViewInPlainTxt(__ReportV__): """ Report in plain TXT """ + # __slots__ = () # @@ -283,7 +306,7 @@ class ReportViewInPlainTxt(__ReportV__): try: ii = ps.index("title") title = pc[ii] - pg += "%s\n%s\n%s"%("=" * 80, title, "=" * 80) + pg += "%s\n%s\n%s" % ("=" * 80, title, "=" * 80) except Exception: pass for ip, sp in enumerate(ps): @@ -299,12 +322,17 @@ class ReportViewInPlainTxt(__ReportV__): for tp in self.translation: cp = cp.replace(tp, self.translation[tp]) if sp in self.titles.keys(): - pg += "\n%s\n%s\n%s"%(self.titles[sp][0] * len(cp), cp, -self.titles[sp][1] * len(cp)) + pg += "\n%s\n%s\n%s" % ( + self.titles[sp][0] * len(cp), + cp, + -self.titles[sp][1] * len(cp), + ) elif sp in self.tags.keys(): - pg += "\n%s%s%s"%(self.tags[sp][0], cp, self.tags[sp][1]) + pg += "\n%s%s%s" % (self.tags[sp][0], cp, self.tags[sp][1]) pg += "\n" return pg + # Interface utilisateur de stockage des informations ReportStorage = __ReportC__ diff --git a/src/daComposant/daCore/Templates.py b/src/daComposant/daCore/Templates.py index b14072b..54b4253 100644 --- a/src/daComposant/daCore/Templates.py +++ b/src/daComposant/daCore/Templates.py @@ -29,32 +29,36 @@ __all__ = ["ObserverTemplates"] import numpy + # ============================================================================== class TemplateStorage(object): """ Classe générale de stockage de type dictionnaire étendu (Template) """ + __slots__ = ("__preferedLanguage", "__values", "__order") - def __init__( self, language = "fr_FR" ): + def __init__(self, language="fr_FR"): self.__preferedLanguage = language - self.__values = {} - self.__order = -1 + self.__values = {} + self.__order = -1 - def store( self, name = None, content = None, fr_FR = "", en_EN = "", order = "next" ): + def store(self, name=None, content=None, fr_FR="", en_EN="", order="next"): "D.store(k, c, fr_FR, en_EN, o) -> Store template k and its main characteristics" if name is None or content is None: - raise ValueError("To be consistent, the storage of a template must provide a name and a content.") + raise ValueError( + "To be consistent, the storage of a template must provide a name and a content." + ) if order == "next": self.__order += 1 else: self.__order = int(order) self.__values[str(name)] = { - 'content': str(content), - 'fr_FR' : str(fr_FR), # noqa: E203 - 'en_EN' : str(en_EN), # noqa: E203 - 'order' : int(self.__order), # noqa: E203 + "content": str(content), + "fr_FR": str(fr_FR), + "en_EN": str(en_EN), + "order": int(self.__order), } def keys(self): @@ -70,11 +74,11 @@ class TemplateStorage(object): "x.__len__() <==> len(x)" return len(self.__values) - def __getitem__(self, name=None ): + def __getitem__(self, name=None): "x.__getitem__(y) <==> x[y]" - return self.__values[name]['content'] + return self.__values[name]["content"] - def getdoc(self, name = None, lang = "fr_FR"): + def getdoc(self, name=None, lang="fr_FR"): "D.getdoc(k, l) -> Return documentation of key k in language l" if lang not in self.__values[name]: lang = self.__preferedLanguage @@ -84,247 +88,248 @@ class TemplateStorage(object): "D.keys_in_presentation_order() -> list of D's keys in presentation order" __orders = [] for ik in self.keys(): - __orders.append( self.__values[ik]['order'] ) + __orders.append(self.__values[ik]["order"]) __reorder = numpy.array(__orders).argsort() return (numpy.array(self.keys())[__reorder]).tolist() + # ============================================================================== ObserverTemplates = TemplateStorage() ObserverTemplates.store( - name = "ValuePrinter", - content = """print(str(info)+" "+str(var[-1]))""", - fr_FR = "Imprime sur la sortie standard la valeur courante de la variable", - en_EN = "Print on standard output the current value of the variable", - order = "next", + name="ValuePrinter", + content="""print(str(info)+" "+str(var[-1]))""", + fr_FR="Imprime sur la sortie standard la valeur courante de la variable", + en_EN="Print on standard output the current value of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueAndIndexPrinter", - content = """print(str(info)+(" index %i:"%(len(var)-1))+" "+str(var[-1]))""", - fr_FR = "Imprime sur la sortie standard la valeur courante de la variable, en ajoutant son index", - en_EN = "Print on standard output the current value of the variable, adding its index", - order = "next", + name="ValueAndIndexPrinter", + content="""print(str(info)+(" index %i:"%(len(var)-1))+" "+str(var[-1]))""", + fr_FR="Imprime sur la sortie standard la valeur courante de la variable, en ajoutant son index", + en_EN="Print on standard output the current value of the variable, adding its index", + order="next", ) ObserverTemplates.store( - name = "ValueSeriePrinter", - content = """print(str(info)+" "+str(var[:]))""", - fr_FR = "Imprime sur la sortie standard la série des valeurs de la variable", - en_EN = "Print on standard output the value series of the variable", - order = "next", + name="ValueSeriePrinter", + content="""print(str(info)+" "+str(var[:]))""", + fr_FR="Imprime sur la sortie standard la série des valeurs de la variable", + en_EN="Print on standard output the value series of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueSaver", - content = """import numpy, re\nv=numpy.array(var[-1], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", - fr_FR = "Enregistre la valeur courante de la variable dans un fichier du répertoire '/tmp' nommé 'value...txt' selon le nom de la variable et l'étape d'enregistrement", - en_EN = "Save the current value of the variable in a file of the '/tmp' directory named 'value...txt' from the variable name and the saving step", - order = "next", + name="ValueSaver", + content="""import numpy, re\nv=numpy.array(var[-1], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", + fr_FR="Enregistre la valeur courante de la variable dans un fichier du répertoire '/tmp' nommé 'value...txt' selon le nom de la variable et l'étape d'enregistrement", + en_EN="Save the current value of the variable in a file of the '/tmp' directory named 'value...txt' from the variable name and the saving step", + order="next", ) ObserverTemplates.store( - name = "ValueSerieSaver", - content = """import numpy, re\nv=numpy.array(var[:], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", - fr_FR = "Enregistre la série des valeurs de la variable dans un fichier du répertoire '/tmp' nommé 'value...txt' selon le nom de la variable et l'étape", - en_EN = "Save the value series of the variable in a file of the '/tmp' directory named 'value...txt' from the variable name and the saving step", - order = "next", + name="ValueSerieSaver", + content="""import numpy, re\nv=numpy.array(var[:], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", + fr_FR="Enregistre la série des valeurs de la variable dans un fichier du répertoire '/tmp' nommé 'value...txt' selon le nom de la variable et l'étape", + en_EN="Save the value series of the variable in a file of the '/tmp' directory named 'value...txt' from the variable name and the saving step", + order="next", ) ObserverTemplates.store( - name = "ValuePrinterAndSaver", - content = """import numpy, re\nv=numpy.array(var[-1], ndmin=1)\nprint(str(info)+" "+str(v))\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", - fr_FR = "Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur courante de la variable", - en_EN = "Print on standard output and, in the same time save in a file of the '/tmp' directory, the current value of the variable", - order = "next", + name="ValuePrinterAndSaver", + content="""import numpy, re\nv=numpy.array(var[-1], ndmin=1)\nprint(str(info)+" "+str(v))\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", + fr_FR="Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur courante de la variable", + en_EN="Print on standard output and, in the same time save in a file of the '/tmp' directory, the current value of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueIndexPrinterAndSaver", - content = """import numpy, re\nv=numpy.array(var[-1], ndmin=1)\nprint(str(info)+(" index %i:"%(len(var)-1))+" "+str(v))\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", - fr_FR = "Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur courante de la variable, en ajoutant son index", - en_EN = "Print on standard output and, in the same time save in a file of the '/tmp' directory, the current value of the variable, adding its index", - order = "next", + name="ValueIndexPrinterAndSaver", + content="""import numpy, re\nv=numpy.array(var[-1], ndmin=1)\nprint(str(info)+(" index %i:"%(len(var)-1))+" "+str(v))\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", + fr_FR="Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur courante de la variable, en ajoutant son index", + en_EN="Print on standard output and, in the same time save in a file of the '/tmp' directory, the current value of the variable, adding its index", + order="next", ) ObserverTemplates.store( - name = "ValueSeriePrinterAndSaver", - content = """import numpy, re\nv=numpy.array(var[:], ndmin=1)\nprint(str(info)+" "+str(v))\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", - fr_FR = "Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp', la série des valeurs de la variable", - en_EN = "Print on standard output and, in the same time, save in a file of the '/tmp' directory, the value series of the variable", - order = "next", + name="ValueSeriePrinterAndSaver", + content="""import numpy, re\nv=numpy.array(var[:], ndmin=1)\nprint(str(info)+" "+str(v))\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)""", + fr_FR="Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp', la série des valeurs de la variable", + en_EN="Print on standard output and, in the same time, save in a file of the '/tmp' directory, the value series of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueGnuPlotter", - content = """import numpy, Gnuplot\nv=numpy.array(var[-1], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", - fr_FR = "Affiche graphiquement avec Gnuplot la valeur courante de la variable (affichage persistant)", - en_EN = "Graphically plot with Gnuplot the current value of the variable (persistent plot)", - order = "next", + name="ValueGnuPlotter", + content="""import numpy, Gnuplot\nv=numpy.array(var[-1], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", + fr_FR="Affiche graphiquement avec Gnuplot la valeur courante de la variable (affichage persistant)", + en_EN="Graphically plot with Gnuplot the current value of the variable (persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValueSerieGnuPlotter", - content = """import numpy, Gnuplot\nv=numpy.array(var[:], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\n gp('set xlabel \"Step\"')\n gp('set ylabel \"Variable\"')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", - fr_FR = "Affiche graphiquement avec Gnuplot la série des valeurs de la variable (affichage persistant)", - en_EN = "Graphically plot with Gnuplot the value series of the variable (persistent plot)", - order = "next", + name="ValueSerieGnuPlotter", + content="""import numpy, Gnuplot\nv=numpy.array(var[:], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\n gp('set xlabel \"Step\"')\n gp('set ylabel \"Variable\"')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", + fr_FR="Affiche graphiquement avec Gnuplot la série des valeurs de la variable (affichage persistant)", + en_EN="Graphically plot with Gnuplot the value series of the variable (persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValuePrinterAndGnuPlotter", - content = """print(str(info)+' '+str(var[-1]))\nimport numpy, Gnuplot\nv=numpy.array(var[-1], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", - fr_FR = "Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la valeur courante de la variable (affichage persistant)", - en_EN = "Print on standard output and, in the same time, graphically plot with Gnuplot the current value of the variable (persistent plot)", - order = "next", + name="ValuePrinterAndGnuPlotter", + content="""print(str(info)+' '+str(var[-1]))\nimport numpy, Gnuplot\nv=numpy.array(var[-1], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", + fr_FR="Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la valeur courante de la variable (affichage persistant)", + en_EN="Print on standard output and, in the same time, graphically plot with Gnuplot the current value of the variable (persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValueSeriePrinterAndGnuPlotter", - content = """print(str(info)+' '+str(var[:]))\nimport numpy, Gnuplot\nv=numpy.array(var[:], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\n gp('set xlabel \"Step\"')\n gp('set ylabel \"Variable\"')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", - fr_FR = "Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la série des valeurs de la variable (affichage persistant)", - en_EN = "Print on standard output and, in the same time, graphically plot with Gnuplot the value series of the variable (persistent plot)", - order = "next", + name="ValueSeriePrinterAndGnuPlotter", + content="""print(str(info)+' '+str(var[:]))\nimport numpy, Gnuplot\nv=numpy.array(var[:], ndmin=1)\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\n gp('set xlabel \"Step\"')\n gp('set ylabel \"Variable\"')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", + fr_FR="Imprime sur la sortie standard et, en même temps, affiche graphiquement avec Gnuplot la série des valeurs de la variable (affichage persistant)", + en_EN="Print on standard output and, in the same time, graphically plot with Gnuplot the value series of the variable (persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValuePrinterSaverAndGnuPlotter", - content = """print(str(info)+' '+str(var[-1]))\nimport numpy, re\nv=numpy.array(var[-1], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)\nimport Gnuplot\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", - fr_FR = "Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp' et affiche graphiquement la valeur courante de la variable (affichage persistant)", - en_EN = "Print on standard output and, in the same, time save in a file of the '/tmp' directory and graphically plot the current value of the variable (persistent plot)", - order = "next", + name="ValuePrinterSaverAndGnuPlotter", + content="""print(str(info)+' '+str(var[-1]))\nimport numpy, re\nv=numpy.array(var[-1], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)\nimport Gnuplot\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", + fr_FR="Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp' et affiche graphiquement la valeur courante de la variable (affichage persistant)", + en_EN="Print on standard output and, in the same, time save in a file of the '/tmp' directory and graphically plot the current value of the variable (persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValueSeriePrinterSaverAndGnuPlotter", - content = """print(str(info)+' '+str(var[:]))\nimport numpy, re\nv=numpy.array(var[:], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)\nimport Gnuplot\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\n gp('set xlabel \"Step\"')\n gp('set ylabel \"Variable\"')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", - fr_FR = "Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp' et affiche graphiquement la série des valeurs de la variable (affichage persistant)", - en_EN = "Print on standard output and, in the same, time save in a file of the '/tmp' directory and graphically plot the value series of the variable (persistent plot)", - order = "next", + name="ValueSeriePrinterSaverAndGnuPlotter", + content="""print(str(info)+' '+str(var[:]))\nimport numpy, re\nv=numpy.array(var[:], ndmin=1)\nglobal istep\ntry:\n istep+=1\nexcept:\n istep=0\nf='/tmp/value_%s_%05i.txt'%(info,istep)\nf=re.sub(r'\\s','_',f)\nprint('Value saved in \"%s\"'%f)\nnumpy.savetxt(f,v)\nimport Gnuplot\nglobal igfig, gp\ntry:\n igfig+=1\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\nexcept:\n igfig=0\n gp=Gnuplot.Gnuplot(persist=1)\n gp('set title \"%s (Figure %i)\"'%(info,igfig))\n gp('set style data lines')\n gp('set xlabel \"Step\"')\n gp('set ylabel \"Variable\"')\ngp.plot( Gnuplot.Data( v, with_='lines lw 2' ) )""", + fr_FR="Imprime sur la sortie standard et, en même temps, enregistre dans un fichier du répertoire '/tmp' et affiche graphiquement la série des valeurs de la variable (affichage persistant)", + en_EN="Print on standard output and, in the same, time save in a file of the '/tmp' directory and graphically plot the value series of the variable (persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValueMatPlotter", - content = """import numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la valeur courante de la variable (affichage non persistant)", - en_EN = "Graphically plot with Matplolib the current value of the variable (non persistent plot)", - order = "next", + name="ValueMatPlotter", + content="""import numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la valeur courante de la variable (affichage non persistant)", + en_EN="Graphically plot with Matplolib the current value of the variable (non persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValueMatPlotterSaver", - content = """import numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la valeur courante de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", - en_EN = "Graphically plot with Matplolib the current value of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", - order = "next", + name="ValueMatPlotterSaver", + content="""import numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la valeur courante de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", + en_EN="Graphically plot with Matplolib the current value of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", + order="next", ) ObserverTemplates.store( - name = "ValueSerieMatPlotter", - content = """import numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la série des valeurs de la variable (affichage non persistant)", - en_EN = "Graphically plot with Matplolib the value series of the variable (non persistent plot)", - order = "next", + name="ValueSerieMatPlotter", + content="""import numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la série des valeurs de la variable (affichage non persistant)", + en_EN="Graphically plot with Matplolib the value series of the variable (non persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValueSerieMatPlotterSaver", - content = """import numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la série des valeurs de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", - en_EN = "Graphically plot with Matplolib the value series of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", - order = "next", + name="ValueSerieMatPlotterSaver", + content="""import numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la série des valeurs de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", + en_EN="Graphically plot with Matplolib the value series of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", + order="next", ) ObserverTemplates.store( - name = "ValuePrinterAndMatPlotter", - content = """print(str(info)+' '+str(var[-1]))\nimport numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la valeur courante de la variable (affichage non persistant)", - en_EN = "Graphically plot with Matplolib the current value of the variable (non persistent plot)", - order = "next", + name="ValuePrinterAndMatPlotter", + content="""print(str(info)+' '+str(var[-1]))\nimport numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la valeur courante de la variable (affichage non persistant)", + en_EN="Graphically plot with Matplolib the current value of the variable (non persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValuePrinterAndMatPlotterSaver", - content = """print(str(info)+' '+str(var[-1]))\nimport numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la valeur courante de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", - en_EN = "Graphically plot with Matplolib the current value of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", - order = "next", + name="ValuePrinterAndMatPlotterSaver", + content="""print(str(info)+' '+str(var[-1]))\nimport numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[-1], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la valeur courante de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", + en_EN="Graphically plot with Matplolib the current value of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", + order="next", ) ObserverTemplates.store( - name = "ValueSeriePrinterAndMatPlotter", - content = """print(str(info)+' '+str(var[:]))\nimport numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la série des valeurs de la variable (affichage non persistant)", - en_EN = "Graphically plot with Matplolib the value series of the variable (non persistent plot)", - order = "next", + name="ValueSeriePrinterAndMatPlotter", + content="""print(str(info)+' '+str(var[:]))\nimport numpy\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la série des valeurs de la variable (affichage non persistant)", + en_EN="Graphically plot with Matplolib the value series of the variable (non persistent plot)", + order="next", ) ObserverTemplates.store( - name = "ValueSeriePrinterAndMatPlotterSaver", - content = """print(str(info)+' '+str(var[:]))\nimport numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", - fr_FR = "Affiche graphiquement avec Matplolib la série des valeurs de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", - en_EN = "Graphically plot with Matplolib the value series of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", - order = "next", + name="ValueSeriePrinterAndMatPlotterSaver", + content="""print(str(info)+' '+str(var[:]))\nimport numpy, re\nimport matplotlib.pyplot as plt\nv=numpy.array(var[:], ndmin=1)\nglobal imfig, mp, ax\nplt.ion()\ntry:\n imfig+=1\n mp.suptitle('%s (Figure %i)'%(info,imfig))\nexcept:\n imfig=0\n mp = plt.figure()\n ax = mp.add_subplot(1, 1, 1)\n mp.suptitle('%s (Figure %i)'%(info,imfig))\n ax.set_xlabel('Step')\n ax.set_ylabel('Variable')\nax.plot(v)\nf='/tmp/figure_%s_%05i.pdf'%(info,imfig)\nf=re.sub(r'\\s','_',f)\nplt.savefig(f)\nplt.show()""", + fr_FR="Affiche graphiquement avec Matplolib la série des valeurs de la variable, et enregistre la figure dans un fichier du répertoire '/tmp' (figure persistante)", + en_EN="Graphically plot with Matplolib the value series of the variable, and save the figure in a file of the '/tmp' directory (persistant figure)", + order="next", ) ObserverTemplates.store( - name = "ValueMean", - content = """import numpy\nprint(str(info)+' '+str(numpy.nanmean(var[-1])))""", - fr_FR = "Imprime sur la sortie standard la moyenne de la valeur courante de la variable", - en_EN = "Print on standard output the mean of the current value of the variable", - order = "next", + name="ValueMean", + content="""import numpy\nprint(str(info)+' '+str(numpy.nanmean(var[-1])))""", + fr_FR="Imprime sur la sortie standard la moyenne de la valeur courante de la variable", + en_EN="Print on standard output the mean of the current value of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueStandardError", - content = """import numpy\nprint(str(info)+' '+str(numpy.nanstd(var[-1])))""", - fr_FR = "Imprime sur la sortie standard l'écart-type de la valeur courante de la variable", - en_EN = "Print on standard output the standard error of the current value of the variable", - order = "next", + name="ValueStandardError", + content="""import numpy\nprint(str(info)+' '+str(numpy.nanstd(var[-1])))""", + fr_FR="Imprime sur la sortie standard l'écart-type de la valeur courante de la variable", + en_EN="Print on standard output the standard error of the current value of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueVariance", - content = """import numpy\nprint(str(info)+' '+str(numpy.nanvar(var[-1])))""", - fr_FR = "Imprime sur la sortie standard la variance de la valeur courante de la variable", - en_EN = "Print on standard output the variance of the current value of the variable", - order = "next", + name="ValueVariance", + content="""import numpy\nprint(str(info)+' '+str(numpy.nanvar(var[-1])))""", + fr_FR="Imprime sur la sortie standard la variance de la valeur courante de la variable", + en_EN="Print on standard output the variance of the current value of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueL2Norm", - content = """import numpy\nv = numpy.ravel( var[-1] )\nprint(str(info)+' '+str(float( numpy.linalg.norm(v) )))""", - fr_FR = "Imprime sur la sortie standard la norme L2 de la valeur courante de la variable", - en_EN = "Print on standard output the L2 norm of the current value of the variable", - order = "next", + name="ValueL2Norm", + content="""import numpy\nv = numpy.ravel( var[-1] )\nprint(str(info)+' '+str(float( numpy.linalg.norm(v) )))""", + fr_FR="Imprime sur la sortie standard la norme L2 de la valeur courante de la variable", + en_EN="Print on standard output the L2 norm of the current value of the variable", + order="next", ) ObserverTemplates.store( - name = "ValueRMS", - content = """import numpy\nv = numpy.ravel( var[-1] )\nprint(str(info)+' '+str(float( numpy.sqrt((1./v.size)*numpy.dot(v,v)) )))""", - fr_FR = "Imprime sur la sortie standard la racine de la moyenne des carrés (RMS), ou moyenne quadratique, de la valeur courante de la variable", - en_EN = "Print on standard output the root mean square (RMS), or quadratic mean, of the current value of the variable", - order = "next", + name="ValueRMS", + content="""import numpy\nv = numpy.ravel( var[-1] )\nprint(str(info)+' '+str(float( numpy.sqrt((1./v.size)*numpy.dot(v,v)) )))""", + fr_FR="Imprime sur la sortie standard la racine de la moyenne des carrés (RMS), ou moyenne quadratique, de la valeur courante de la variable", + en_EN="Print on standard output the root mean square (RMS), or quadratic mean, of the current value of the variable", + order="next", ) # ============================================================================== UserPostAnalysisTemplates = TemplateStorage() UserPostAnalysisTemplates.store( - name = "AnalysisPrinter", - content = """print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')[-1]\nprint('Analysis',xa)""", - fr_FR = "Imprime sur la sortie standard la valeur optimale", - en_EN = "Print on standard output the optimal value", - order = "next", + name="AnalysisPrinter", + content="""print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')[-1]\nprint('Analysis',xa)""", + fr_FR="Imprime sur la sortie standard la valeur optimale", + en_EN="Print on standard output the optimal value", + order="next", ) UserPostAnalysisTemplates.store( - name = "AnalysisSaver", - content = """print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')[-1]\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", - fr_FR = "Enregistre la valeur optimale dans un fichier du répertoire '/tmp' nommé 'analysis.txt'", - en_EN = "Save the optimal value in a file of the '/tmp' directory named 'analysis.txt'", - order = "next", + name="AnalysisSaver", + content="""print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')[-1]\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", + fr_FR="Enregistre la valeur optimale dans un fichier du répertoire '/tmp' nommé 'analysis.txt'", + en_EN="Save the optimal value in a file of the '/tmp' directory named 'analysis.txt'", + order="next", ) UserPostAnalysisTemplates.store( - name = "AnalysisPrinterAndSaver", - content = """print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')[-1]\nprint('Analysis',xa)\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", - fr_FR = "Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur optimale", - en_EN = "Print on standard output and, in the same time save in a file of the '/tmp' directory, the optimal value", - order = "next", + name="AnalysisPrinterAndSaver", + content="""print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')[-1]\nprint('Analysis',xa)\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", + fr_FR="Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la valeur optimale", + en_EN="Print on standard output and, in the same time save in a file of the '/tmp' directory, the optimal value", + order="next", ) UserPostAnalysisTemplates.store( - name = "AnalysisSeriePrinter", - content = """print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')\nprint('Analysis',xa)""", - fr_FR = "Imprime sur la sortie standard la série des valeurs optimales", - en_EN = "Print on standard output the optimal value series", - order = "next", + name="AnalysisSeriePrinter", + content="""print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')\nprint('Analysis',xa)""", + fr_FR="Imprime sur la sortie standard la série des valeurs optimales", + en_EN="Print on standard output the optimal value series", + order="next", ) UserPostAnalysisTemplates.store( - name = "AnalysisSerieSaver", - content = """print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", - fr_FR = "Enregistre la série des valeurs optimales dans un fichier du répertoire '/tmp' nommé 'analysis.txt'", - en_EN = "Save the optimal value series in a file of the '/tmp' directory named 'analysis.txt'", - order = "next", + name="AnalysisSerieSaver", + content="""print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", + fr_FR="Enregistre la série des valeurs optimales dans un fichier du répertoire '/tmp' nommé 'analysis.txt'", + en_EN="Save the optimal value series in a file of the '/tmp' directory named 'analysis.txt'", + order="next", ) UserPostAnalysisTemplates.store( - name = "AnalysisSeriePrinterAndSaver", - content = """print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')\nprint('Analysis',xa)\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", - fr_FR = "Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la série des valeurs optimales", - en_EN = "Print on standard output and, in the same time save in a file of the '/tmp' directory, the optimal value series", - order = "next", + name="AnalysisSeriePrinterAndSaver", + content="""print('# Post-analysis')\nimport numpy\nxa=ADD.get('Analysis')\nprint('Analysis',xa)\nf='/tmp/analysis.txt'\nprint('Analysis saved in \"%s\"'%f)\nnumpy.savetxt(f,xa)""", + fr_FR="Imprime sur la sortie standard et, en même temps enregistre dans un fichier du répertoire '/tmp', la série des valeurs optimales", + en_EN="Print on standard output and, in the same time save in a file of the '/tmp' directory, the optimal value series", + order="next", ) # ============================================================================== diff --git a/src/daComposant/daNumerics/Models/Lorenz1963.py b/src/daComposant/daNumerics/Models/Lorenz1963.py new file mode 100644 index 0000000..8c8a774 --- /dev/null +++ b/src/daComposant/daNumerics/Models/Lorenz1963.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2008-2024 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D + +import sys +import unittest +import math +import numpy +from daCore.BasicObjects import DynamicalSimulator + + +# ============================================================================== +class Lorenz1963(DynamicalSimulator): + """ + Three-dimensional parametrized nonlinear ODE system depending on µ=(σ,ρ,β): + + ∂x/∂t = σ (y − x) + ∂y/∂t = ρ x − y − x z + ∂z/∂t = x y − β z + + with t ∈ [0, 40] the time interval, x(t), y(t), z(t) the dependent + variables, and with σ=10, ρ=28, and β=8/3 the commonly used parameter + values. The initial conditions for (x, y, z) at t=0 for the reference + case are (0, 1, 0). + + This is the well known parametrized coupled system of three nonlinear + ordinary differential equations: + Lorenz, E. N. (1963). Deterministic nonperiodic flow. Journal of the + Atmospheric Sciences, 20, 130–141. + doi:10.1175/1520-0469(1963)020<0130:DNF>2.0.CO;2 + """ + + def set_canonical_description(self): + self.set_mu((10.0, 28.0, 8.0 / 3.0)) # µ = (σ, ρ, β) + self.set_integrator("rk4") + self.set_dt(0.01) + self.set_t0(0.0) + self.set_tf(40) + self.set_y0((0.0, 1.0, 0.0)) + self.set_autonomous(True) + return True + + def ODEModel(self, t, Y): + "ODE dY/dt = F(Y,t)" + sigma, rho, beta = self.set_mu() + x, y, z = map(float, Y) + # + rx = sigma * (y - x) + ry = x * rho - y - x * z + rz = x * y - beta * z + # + return numpy.array([rx, ry, rz]) + + +# ============================================================================== +class LocalTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + print("\nAUTODIAGNOSTIC\n==============\n") + print(" " + Lorenz1963().__doc__.strip()) + + def test001(self): + numpy.random.seed(123456789) + ODE = Lorenz1963() # Default parameters + trajectory = ODE.ForecastedPath() + # + print() + self.assertTrue(trajectory.shape[0] == 1 + int(ODE.set_tf() / ODE.set_dt())) + self.assertTrue( + abs( + max( + trajectory[-1] + - numpy.array([16.48799962, 14.01693428, 40.30448848]) + ) + ) + <= 1.0e-8, + msg=" Last value is not equal to the reference one", + ) + print(" Last value is equal to the reference one") + + def tearDown(cls): + print("\n Tests are finished\n") + + +# ============================================================================== +if __name__ == "__main__": + sys.stderr = sys.stdout + unittest.main(verbosity=0) diff --git a/src/daComposant/daNumerics/Models/TwoDimensionalInverseDistanceCS2010.py b/src/daComposant/daNumerics/Models/TwoDimensionalInverseDistanceCS2010.py index 052d3eb..08ef395 100644 --- a/src/daComposant/daNumerics/Models/TwoDimensionalInverseDistanceCS2010.py +++ b/src/daComposant/daNumerics/Models/TwoDimensionalInverseDistanceCS2010.py @@ -20,7 +20,10 @@ # # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D -import sys, unittest, numpy +import sys +import unittest +import numpy + # ============================================================================== class TwoDimensionalInverseDistanceCS2010: @@ -36,19 +39,20 @@ class TwoDimensionalInverseDistanceCS2010: Nonlinear Model Reduction via Discrete Empirical Interpolation, SIAM Journal on Scientific Computing, 32(5), pp. 2737-2764 (2010). """ + def __init__(self, nx: int = 20, ny: int = 20): "Définition du maillage spatial" - self.nx = max(1, nx) - self.ny = max(1, ny) - self.x = numpy.linspace(0.1, 0.9, self.nx, dtype=float) - self.y = numpy.linspace(0.1, 0.9, self.ny, dtype=float) + self.nx = max(1, nx) + self.ny = max(1, ny) + self.x = numpy.linspace(0.1, 0.9, self.nx, dtype=float) + self.y = numpy.linspace(0.1, 0.9, self.ny, dtype=float) - def FieldG(self, mu ): + def FieldG(self, mu): "Fonction simulation pour un paramètre donné" - mu1, mu2 = numpy.ravel( mu ) + mu1, mu2 = numpy.ravel(mu) # - x, y = numpy.meshgrid( self.x, self.y ) - sxymu = 1. / numpy.sqrt( (x - mu1)**2 + (y - mu2)**2 + 0.1**2 ) + x, y = numpy.meshgrid(self.x, self.y) + sxymu = 1.0 / numpy.sqrt((x - mu1) ** 2 + (y - mu2) ** 2 + 0.1**2) # return sxymu @@ -83,18 +87,19 @@ class TwoDimensionalInverseDistanceCS2010: OneRealisation = FieldG + # ============================================================================== class LocalTest(unittest.TestCase): @classmethod def setUpClass(cls): - print('\nAUTODIAGNOSTIC\n==============\n') + print("\nAUTODIAGNOSTIC\n==============\n") print(" " + TwoDimensionalInverseDistanceCS2010().__doc__.strip()) def test001(self): numpy.random.seed(123456789) Equation = TwoDimensionalInverseDistanceCS2010() for mu in Equation.get_sample_of_mu(5, 5): - solution = Equation.OneRealisation( mu ) + solution = Equation.OneRealisation(mu) # Nappe maximale au coin (0,0) self.assertTrue(numpy.max(solution.flat) <= solution[0, 0]) # Nappe minimale au coin [-1,-1] @@ -103,6 +108,7 @@ class LocalTest(unittest.TestCase): def tearDown(cls): print("\n Tests OK\n") + # ============================================================================== if __name__ == "__main__": sys.stderr = sys.stdout diff --git a/src/daComposant/daNumerics/Models/TwoDimensionalRosenbrockFunctionR1960.py b/src/daComposant/daNumerics/Models/TwoDimensionalRosenbrockFunctionR1960.py index 7f7b27a..655f757 100644 --- a/src/daComposant/daNumerics/Models/TwoDimensionalRosenbrockFunctionR1960.py +++ b/src/daComposant/daNumerics/Models/TwoDimensionalRosenbrockFunctionR1960.py @@ -20,7 +20,11 @@ # # Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D -import sys, unittest, math, numpy +import sys +import unittest +import math +import numpy + # ============================================================================== class TwoDimensionalRosenbrockFunctionR1960: @@ -29,33 +33,35 @@ class TwoDimensionalRosenbrockFunctionR1960: f(x,y) = (a - x)² + b (y -x²)² - with (x,y) ∈ [-2,2]x[-1,3]² and usually a=1, b=100. There is a - global minimum at (x,y) = (a,a²) for which f(x,y) = 0. + with (x,y) ∈ [-2,2]x[-1,3]² and a=1, b=100 the commonly used parameter + values. There exists a global minimum at (x,y) = (a,a²) for which + f(x,y) = 0. This is the non-linear non-convex parametric function of the reference: Rosenbrock, H. H., An Automatic Method for Finding the Greatest or Least Value of a Function, The Computer Journal, 3(3), pp.175–184, (1960) """ + def __init__(self, nx: int = 40, ny: int = 40): "Définition du maillage spatial" - self.nx = max(1, nx) - self.ny = max(1, ny) - self.x = numpy.linspace(-2, 2, self.nx, dtype=float) - self.y = numpy.linspace(-1, 3, self.ny, dtype=float) + self.nx = max(1, nx) + self.ny = max(1, ny) + self.x = numpy.linspace(-2, 2, self.nx, dtype=float) + self.y = numpy.linspace(-1, 3, self.ny, dtype=float) - def FieldZ(self, mu ): + def FieldZ(self, mu): "Fonction simulation pour un paramètre donné" - a, b = numpy.ravel( mu ) + a, b = numpy.ravel(mu) # - x, y = numpy.meshgrid( self.x, self.y ) - sxymu = (a - x)**2 + b * (y - x**2)**2 + x, y = numpy.meshgrid(self.x, self.y) + sxymu = (a - x) ** 2 + b * (y - x**2) ** 2 # return sxymu - def FunctionH(self, xy, a = 1, b = 100): + def FunctionH(self, xy, a=1, b=100): "Construit la fonction de Rosenbrock en L2 (Scipy 1.8.1 p.1322)" - xy = numpy.ravel( xy ).reshape((-1, 2)) # Deux colonnes + xy = numpy.ravel(xy).reshape((-1, 2)) # Deux colonnes x = xy[:, 0] y = xy[:, 1] return numpy.array([(a - x), math.sqrt(b) * (y - x**2)]) @@ -91,26 +97,28 @@ class TwoDimensionalRosenbrockFunctionR1960: OneRealisation = FieldZ + # ============================================================================== class LocalTest(unittest.TestCase): @classmethod def setUpClass(cls): - print('\nAUTODIAGNOSTIC\n==============\n') + print("\nAUTODIAGNOSTIC\n==============\n") print(" " + TwoDimensionalRosenbrockFunctionR1960().__doc__.strip()) def test001(self): numpy.random.seed(123456789) Equation = TwoDimensionalRosenbrockFunctionR1960() - optimum = Equation.FunctionH( [1, 1] ) - self.assertTrue( max(optimum.flat) <= 0.) + optimum = Equation.FunctionH([1, 1]) + self.assertTrue(max(optimum.flat) <= 0.0) - optimum = Equation.FunctionH( [0.5, 0.25], a=0.5 ) - self.assertTrue( max(optimum.flat) <= 0.) + optimum = Equation.FunctionH([0.5, 0.25], a=0.5) + self.assertTrue(max(optimum.flat) <= 0.0) def tearDown(cls): print("\n Tests OK\n") + # ============================================================================== if __name__ == "__main__": sys.stderr = sys.stdout diff --git a/src/daEficas/prefs_ADAO.py.in b/src/daEficas/prefs_ADAO.py.in index 1bbcbc5..6b502f5 100644 --- a/src/daEficas/prefs_ADAO.py.in +++ b/src/daEficas/prefs_ADAO.py.in @@ -24,7 +24,7 @@ import os, sys -# print "import des prefs de Adao" +# print ("import des prefs de Adao") # # Configuration de Eficas # ======================= -- 2.39.2