Releases: kotik-coder/PULsE
PULsE v1.98
Added save / load session.
Full Changelog: v1.97...v1.98
PULsE v1.97c
Full Changelog: v1.97b...v1.97c
PULsE v1.97b
Introduced graphic logging, fixed issues with pulse discretisation and improved overall performance.
Full Changelog: v1.97...v1.97b
PULsE v1.97
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
Full Changelog: v1.94...v1.95
PULsE v1.94
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
Full Changelog: v1.93...v1.93F
PULsE v1.93
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
andLinearBaseline
now both inherit from this class. The reason to do this was a logical error when theLinearBaseline
extended aFlatBaseline
and therefore was aFlatBaseline
(although it isn't). - Included a
fitToNegative()
method in theBaseline
class acceptingAbstractData
arguments. This is specifically needed to calculate the baseline of e.g. pulse diode data, which can't be treated neither as aHeatingCurve
nor as anExperimentalData
. - Made an override of the
listedKeywords()
method replacinglistedTypes()
- Removed the constant values from the
optimisationVector()
method and replaced explicitly setting bounds in this method by a call to the
overridenset(int, double, NumericPropertyKeyword)
method fromParameterVector
, which takes the default bounds for the keyword from the default loaded set of parameters. - Introduced a utility
boundsFrom()
method to theSegment
to extract the bounds from a default instance of theNumericProperty
corresponding to a givenNumericPropertyKeyword
Improvements to handling of experimental datasets
ExperimentalData
now stores a value of the half-time, which is used for accurate calculation of theRange
bounds. The half-time is updated
using aDataLsistener
addead to each newExperimentalData
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()
inMetadata
tolistedKeywords()
, 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
ascsv
). 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 theString.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 inExportDialog
, 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 thatxml
elements declaring adefault-search-variable
attribute will be marked asoptimisable
, even if the value of that variable isfalse
. Therefore, there are now two distinct states:isDefaultSearchVariable()
andisOptimisable()
. Any element that should be allowed to be optimisable should have adefault-search-variable
attribute. Those elements that declare this property astrue
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 usedATANH
transform. - Changed the
ATANH
transform toABS
inNonlinearProblem
. - Converted
listedTypes()
tolistedKeywords()
- 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
andBASELINE_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 createdPulse
objects which updates theExperimentaData
'sRange
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()
tolistedKeywords()
Re-arranged handling of Flag
s and NumericPropert
ies
- Introduced the
optimisable
boolean inNumericProperty
. 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
inNumericProperty
to account for a possible change of format of the test temperature (for example, conversion between K to deg. C). ThisdimensionDelta
is directly added to the value returned byvalueInCurrentUnts()
. - Fixed
errorInCurrentUnits()
throwing typecast exceptions due to incorrect casting todouble
. Now this works with any type ofNumber
s includingint
s. - Removed
valueOutput()
anderrorOutput()
(formatting is now a prerogative of a separateNumericPropertyFormatter
) - Removed formatting methods from
NumericProperties
. - Formatting is now handled by
NumericPropertyFormatter
, which is a type ofAbstractFormatter
that acceptsNumericProperty
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 introducedScientificFormat
, which renders values using anhtml
output, e.g.: 5.10 × 105. This is then converted to a scientific notation. Works withJTable
s.
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 theLMOptimiser
, 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 withLMOptimiser
to reduce duplications. - The
GradientBasedOptimiser
now hosts adx()
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 reach0.0
, since, in that case, the gradient
step was calculated as a factor of the property and theGRADIENT_RESOLUTION
(either low- or high, depending on whether the property is discrete). This caveat has been fixed by replacing the0.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 thedata()
method was removed.
Updated Calculation
and SearchTask
- Modified
Calculation.setStatus()
to returnfalse
in cases when a change of status is not appropriate (for example, when theCalculation
is being forced to run, although it is not ready). Contrary to the previous implementation, the method does NOT returnfalse
when the status being set is the same as the one already assigned. This functionality has been transferred toSearchTask.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 aTaskRepositoryListener
, which triggers half-time calculation each time anExperimentalData
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...
PULSE v1.92
Changes in this release
Changes to XML format:
- Added
HEAT_LOSS_COMBINED
andCOMBINED_ABSORPTIVITY
- Added
<excludes>
tag for excluding superfluous optimisation flags - Increased Biot maximal value to 100.0
- Changed
autoAdjustable
boolean tovisibleByDefault
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
toABS
(atanh caused problems during optimisation resulting in NaNs) Problem.java
now hashideDetails
set totrue
Changes to property accessors and Penetration problem statement:
- Added support for
COMBINED_ABSORPTIVITY
inPenetrationProblem.java
- Absorptivity: Replaced
ATANH
transform withABS
(atanh caused problems during optimisation resulting in NaNs) - Added
firePropertyChanged
call after each valid change to anInstanceDescriptor
orDiscreteSelector
- 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
(previouslyResultListModel
) -> can now
be used in bothResultFormatDialog
andSearchOptionsFrame
- Prevents
Flag
s from being displayed inPropertyHolderTable
s.
The list of checkboxes is now removed fromSearchOptionsFrame
- Optimiser Flag selection now occurs through the use of a
DoubleListPanel
- Changed
PopupMenuListener
toPopupMenuAdapter
PULsE v1.91FM_02
Improved Auto-Range feature for BFGS optimizer. Note this is not compatible with LM Optimizer.