Skip to content

Commit cb5b6a4

Browse files
committed
Simplify VES curves functions
1 parent 301edbe commit cb5b6a4

File tree

4 files changed

+60
-71
lines changed

4 files changed

+60
-71
lines changed

src/main/java/ru/nucodelabs/gem/fxmodel/ves/app/VesFxAppModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import ru.nucodelabs.geo.ves.calc.initialModel.MIN_TARGET_FUNCTION_VALUE
1010
import ru.nucodelabs.kfx.snapshot.HistoryManager
1111

1212
/**
13-
* Сюда по-хорошему надо вынести функционал из контроллеров
13+
* TODO: Сюда по-хорошему надо вынести функционал из контроллеров
1414
*/
1515
class VesFxAppModel @Inject constructor(
1616
selectedIndexObservable: IntegerProperty,

src/main/java/ru/nucodelabs/gem/view/controller/charts/MisfitStacksController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import ru.nucodelabs.gem.fxmodel.ves.app.VesFxAppModel
2020
import ru.nucodelabs.gem.view.AlertsFactory
2121
import ru.nucodelabs.gem.view.control.chart.log.LogarithmicAxis
2222
import ru.nucodelabs.geo.ves.Picket
23-
import ru.nucodelabs.geo.ves.calc.graph.vesCurvesContext
23+
import ru.nucodelabs.geo.ves.calc.graph.experimentalCurve
2424
import ru.nucodelabs.kfx.core.AbstractViewController
2525
import ru.nucodelabs.kfx.ext.Point
2626
import ru.nucodelabs.kfx.ext.forCharts
@@ -89,7 +89,7 @@ class MisfitStacksController @Inject constructor(
8989
var misfitStacksSeriesList: MutableList<Series<Number, Number>> = ArrayList()
9090
try {
9191
val misfits = appModel.misfits()
92-
val expPoints = picket.vesCurvesContext.experimentalCurve
92+
val expPoints = experimentalCurve(picket)
9393

9494
misfitStacksSeriesList = observableListOf()
9595

src/main/java/ru/nucodelabs/gem/view/controller/charts/VesCurvesController.kt

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ import ru.nucodelabs.geo.forward.ForwardSolver
3232
import ru.nucodelabs.geo.ves.Picket
3333
import ru.nucodelabs.geo.ves.Section
3434
import ru.nucodelabs.geo.ves.calc.effectiveToSortedIndicesMapping
35-
import ru.nucodelabs.geo.ves.calc.graph.VesCurvesContext
36-
import ru.nucodelabs.geo.ves.calc.graph.vesCurvesContext
35+
import ru.nucodelabs.geo.ves.calc.graph.*
3736
import ru.nucodelabs.geo.ves.calc.resistanceApparentLowerBoundByError
3837
import ru.nucodelabs.geo.ves.calc.resistanceApparentUpperBoundByError
3938
import ru.nucodelabs.geo.ves.calc.zOfModelLayers
@@ -93,7 +92,6 @@ class VesCurvesController @Inject constructor(
9392

9493
private val isModelVisible = SimpleBooleanProperty(true)
9594

96-
private lateinit var vesCurvesContext: VesCurvesContext
9795
private var effectiveToSortedMapping = intArrayOf()
9896

9997
private lateinit var uiProperties: ResourceBundle
@@ -118,7 +116,6 @@ class VesCurvesController @Inject constructor(
118116

119117
picketObservable.addListener { _, _, newValue: Picket? ->
120118
if (newValue != null) {
121-
vesCurvesContext = picket.vesCurvesContext
122119
if (isDraggingModel) {
123120
updateTheoreticalCurve()
124121
applyStyle()
@@ -144,8 +141,8 @@ class VesCurvesController @Inject constructor(
144141

145142
private fun initData(): ObjectProperty<ObservableList<Series<Number, Number>>> {
146143
return SimpleObjectProperty(
147-
FXCollections.observableArrayList<Series<Number, Number>>().also {
148-
for (i in 0..<TOTAL_COUNT) it += Series<Number, Number>()
144+
FXCollections.observableArrayList<Series<Number, Number>>().apply {
145+
(0..<TOTAL_COUNT).forEach { _ -> add(Series<Number, Number>()) }
149146
}
150147
)
151148
}
@@ -277,7 +274,7 @@ class VesCurvesController @Inject constructor(
277274
val theorCurveSeries = Series<Number, Number>()
278275
try {
279276
theorCurveSeries.data.addAll(
280-
vesCurvesContext.theoreticalCurveBy(forwardSolver).map { (x, y) -> Data(x as Number, y as Number) }
277+
theoreticalCurve(picket, forwardSolver).map { (x, y) -> Data(x as Number, y as Number) }
281278
)
282279
} catch (e: UnsatisfiedLinkError) {
283280
alertsFactory.unsatisfiedLinkErrorAlert(e, stage)
@@ -289,7 +286,7 @@ class VesCurvesController @Inject constructor(
289286
private fun updateModelCurve() {
290287
val modelCurveSeries = Series<Number, Number>()
291288
modelCurveSeries.data.addAll(
292-
vesCurvesContext.modelStepGraph().map { (x, y) -> Data(x as Number, y as Number) }
289+
modelStepGraph(picket).map { (x, y) -> Data(x as Number, y as Number) }
293290
)
294291
modelCurveSeries.name = uiProperties["modCurve"]
295292
dataProperty.get()[MOD_CURVE_SERIES_INDEX] = modelCurveSeries
@@ -331,26 +328,26 @@ class VesCurvesController @Inject constructor(
331328

332329
private fun updateExpCurves() {
333330
val expCurveSeries = Series(
334-
vesCurvesContext.experimentalCurve.map { (x, y) -> Data(x as Number, y as Number) }.toObservableList()
331+
experimentalCurve(picket).map { (x, y) -> Data(x as Number, y as Number) }.toObservableList()
335332
)
336333
expCurveSeries.name = uiProperties["expCurve"]
337334

338335
val errUpperExp = Series(
339-
vesCurvesContext.experimentalCurveErrorUpperBound.map { (x, y) ->
336+
experimentalCurveErrorUpperBound(picket).map { (x, y) ->
340337
Data(x as Number, y as Number)
341338
}.toObservableList()
342339
)
343340
errUpperExp.name = uiProperties["expCurveUpper"]
344341

345342
val errLowerExp = Series(
346-
vesCurvesContext.experimentalCurveErrorLowerBound.map { (x, y) ->
343+
experimentalCurveErrorLowerBound(picket).map { (x, y) ->
347344
Data(x as Number, y as Number)
348345
}.toObservableList()
349346
)
350347
errLowerExp.name = uiProperties["expCurveLower"]
351348

352349
val hiddenPoints = Series(
353-
vesCurvesContext.experimentalHiddenPoints.map { (x, y) ->
350+
experimentalHiddenPoints(picket).map { (x, y) ->
354351
Data(x as Number, y as Number)
355352
}.toObservableList()
356353
)
@@ -403,7 +400,7 @@ class VesCurvesController @Inject constructor(
403400
picket.sortedExperimentalData[pointIndex].resistanceApparentUpperBoundByError
404401
)
405402
val y = decimalFormat.format(picket.sortedExperimentalData[pointIndex].resistanceApparent)
406-
val theorRes = picket.vesCurvesContext.theoreticalCurveBy(forwardSolver).getOrNull(pointIndex)?.y
403+
val theorRes = theoreticalCurve(picket, forwardSolver).getOrNull(pointIndex)?.y
407404
Tooltip(
408405
"""
409406
${pointIndex + 1}

src/main/java/ru/nucodelabs/geo/ves/calc/graph/VesCurvesFunctions.kt

Lines changed: 47 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7,74 +7,66 @@ import ru.nucodelabs.geo.ves.calc.resistanceApparentLowerBoundByError
77
import ru.nucodelabs.geo.ves.calc.resistanceApparentUpperBoundByError
88
import ru.nucodelabs.util.Point
99

10-
class VesCurvesContext(val picket: Picket) {
11-
val experimentalCurve by lazy {
12-
picket.effectiveExperimentalData.map { Point(it.ab2, it.resistanceApparent) }
13-
}
10+
fun experimentalCurve(picket: Picket) =
11+
picket.effectiveExperimentalData.map { Point(it.ab2, it.resistanceApparent) }
1412

15-
val experimentalCurveErrorUpperBound by lazy {
16-
picket.effectiveExperimentalData.map { Point(it.ab2, it.resistanceApparentUpperBoundByError) }
17-
}
1813

19-
val experimentalCurveErrorLowerBound by lazy {
20-
picket.effectiveExperimentalData.map { Point(it.ab2, it.resistanceApparentLowerBoundByError) }
21-
}
14+
fun experimentalCurveErrorUpperBound(picket: Picket) =
15+
picket.effectiveExperimentalData.map { Point(it.ab2, it.resistanceApparentUpperBoundByError) }
2216

23-
val experimentalHiddenPoints by lazy {
24-
picket.sortedExperimentalData.filter { it.isHidden }.map { Point(it.ab2, it.resistanceApparent) }
25-
}
17+
fun experimentalCurveErrorLowerBound(picket: Picket) =
18+
picket.effectiveExperimentalData.map { Point(it.ab2, it.resistanceApparentLowerBoundByError) }
2619

27-
fun theoreticalCurveBy(forwardSolver: ForwardSolver): List<Point> {
28-
if (picket.sortedExperimentalData.isEmpty() || picket.modelData.isEmpty()) {
29-
return listOf()
30-
}
31-
val solvedResistance = forwardSolver(picket.sortedExperimentalData, picket.modelData)
32-
return List(picket.sortedExperimentalData.size) { i ->
33-
Point(picket.sortedExperimentalData[i].ab2, solvedResistance[i])
34-
}
35-
}
36-
37-
fun misfitsBy(misfitsFunction: MisfitsFunction): List<Double> =
38-
misfitsFunction(picket.effectiveExperimentalData, picket.modelData)
20+
fun experimentalHiddenPoints(picket: Picket) =
21+
picket.sortedExperimentalData.filter { it.isHidden }.map { Point(it.ab2, it.resistanceApparent) }
3922

40-
fun modelStepGraph(beginX: Double = 1e-3, endX: Double = 1e100): List<Point> {
41-
val modelData = picket.modelData
23+
fun theoreticalCurve(picket: Picket, forwardSolver: ForwardSolver): List<Point> {
24+
if (picket.sortedExperimentalData.isEmpty() || picket.modelData.isEmpty()) {
25+
return listOf()
26+
}
27+
val solvedResistance = forwardSolver(picket.sortedExperimentalData, picket.modelData)
28+
return List(picket.sortedExperimentalData.size) { i ->
29+
Point(picket.sortedExperimentalData[i].ab2, solvedResistance[i])
30+
}
31+
}
4232

43-
if (modelData.isEmpty()) {
44-
return mutableListOf()
45-
}
46-
val points = mutableListOf<Point>()
33+
fun misfits(picket: Picket, misfitsFunction: MisfitsFunction): List<Double> =
34+
misfitsFunction(picket.effectiveExperimentalData, picket.modelData)
4735

48-
// first point
49-
points += Point(beginX, picket.modelData.first().resistance)
36+
fun modelStepGraph(picket: Picket, beginX: Double = 1e-3, endX: Double = 1e100): List<Point> {
37+
val modelData = picket.modelData
5038

51-
var prevSum = 0.0
52-
for (i in 0 until modelData.size - 1) {
53-
val currentResistance = modelData[i].resistance
54-
val currentPower = modelData[i].power
39+
if (modelData.isEmpty()) {
40+
return mutableListOf()
41+
}
42+
val points = mutableListOf<Point>()
5543

56-
points += Point(
57-
currentPower + prevSum,
58-
currentResistance
59-
)
44+
// first point
45+
points += Point(beginX, modelData.first().resistance)
6046

61-
val nextResistance = modelData[i + 1].resistance
62-
points += Point(
63-
currentPower + prevSum,
64-
nextResistance
65-
)
66-
prevSum += currentPower
67-
}
47+
var prevSum = 0.0
48+
for (i in 0 until modelData.size - 1) {
49+
val currentResistance = modelData[i].resistance
50+
val currentPower = modelData[i].power
6851

69-
// last point
7052
points += Point(
71-
endX,
72-
modelData.last().resistance
53+
currentPower + prevSum,
54+
currentResistance
7355
)
7456

75-
return points
57+
val nextResistance = modelData[i + 1].resistance
58+
points += Point(
59+
currentPower + prevSum,
60+
nextResistance
61+
)
62+
prevSum += currentPower
7663
}
77-
}
7864

79-
val Picket.vesCurvesContext
80-
get() = VesCurvesContext(this)
65+
// last point
66+
points += Point(
67+
endX,
68+
modelData.last().resistance
69+
)
70+
71+
return points
72+
}

0 commit comments

Comments
 (0)