Skip to content

Releases: kotik-coder/PULsE

PULsE v1.98

13 Feb 09:47
Compare
Choose a tag to compare

Added save / load session.

Full Changelog: v1.97...v1.98

PULsE v1.97c

11 Jan 09:55
Compare
Choose a tag to compare

Full Changelog: v1.97b...v1.97c

PULsE v1.97b

09 Jan 05:43
Compare
Choose a tag to compare

Introduced graphic logging, fixed issues with pulse discretisation and improved overall performance.

Full Changelog: v1.97...v1.97b

PULsE v1.97

09 Sep 13:06
Compare
Choose a tag to compare

PULsE v1.97 - Short List of Changes

This release features a new multi-sinusoidal baseline correction feature, generalised optimisers, expanded filtering capabilities and the 2-T model.

Expanded the sinusoidal baseline capabilities to multiple waves:

  • Added FFTTransformer.java
  • Added Window (FFT)
  • Added PeriodicTransform for phase shift
  • Added ZScore
  • Added Harmonic
  • Expanded: SinusoidalBaseline

Expanded the running average estimator by including new classes:

  • OptimisablePolyline allows fine tuning of individual coordinates of a RunningAverage
  • Added: OptimisedRunningAverage
  • Added: Randomiser
  • Added: Filter (super-class)
  • Added: PolylineOptimiser
  • Added: AssignmentListener

Added 2T model

  • Added Gases (Nitrogen, Helium)
  • Added ImplicitTwoTemperatureSolver
  • Added TwoTemperatureModel
  • Added TwoTemperatureProperties

Expanded optimisation by making it less dependent on the specific type of the model:

  • Added GeneralTask as a superclass for all optimisation tasks
  • Added RunningAverage (moved from ExperimentalData)
  • Added Input and Response super-interfaces
  • Added SimpleOptimisationTask operating with one Optimisable and one Input with a default Levenberg-Marquardt optimiser
  • Added SimpleResponse
  • Added DiscreteInput as a superclass for ExperimentalData and NumericPulseData
  • Added Optimisable

Tidied up:

  • LinearBaseline (slope property moved to superclass)
  • HistogramFrame
  • ResultTableModel
  • AdjustableBaseline (slope added from LinearBaseline)
  • Move half-time calculation to a special class in pulse.math.filters (added)
  • DiathermicMedium
  • DataLoader
  • TaskPopupMenu
  • AbsoluteDeviations
  • ClassicalProblem
  • HeatingCurve
  • ImplicitLinearisedSolver
  • ThermoOpticalProperties
  • Launcher
  • LinearOptimiser

Adapted:

  • TaskTableModel
  • NumericPulse
  • ResidualStatistic
  • SwarmState
  • Problem (baseline handling, property assignment)
  • Buffer (adapted to abstract optimisation task)
  • ImplicitScheme (added time step index in method signature)
  • CalculationTable -> plotExecutor
  • Gradinet calculation and resolution in GradientBasedOptimiser
  • Chart
  • KSTest
  • IterativeState
  • Expanded Range filtering capabilities
  • Pulse
  • DataLogEntry
  • CorrelationLogEntry to show multiple wave parameters
  • Adapted CorrelationBuffer
  • SearchTask (moved some methods to superclass)
  • DifferenceScheme (pulse handling)
  • NonlinearProblem
  • WolfeOptimiser
  • LMOptimiser (more robust to errors)
  • AbsorptionModel
  • Calculation (now formally a subclass of Reponse)
  • ActiveFlags (includes loadable states, removed activeParameters())
  • Status (added troubleshoot())
  • ClassicalProblem2D
  • TaskManager
  • CompositePathOptimiser
  • LinearOptimiser
  • ExperimentalData
  • ChartToolbar
  • Expanded SolverException
  • Baseline
  • ... and others

