====== What is new in stable version 8.7.0 ====== This release of the Dinamica EGO software introduces a range of improvements and addresses several bugs, enhancing performance, accuracy, user experience, and overall stability: ---- (Compared to stable version [[what_is_new_8_6_0|8.6.0]]) * **Fix a problem with GetTableFromKeys where unordered tables would generate incomplete results.** * Added test case to prevent regressions in the operations manipulating tables. * Updated version of the Microsoft Visual Studio redistributable installed with Dinamica. * Updated version to 8.7.0. ---- (Compared to stable version [[what_is_new_8_5_0|8.5.0]]) ==== Improvements ==== === Core Performance Enhancements === * **Python Performance**: The `DisableYieldCondition` feature has been added to tasks and enabled for Python. Additionally, Python's access to table merge operations now occurs **before the Global Interpreter Lock (GIL) is acquired**, which is designed to improve concurrency and performance for Python-related table operations. * **Profiling Granularity and Presentation**: Profiling functions have been **updated to collect CPU times from model execution in nanoseconds**, offering much finer detail than previous millisecond measurements. For user readability, these times are now **presented in seconds and microseconds**, reducing visual clutter. * **Region Information Retrieval**: A new functor, `GetAllRegionsInfoFunctor`, has been defined to allow for the **simultaneous retrieval of information about the extents of all regions**. * **Geographic Grid Area Calculation**: The system now implements **area calculation on geographic grids using an authalic sphere**, ensuring **equal-area accuracy** for geographic computations. * **Script Writer Capabilities**: An option has been added to the script writer to **include information about ports connected to functors located in scripts other than the current one**, improving the understanding of inter-script dependencies. * **Table Description Enhancements**: `TableDescription::getColumnIndex` now returns an `optional` instead of an integer for found/not-found `std::size_t` indices, leading to safer and clearer code. * **Class Documentation**: The documentation for `Data` and `DerivedData` classes has been improved to be clearer about their copy semantics. * **Functor Renaming**: The `CreateTable` functor has been renamed to `CreateEmptyTable` to more clearly indicate that its output table is empty. === User Interface (UI) and User Experience (UX) Enhancements === * **Error Diagnosis**: The system can now **print an error stack trace** to help diagnose problems if the LogSpool stops working, providing valuable information for troubleshooting. * **Loading Indicator**: When a table is loading, the application now **displays a rotating donut icon** to provide a better visual indication that it is busy, improving user feedback during potentially long operations. * **Explorer Panel Changes**: The Explorer's behavior has been adjusted to **present table titles even when execution times are not being displayed**, enhancing data visibility. The width of the attribute column has also been changed to be less intrusive. * **LazyPresentationPanel Icons**: An option has been added to **include icons in the LazyPresentationPanel**, allowing for more visual customization and information density. * **Clipboard Copying**: The system now allows **copying textual content to the clipboard even when the content contains null characters**, which fixes a regression that prevented multi-line log messages from being copied. ==== Bug Fixes ==== * **Incorrect Key Column Detection**: A problem where key columns were detected incorrectly has been fixed. * **Concurrent Access Issues**: A mutex has been added to prevent **concurrent access to `getenv/setenv/putenv` functions**, and proper initialization and copying of `TaskMutex` have been ensured. * **SubTable Sharing Prevention**: `SubTableFunctor subTable` is now temporarily flagged as writable to prevent it from being shared incorrectly. * **Python Expression Calculation**: The `StringUtils::trim` function is now used instead of `boost copy` for the string view in `CalculatePythonExpression`, resolving a related issue. * **Dinamica::Variant Usage**: The usage of `Dinamica::Variant` in compiled expressions has been reverted until it is stable, preventing issues where the key vector was copied as doubles. * **Table Memory Access**: Memory access problems related to Tables have been fixed, and `GetTableFromKey` has been moved to the Table class and corrected. * **Parallel Script Crashing Bug**: A temporary fix has been implemented for a crashing bug that could occur on some heavily parallel scripts. * **Submodel Expansion and Parallel Execution Issues**: * A bug where automatic submodel expansion, combined with parallel loop step execution, could lead to incorrect reconnections due to copying loop contents, has been resolved by retrieving functors using their parent ID instead of relying on source ID equivalence. * A potential issue caused by missing synchronization when a sub-script was copied and reconnected to the main script during parallel loop step execution has also been fixed. * **Discarded Updates with Disabled Script Optimization**: * A bug that caused **updates to the TableManager to be silently discarded** when script optimization was disabled has been fixed. * Similarly, a bug that caused **updates to the RegionManager to be silently discarded** when script optimization was disabled has also been addressed. * **Profiling Bottleneck Reporting**: While initially both Table Manager and Region Manager were removed from the list of functors that could be reported as bottlenecks, the **removal of the Region Manager was later reverted**, meaning it can still be reported as a bottleneck for profiling purposes. (Generated using Google NotebookLM)