Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit ac55016

Browse filesBrowse files
committed
Major Changes and Fixes
#LinearAnisotropicPF - Changed reference from ParticipatingMedium to ThermoOpticalProperties - function(...) : replaced calculation with cosineTheta(i,k) call #CurveEventType - Added CALCULATION_FINISHED event type #DataEvent - Replaced reference to ExperimentalData with a more general reference to AbstractData #NetzschPulseCSVReader - Added locale support #SampleName - A default sample name of null is used, in order to avoid having too many 'Nameless' calculations #TridiagonalMatrixAlgorithm - Instead of holding a reference to the Grid object, the fields tau, N and h are now added - As the instance of this class is created just before the calculation starts, it does not need to reference Grid #ResultTableModel - Better handling of average results vs individual results - Average result now ignored when checking for previously calculated results of a task. This was done because an average result is not assigned to a task, therefore, it returns null when searching for a SearchTask ancestor. This led to a NullPointerException previously, but now has been fixed. #ProblemToolbar - Replaced unnecessary SingleThreadExecturo with a direct call to the plot (...) method #DataLoader - Added missing .incrementProgress() call when loading pulse data #Problem - Removed unnecessary check c.isIncomplete() for ExperimentalData when applying baseline- - Changed availableSolutions() to accomodate for possible multiple application of a single solver - Improved confusing assignments in the optimisationVector(...) method - Fixed error: assign(...) -> changed .get(...) to inverseTransform(...) - Consequently, made sure that this latter value is referenced by the setter methods - Removed shortName(...) method - Removed conditional statement prior to applying baseline in setBaseline(....) #Discretisation - Switched to ThermoOpticalProperties reference #HeatingCurve - Added lastCalculation(...) array to store last successful calculation - Added copyToLastCalculation() - apply(Baseline) now only works for a positive size of the time sequence #ADILinearisedSolver - Added an overriden clearArrays() method for array init purposes - Removed array initialisation from prepare(...) - prepare() now publicly overrides superclass method #ImplicitScheme - Removed unnecessary final int m argument from several methods #MixedLinearisedSolver - Changed scheme to accomodate the additional zeta parameter for rear-side parasitic heating - Added an overriding pulse(...) method - Changed firstBeta(...) #ImplicitLinearisedSolver - Removed unnecessary call to super.pulse(...) #General changes: - Added zeta to 1D Classical, Diathermic and ParticipatingMedium problems. Zeta serves to simulate a possible rear-surface heat source, either due to beam deflection or circumferential conduction #DiathermicMedium - Bounds in optimisationVector(...) for the DIATHERMIC_COEFFICIENT have been changed from arbitrary valueto those initially set in the xml document - Removed constraint on the diathermic coefficient for curves having pre-loaded property tables #DiscreteOrdinatesMethod - Replaced references to Problem with ThermoOpticalProperties where possible #RadiativeTransferCoupling - Added a safety check to init(...) to avoid potential handling of unsupported problems - Changed signature of newRTE method #ExplicitCoupledSolver - Added an overriding timeStep(...) method, which redirects to explicitSolution(...) - Changed finaliseStep() overriding method. If the fluxes are auto-updated, computes the solution to the RTE. After that, stores the fluxes. - Added autoUpdatesFluxes capability and the zeta factor - Removed unnecessary RTE calculation before main sequence started - Removed pls accessor, which is defined in the superclass. Instead, replaced with a getCurrentPulse() method #Chart - Removed unnecessary call in the conditional statement of a for loop to .isIncomplete() #GradientGuidedOptimisation - Replaced the body of the catch block in configure(...) by a call to notifyFailedStatus() in the SearchTask #ThermoOpticalProperties - Made this class implement the Optimisable interface and moved all property assignments from ParticipatingMedium to this class #Pulse - Fixed incorrect range updating after pulse changes when the lower range would be shifted to a lower value automatically although a higher value was set #Metadata - Added call to setPulseWidth after pulse data loaded #OneDimensionalScheme - Moved array initialisation to clearArrays() removing them from prepare() #LoaderButton - Added OutOfRangeException checks if thermal property table does not cover a wide enough temperature range #SearchTask - Removed unnecessary catch clause in assign - Removed wrong logic in relation to maxIterations assignment and the inner iteration cycle - Removed inefficient checks for IN_PROGRESS calculations within the inner cycle - Added distinction between AWAITING_TERMINATION and TERMINATED statuses #DifferenceScheme - Added pls field as a generic place holder for the current pulse value - Added call to clearArrays() from inside the prepare(...) method - Removed maxTemp/apparentMaximum scaling to enable Cp calculation in future - Removed adjustment cycle from runTimeSequence. Prevented number of points from being adjusted - Added missing prepareStep() in the timeSegment() method - Added the clearArrays() method - Somewhat more logical structure of the runTimeSequence method #ResultTable - Added a more informative content to the describe() method so that it actually describes the sample #MixedCoupledSolver - Replaced private prepare() with overriden public prepare() - Added rear-surface heating to BCs - removed unnecessary arguments from evalRightBoundary #AbsorptionModel - Error fixed: Remvoed premature setParameterBounds() call, which overrides all bounds in the vector #BlockMatrixAlgorithm - Fixed problem with grid density not being assigned #RectangularPulse - Added a required number of points threshold of 4 #ImplicitTranslucentSolver - Removed superfluous fields - Replaced pls with reference to getCurrentPulse() - Removed unnecessary timeStep() overriding - Removed redundant parameter arguments #ResultTableExporter - Improved output format of the CSV summary tables, adding version, date, and column identifiers - Fixed an error with number of columns changing - Changed the plus-minus delimiter to ; #ExponentiallyModifiedGaussian #TrapezoidalPulse - Added required number of points (10) - Remove redundant init() override #DiscretePulse2D - A new private init(...) method has been introduced. - A new evalPulseSpot() method is introduced, which caclculates a non-zero pulse spot in multiples of the grid radial step and automatically adjusts the grid to allow a large enough step size - A listener has now been added to the properties of the problem under study, which triggers recalculation of the radial spot size #DiscretePulse - Added WIDTH_TOLERANCE_FACTOR, which determines the minimal allowed pulse width for pulse corrections - Added listener to Grid changes, requesting to re-init the DiscretePulse - Added the init() method - Pulse normalisation (area calculation) now done from within DiscretePulse - recalculate(...) now checks whether the nominal width is feasible. Otherwise adjusts the pulse shape and width to prevent calculations from slowing down dramatically - Upon setting the discreteWidth, the grid is re-adjusted to accomodate these changes #CoupledImplicitScheme - Separated nonlinear BC treatment from the main logic #ImplicitNonlinearSolver #implicitCoupledSolver #ExplicitCoupledSolver - Replaced private prepare(...) method with a public overriden prepare(...) with a Problem argument #ClassicalProblem2D - Fixed optimisationVector #TaskManager - Added support for awaiting termination / terminated statuses - generateTask() now triggers DATA_LOADED events after the experimental profiles have been loaded and before they are transferred to tasks - describe() became slightly more informative #ParticipatingMedium - Bulk of optimisationVector() and assign() moved to ThermoOpticalProperties #ImplicitDiathermicSolver - Fixed possible error in BC equations - Added the rear-surface heat source - private prepare() to public prepare() #InstanceCellEditor - Added check for NullPointerException in case when a change is not possible (e.g. setting a NumericPulse when no such data is available) #NetzschCSVReader - Better handling of locale-specific delimiters - Added guessLocaleAndFormat() method - Delimiters can now be changed multiple times during reading the same document #AbstractData - Removed redundant isIncomplete() method - Added isFull() helper method (note the usage is different from isIncomplete) #NumericPulse - Added required number of calculation points, equal to 20. - init(...) has been simplified by splitting it up in smaller chunks of code - pulse width is now unambigously defined via the doInterpolation(...) method where it is set to the last element of the scaled time sequence (dimensionless) - As a consequence, adjustedPulseWidth field is no longer needed and has been removed #NumericPulseData - Removed redundant scale() #CompositePathOptimiser - Removed redundant checks for malformed candidate parameters #Grid2D - adjustTo() -> adjustStepSize() - replaced for(...) loop with a recursive call to adjustStepSize - after step size changed, calls adjustTimeStep #Grid - adjustTo() -> adjustTimeStep() - Exploits required number of points, which differs depending on pulse shape. Checks if the nominal pulse width is greater than the resolved width. Adjusts time factor #Status - Added AWAITING_TERMINATION and TERMINATED #Added classes: - CornetteSchanksPF represents a new type of a phase function selectable for PaticipatingMedium calculations - ImplicitCoupledSolverNL, ExplicitCoupledSolverNL and MixedCoupledSolverNL, which extends over MixedCoupledSolver and adds functionality specifically to deal with the nonlinear BC terms #Classes removed: - LayeredGrid2D - Partition - CoreShellProblem (no longer considered necessary after introducing zeta) - ADILayeredSolver Minor changes
1 parent 64680d7 commit ac55016
Copy full SHA for ac55016