Fixed:

  • RegularisedLeastSquares now correctly estimates the regularised statistic
  • PenetrationProblem not initialising custom AbsorptionModel
  • Exception handling by GradientGuidedPath
  • Missing copy method in BeerLambertAbsorption and Insulator
  • Result handling by ResultsTable
  • ParameterVector now explicitly deals with Parameters
  • Added ParameterIdentifier
  • Added Parameter
  • Property updates in ProblemStatementFrame
  • NetzschCSVReader: resetting marks and finding pulse width
  • Use relative error rather than absolute error in FixedPointIterations
  • Insulator (Reflectance)

Recovered

  • RangePenalisedLeastSquares

Removed

  • InvLenTransform, InvLenSqTransform

Full Changelog: v1.95...v1.97

PULsE v1.95

08 Jun 07:56
Compare
Choose a tag to compare

Full Changelog: v1.94...v1.95

PULsE v1.94

25 Apr 06:54
Compare
Choose a tag to compare

Improvements concern fail-safe operation of PULsE, specifically, for the coupled conductive-radiative problems, a more compehensive logging. In addition, some functional features have been added detailed in the last commits.

Full Changelog: v1.93...v1.94

PULsE v1.93F : fixes

15 Dec 20:11
Compare
Choose a tag to compare

PULsE v1.93

14 Dec 22:02
Compare
Choose a tag to compare

Changes in this release

  • Minor changes including formatting and import re-arrangement

Improving logic of baseline classes and of the parameter-setting

  • Created a separate abstract class for vertically-adjustable baselines. The FlatBaseline and LinearBaseline now both inherit from this class. The reason to do this was a logical error when the LinearBaseline extended a FlatBaseline and therefore was a FlatBaseline (although it isn't).
  • Included a fitToNegative() method in the Baseline class accepting AbstractData arguments. This is specifically needed to calculate the baseline of e.g. pulse diode data, which can't be treated neither as a HeatingCurve nor as an ExperimentalData.
  • Made an override of the listedKeywords() method replacing listedTypes()
  • Removed the constant values from the optimisationVector() method and replaced explicitly setting bounds in this method by a call to the
    overriden set(int, double, NumericPropertyKeyword) method from ParameterVector, which takes the default bounds for the keyword from the default loaded set of parameters.
  • Introduced a utility boundsFrom() method to the Segment to extract the bounds from a default instance of the NumericProperty corresponding to a given NumericPropertyKeyword

Improvements to handling of experimental datasets

  • ExperimentalData now stores a value of the half-time, which is used for accurate calculation of the Range bounds. The half-time is updated
    using a DataLsistener addead to each new ExperimentalData object.
  • The Range objects will now perform checks when asked to set a new minimum or maximum, by verifying that the new value is contained within a dynamically calculated range interval, which is based on the half-time value of the main experimental dataset.
  • Removed pop-up windows appearing (uncontrollably) when the half-time calculation failed, the output stream is now re-directed to System.err.
  • Replaced cubic normal splines in InterpolatorDataset with Akima splines. This is not ideal, but at least will yield better results to datasets with rapidly varying second derivatives. In future, this needs to be replaced by a procedure producing uniformly spaced data to which LOESS interpolation is applied.
  • Changed listedTypes() in Metadata to listedKeywords(), which reduces the complexity of the code.

Improvements in exporting

  • Fixed a bug in the Exporter when the files were saved in a new format but with the default extension (e.g. html as csv). This was fixed
    by manually replacing the extension substring with the selected export extension.
  • Modified the ResultTableExporter to correctly print the properties in a .csv table (both value and error, which are delimited by +/-) using the String.format() functionality. Unfortunately, it was not possible to align the values in the columns directly below the header string, but, perhaps, in a future release that could be fixed.
  • Fixed the directoryQuery() method in ExportDialog, which previously incorrectly selected a file in the current directory, and not that directory itself. This had led to duplication of a directory (e.g. if 'Documents' was selected, this would created a 'Documents' folder inside, and the export path would be 'Document/Documents/.../'.

Improvements in XML handling

  • The xml format was changed in such a way that xml elements declaring a default-search-variable attribute will be marked as optimisable, even if the value of that variable is false. Therefore, there are now two distinct states: isDefaultSearchVariable() and isOptimisable(). Any element that should be allowed to be optimisable should have a default-search-variable attribute. Those elements that declare this property as true will have their search flag enabled by default.

Fixed property transforms and problem statements

  • Introduced a new StickTransform class, which prevents properties from taking values outside a given region by reverting their values back to the boundary (so that the property 'sticks' to the boundary). This has proven to yield better (in terms of possible optimiser bias) results compared to the previously used ATANH transform.
  • Changed the ATANH transform to ABS in NonlinearProblem.
  • Converted listedTypes() to listedKeywords()
  • Changed default baseline for all problem statements to LinearBaseline (previously - FlatBaseline). Fixed wrong baseline setting in the copy constructor when the listeners were not notified of this, which caused a loss of search parameters (BASELINE_INTERCEPT and BASELINE_SLOPE could have gone missing).
  • Removed calls to calculated half-time in ThermalProperties, replacing them with a getter instead.

Fixed laser/light pulse handling

  • NumericPulse now calculates a baseline using the pulse diode data prior to the pulse. The baseline is then subtracted from the pulse diode data. Previously, no baseline was calculated, which led to erroneous calculations.
  • Interpolation for numeric pulses now changed to Akima since second derivative is often rapidly varying.
  • Added a new PropertyHolderListener for the freshly created Pulse objects which updates the ExperimentaData's Range lower bound when the pulse width is updated.
  • Added a check to setPulseWidth(), which determines whether the new pulse width is actually different from the previously set. In the latter case, this invokes the listeners when finished. In addition, another check prevents from setting a pulse width greater than two half-times.
  • Converted listedTypes() to listedKeywords()

Re-arranged handling of Flags and NumericProperties

  • Introduced the optimisable boolean in NumericProperty. This boolean indicates whether this property can be optimised.
  • Flag.allFlags() now returns a list of only those flags which correspond to numeric properties with isOptimisable() = true
  • Removed Flag.allProblemIndependentFlags() due to being obsolete
  • Intoduced dimensionDelta in NumericProperty to account for a possible change of format of the test temperature (for example, conversion between K to deg. C). This dimensionDelta is directly added to the value returned by valueInCurrentUnts().
  • Fixed errorInCurrentUnits() throwing typecast exceptions due to incorrect casting to double. Now this works with any type of Numbers including ints.
  • Removed valueOutput() and errorOutput() (formatting is now a prerogative of a separate NumericPropertyFormatter)
  • Removed formatting methods from NumericProperties.
  • Formatting is now handled by NumericPropertyFormatter, which is a type of AbstractFormatter that accepts NumericProperty objects. There are three formats available to format any property: a standard decimal format with fixed number of digits after the decimal point, an integer format for properties with integer values, and a newly introduced ScientificFormat, which renders values using an html output, e.g.: 5.10 × 105. This is then converted to a scientific notation. Works with JTables.

Optimiser update

  • Adds a MAX_FAILED_ATTEMPTS field, which represents acceptable number of retries when the optimiser refuses to accept the uphill step and tries to re-configure itself to arrive at a downhill step. Previously this was only possible for the LMOptimiser, however, in the new logic, even the Hessian-based optimisers can now do this -- the re-configuration is achieved by resetting the Hessian matrix to identity. In future releases, this can probably be merged with LMOptimiser to reduce duplications.
  • The GradientBasedOptimiser now hosts a dx() method for calculating the gradient step, callable by all subclasses. Previously, the same code was inserted in different optimisers. In addition, it failed miserably for properties which could reach 0.0, since, in that case, the gradient
    step was calculated as a factor of the property and the GRADIENT_RESOLUTION (either low- or high, depending on whether the property is discrete). This caveat has been fixed by replacing the 0.0 value with the maximal property value.
  • The IterativeState, a superclass for all paths, now stores the current value of the cost function and the set of parameters corresponding to that cost function value. This is needed in order to be able to revert back to a 'safe' set of parameters.
  • The maximum number of failed attempts for the LMOptimiser was reduced to 4. At each successful attempt, the current state is stored in the path.
  • All flags were removed from being listed in the PathOptimiser. The override for the data() method was removed.

Updated Calculation and SearchTask

  • Modified Calculation.setStatus() to return false in cases when a change of status is not appropriate (for example, when the Calculation is being forced to run, although it is not ready). Contrary to the previous implementation, the method does NOT return false when the status being set is the same as the one already assigned. This functionality has been transferred to SearchTask.setStatus() instead; only there this is needed to avoid triggering the listeners without actually updating anything.
  • In SearchTask, a field has been added to store the global-best iterative state. At the end of execution, it is checked whether the converged
    state is actually worse than the global-best -- if so, the global-best set of parameters are taken instead, and the task is re-calculated.

TaskManager -- concurrency of tasks and listeners

  • TaskManager now has a TaskRepositoryListener, which triggers half-time calculation each time an ExperimentalData is generated.
  • The execute sequence now starts from checking the status of all tasks before queuing them. If the tasks reject the status update to QUEUED, th...
Read more

PULSE v1.92

29 Nov 15:54
Compare
Choose a tag to compare

Changes in this release

Changes to XML format:

  • Added HEAT_LOSS_COMBINED and COMBINED_ABSORPTIVITY
  • Added <excludes> tag for excluding superfluous optimisation flags
  • Increased Biot maximal value to 100.0
  • Changed autoAdjustable boolean to visibleByDefault for easier interpretation
  • Changed default gradient resolution to 1E-6 (optimiser)

Changes to 2D Problem Statement:

  • Added support for HEAT_LOSS_COMBINED
  • Biot number: transform changed from ATANH to ABS
    (atanh caused problems during optimisation resulting in NaNs)
  • Problem.java now has hideDetails set to true

Changes to property accessors and Penetration problem statement:

  • Added support for COMBINED_ABSORPTIVITY in PenetrationProblem.java
  • Absorptivity: Replaced ATANH transform with ABS
    (atanh caused problems during optimisation resulting in NaNs)
  • Added firePropertyChanged call after each valid change to an InstanceDescriptor
    or DiscreteSelector
  • Added missing call to super-constructor from Insulator.java

Changes to handling Flags

  • Added support to exclude lists that can be used to arrange the optimisation vector correctly
  • Fixed wrong filtering of flags, which should not depend on property
    visibility
  • Introduced keywords for combined heat losses and absorptivities

Optimiser changes

  • LMOptimiser.java: Fixed wrongly accepting a set of new parameters
    when the cost changes are minimal

General changes:

  • Formatting
  • Added more details to SolverException when being thrown
  • Introduced support for the new XML format in the XMLConverter.java
  • Fixed wrong display criterion for numericData()
  • Correlation test: added an exclusion rule for the pair MAXTEMP-- HEAT_LOSS_COMBINED
  • Added support for non-string objects in attemptUpdate()

UI Changes:

  • Removed wrong foreground in KeywordListRenderer
  • Added ActiveFlagsListModel (previously ResultListModel) -> can now
    be used in both ResultFormatDialog and SearchOptionsFrame
  • Prevents Flags from being displayed in PropertyHolderTables.
    The list of checkboxes is now removed from SearchOptionsFrame
  • Optimiser Flag selection now occurs through the use of a DoubleListPanel
  • Changed PopupMenuListener to PopupMenuAdapter

PULsE v1.91FM_02

16 Jun 18:26
Compare
Choose a tag to compare

Improved Auto-Range feature for BFGS optimizer. Note this is not compatible with LM Optimizer.