File tree

Expand file treeCollapse file tree

106 files changed

+1689
-1587
lines changed
Filter options

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner
Expand file treeCollapse file tree

106 files changed

+1689
-1587
lines changed

‎pom.xml

Copy file name to clipboardExpand all lines: pom.xml
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<groupId>kotik-coder</groupId>
55
<artifactId>PULsE</artifactId>
6-
<version>1.94</version>
6+
<version>1.94F</version>
77
<name>PULsE</name>
88
<description>Processing Unit for Laser flash Experiments</description>
99
<developers>

‎src/main/java/pulse/AbstractData.java

Copy file name to clipboardExpand all lines: src/main/java/pulse/AbstractData.java
+10-18Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@
88
import static pulse.properties.NumericPropertyKeyword.NUMPOINTS;
99

1010
import java.util.ArrayList;
11-
import java.util.Arrays;
1211
import java.util.List;
1312
import java.util.Set;
1413

1514
import pulse.properties.NumericProperty;
1615
import pulse.properties.NumericPropertyKeyword;
17-
import pulse.properties.Property;
1816
import pulse.util.PropertyHolder;
1917

2018
/**
@@ -105,7 +103,7 @@ public void clear() {
105103
* @return a {@code NumericProperty} derived from
106104
* {@code NumericPropertyKeyword.NUMPOINTS} with the value of {@code count}
107105
*/
108-
public NumericProperty getNumPoints() {
106+
public final NumericProperty getNumPoints() {
109107
return derive(NUMPOINTS, count);
110108
}
111109

@@ -117,7 +115,7 @@ public NumericProperty getNumPoints() {
117115
*
118116
* @param c
119117
*/
120-
public void setNumPoints(NumericProperty c) {
118+
public final void setNumPoints(NumericProperty c) {
121119
requireType(c, NUMPOINTS);
122120
this.count = (int) c.getValue();
123121
firePropertyChanged(this, c);
@@ -168,7 +166,7 @@ public void addPoint(double time, double sgn) {
168166
this.signal.add(sgn);
169167
}
170168

171-
protected void incrementCount() {
169+
protected final void incrementCount() {
172170
count++;
173171
}
174172

@@ -179,7 +177,7 @@ protected void incrementCount() {
179177
* @param index the index
180178
* @param t the new time value at this index
181179
*/
182-
public void setTimeAt(int index, double t) {
180+
public final void setTimeAt(int index, double t) {
183181
time.set(index, t);
184182
}
185183

@@ -190,7 +188,7 @@ public void setTimeAt(int index, double t) {
190188
* @param index the index
191189
* @param t the new signal value at this index
192190
*/
193-
public void setSignalAt(int index, double t) {
191+
public final void setSignalAt(int index, double t) {
194192
signal.set(index, t);
195193
}
196194

@@ -200,20 +198,10 @@ public void setSignalAt(int index, double t) {
200198
* @return the maximum signal value
201199
* @see java.util.Collections.max
202200
*/
203-
public double apparentMaximum() {
201+
public final double apparentMaximum() {
204202
return max(signal);
205203
}
206204

207-
/**
208-
* Checks if the time list is incomplete.
209-
*
210-
* @return {@code false} if the list with time values has less elements than
211-
* initially declared, {@code true} otherwise.
212-
*/
213-
public boolean isIncomplete() {
214-
return time.size() < count;
215-
}
216-
217205
@Override
218206
public String toString() {
219207
return name != null ? name : getClass().getSimpleName() + " (" + getNumPoints() + ")";
@@ -270,6 +258,10 @@ public void remove(int i) {
270258
public boolean ignoreSiblings() {
271259
return true;
272260
}
261+
262+
public boolean isFull() {
263+
return actualNumPoints() >= count;
264+
}
273265

274266
public List<Double> getTimeSequence() {
275267
return time;

‎src/main/java/pulse/HeatingCurve.java

Copy file name to clipboardExpand all lines: src/main/java/pulse/HeatingCurve.java
+34-22Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import pulse.input.listeners.CurveEvent;
2323
import pulse.properties.NumericProperty;
2424
import pulse.properties.NumericPropertyKeyword;
25-
import pulse.properties.Property;
2625

2726
/**
2827
* The {@code HeatingCurve} represents a time-temperature profile (a
@@ -42,10 +41,12 @@
4241
*/
4342
public class HeatingCurve extends AbstractData {
4443

45-
private List<Double> adjustedSignal;
44+
private final List<Double> adjustedSignal;
45+
private List<Double> lastCalculation;
4646
private double startTime;
4747

48-
private List<HeatingCurveListener> listeners = new ArrayList<HeatingCurveListener>();
48+
private final List<HeatingCurveListener> listeners
49+
= new ArrayList<>();
4950

5051
private UnivariateInterpolator splineInterpolator;
5152
private UnivariateFunction splineInterpolation;
@@ -62,7 +63,7 @@ protected HeatingCurve(List<Double> time, List<Double> signal, final double star
6263
*/
6364
public HeatingCurve() {
6465
super();
65-
adjustedSignal = new ArrayList<Double>((int) this.getNumPoints().getValue());
66+
adjustedSignal = new ArrayList<>((int) this.getNumPoints().getValue());
6667
splineInterpolator = new SplineInterpolator();
6768
}
6869

@@ -102,10 +103,16 @@ public HeatingCurve(NumericProperty count) {
102103
splineInterpolator = new SplineInterpolator();
103104
}
104105

106+
//TODO
107+
public void copyToLastCalculation() {
108+
lastCalculation = new ArrayList<>(0);
109+
lastCalculation = new ArrayList<>(adjustedSignal);
110+
}
111+
105112
@Override
106113
public void clear() {
107114
super.clear();
108-
this.adjustedSignal.clear();
115+
adjustedSignal.clear();
109116
}
110117

111118
/**
@@ -128,6 +135,7 @@ public double timeAt(int index) {
128135
* @return a double, representing the baseline-corrected temperature at
129136
* {@code index}
130137
*/
138+
@Override
131139
public double signalAt(int index) {
132140
return adjustedSignal.get(index);
133141
}
@@ -154,7 +162,6 @@ public double signalAt(int index) {
154162
* @see pulse.input.listeners.CurveEvent
155163
*/
156164
public void scale(double scale) {
157-
var signal = getSignalData();
158165
final int count = this.actualNumPoints();
159166
for (int i = 0; i < count; i++) {
160167
signal.set(i, signal.get(i) * scale);
@@ -166,9 +173,8 @@ public void scale(double scale) {
166173
private void refreshInterpolation() {
167174

168175
/*
169-
* Prepare extended time array
176+
* Prepare extended time array
170177
*/
171-
var time = this.getTimeSequence();
172178
var timeExtended = new double[time.size() + 1];
173179

174180
for (int i = 1; i < timeExtended.length; i++) {
@@ -188,11 +194,12 @@ private void refreshInterpolation() {
188194
}
189195

190196
final double alpha = -1.0;
191-
adjustedSignalExtended[0] = alpha * adjustedSignalExtended[2] - (1.0 - alpha) * adjustedSignalExtended[1]; // extrapolate
197+
adjustedSignalExtended[0] = alpha * adjustedSignalExtended[2]
198+
- (1.0 - alpha) * adjustedSignalExtended[1]; // extrapolate
192199
// linearly
193200

194201
/*
195-
* Submit to spline interpolation
202+
* Submit to spline interpolation
196203
*/
197204
splineInterpolation = splineInterpolator.interpolate(timeExtended, adjustedSignalExtended);
198205
}
@@ -220,19 +227,24 @@ public double maxAdjustedSignal() {
220227
* heating curve.
221228
*/
222229
public void apply(Baseline baseline) {
223-
var time = this.getTimeSequence();
224-
var signal = this.getSignalData();
225230
adjustedSignal.clear();
226-
for (int i = 0, size = time.size(); i < size; i++) {
227-
adjustedSignal.add(signal.get(i) + baseline.valueAt(timeAt(i)));
228-
}
231+
int size = time.size();
232+
233+
if (size > 0) {
234+
235+
for (int i = 0; i < size; i++) {
236+
adjustedSignal.add(signal.get(i) + baseline.valueAt(timeAt(i)));
237+
}
238+
239+
if (time.get(0) > -startTime) {
240+
time.add(0, -startTime);
241+
adjustedSignal.add(0, baseline.valueAt(-startTime));
242+
}
243+
244+
refreshInterpolation();
229245

230-
if (time.get(0) > -startTime) {
231-
time.add(0, -startTime);
232-
adjustedSignal.add(0, baseline.valueAt(-startTime));
233246
}
234247

235-
refreshInterpolation();
236248
}
237249

238250
/**
@@ -251,6 +263,7 @@ public void apply(Baseline baseline) {
251263
*
252264
* @param data the experimental data, with a time range broader than the
253265
* time range of this {@code HeatingCurve}.
266+
* @param baseline
254267
* @return a new {@code HeatingCurve}, extended to match the time limits of
255268
* {@code data}
256269
*/
@@ -266,10 +279,9 @@ public final HeatingCurve extendedTo(ExperimentalData data, Baseline baseline) {
266279
var baselineTime = data.getTimeSequence().stream().filter(t -> t < 0).collect(toList());
267280
var baselineSignal = baselineTime.stream().map(bTime -> baseline.valueAt(bTime)).collect(toList());
268281

269-
var time = this.getTimeSequence();
270-
271282
baselineTime.addAll(time);
272-
baselineSignal.addAll(adjustedSignal);
283+
this.copyToLastCalculation();
284+
baselineSignal.addAll(lastCalculation);
273285

274286
return new HeatingCurve(baselineTime, baselineSignal, startTime, getName());
275287
}

‎src/main/java/pulse/HeatingCurveListener.java

Copy file name to clipboardExpand all lines: src/main/java/pulse/HeatingCurveListener.java
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public interface HeatingCurveListener {
1010

1111
/**
1212
* Signals that a {@code CurveEvent} has occurred.
13+
* @param event
1314
*/
1415
public void onCurveEvent(CurveEvent event);
1516

‎src/main/java/pulse/input/ExperimentalData.java

Copy file name to clipboardExpand all lines: src/main/java/pulse/input/ExperimentalData.java
+5-20Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import pulse.input.listeners.DataEvent;
2020
import pulse.input.listeners.DataEventType;
2121
import pulse.input.listeners.DataListener;
22-
import pulse.properties.NumericProperty;
2322
import pulse.ui.Messages;
2423
import pulse.util.PropertyHolderListener;
2524

@@ -79,15 +78,15 @@ public ExperimentalData() {
7978

8079
}
8180

82-
public void addDataListener(DataListener listener) {
81+
public final void addDataListener(DataListener listener) {
8382
dataListeners.add(listener);
8483
}
8584

86-
public void clearDataListener() {
85+
public final void clearDataListener() {
8786
dataListeners.clear();
8887
}
8988

90-
public void fireDataChanged(DataEvent dataEvent) {
89+
public final void fireDataChanged(DataEvent dataEvent) {
9190
dataListeners.stream().forEach(l -> l.onDataChanged(dataEvent));
9291
}
9392

@@ -98,7 +97,7 @@ public void fireDataChanged(DataEvent dataEvent) {
9897
* @see pulse.input.Range.reset()
9998
* @see pulse.input.IndexRange.reset()
10099
*/
101-
public void resetRanges() {
100+
public final void resetRanges() {
102101
indexRange.reset(getTimeSequence());
103102
range.reset(indexRange, getTimeSequence());
104103
}
@@ -335,19 +334,6 @@ private void doSetMetadata() {
335334
range.updateMinimum(metadata.numericProperty(PULSE_WIDTH));
336335
}
337336

338-
metadata.addListener(event -> {
339-
340-
if (event.getProperty() instanceof NumericProperty) {
341-
var p = (NumericProperty) event.getProperty();
342-
343-
if (p.getType() == PULSE_WIDTH) {
344-
range.updateMinimum(metadata.numericProperty(PULSE_WIDTH));
345-
}
346-
347-
}
348-
349-
});
350-
351337
}
352338

353339
/**
@@ -413,7 +399,6 @@ public void setRange(Range range) {
413399
}
414400

415401
private void doSetRange() {
416-
var time = getTimeSequence();
417402
indexRange.set(time, range);
418403

419404
addHierarchyListener(l -> {
@@ -439,4 +424,4 @@ public double timeLimit() {
439424
return timeAt(indexRange.getUpperBound());
440425
}
441426

442-
}
427+
}

‎src/main/java/pulse/input/Metadata.java

Copy file name to clipboardExpand all lines: src/main/java/pulse/input/Metadata.java
+9-7Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package pulse.input;
22

33
import static java.lang.System.lineSeparator;
4-
import static pulse.properties.NumericProperties.def;
54
import static pulse.properties.NumericPropertyKeyword.DETECTOR_GAIN;
65
import static pulse.properties.NumericPropertyKeyword.DETECTOR_IRIS;
76
import static pulse.properties.NumericPropertyKeyword.DIAMETER;
@@ -20,6 +19,7 @@
2019
import pulse.problem.laser.NumericPulseData;
2120
import pulse.problem.laser.PulseTemporalShape;
2221
import pulse.problem.laser.RectangularPulse;
22+
import static pulse.properties.NumericProperties.derive;
2323
import pulse.properties.NumericProperty;
2424
import pulse.properties.NumericPropertyKeyword;
2525
import static pulse.properties.NumericPropertyKeyword.FOV_OUTER;
@@ -46,8 +46,8 @@ public class Metadata extends PropertyHolder implements Reflexive {
4646
private SampleName sampleName;
4747
private int externalID;
4848

49-
private InstanceDescriptor<? extends PulseTemporalShape> pulseDescriptor = new InstanceDescriptor<PulseTemporalShape>(
50-
"Pulse Shape Selector", PulseTemporalShape.class);
49+
private InstanceDescriptor<? extends PulseTemporalShape> pulseDescriptor
50+
= new InstanceDescriptor<>("Pulse Shape Selector", PulseTemporalShape.class);
5151

5252
private NumericPulseData pulseData;
5353

@@ -64,7 +64,7 @@ public Metadata(NumericProperty temperature, int externalId) {
6464
sampleName = new SampleName();
6565
setExternalID(externalId);
6666
pulseDescriptor.setSelectedDescriptor(RectangularPulse.class.getSimpleName());
67-
data = new TreeSet<NumericProperty>();
67+
data = new TreeSet<>();
6868
set(TEST_TEMPERATURE, temperature);
6969
}
7070

@@ -115,15 +115,17 @@ public void setSampleName(SampleName sampleName) {
115115
this.sampleName = sampleName;
116116
}
117117

118-
public void setPulseData(NumericPulseData pulseData) {
118+
public final void setPulseData(NumericPulseData pulseData) {
119119
this.pulseData = pulseData;
120+
this.set(PULSE_WIDTH, derive(PULSE_WIDTH, pulseData.pulseWidth()) );
120121
}
121122

122123
/**
123124
* If a Numerical Pulse has been loaded (for example, when importing from
124125
* Proteus), this will return an object describing this data.
126+
* @return
125127
*/
126-
public NumericPulseData getPulseData() {
128+
public final NumericPulseData getPulseData() {
127129
return pulseData;
128130
}
129131

@@ -270,4 +272,4 @@ public boolean equals(Object o) {
270272

271273
}
272274

273-
}
275+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.