From 58623e151ab0ae4e19a757ae2e83331ce1274382 Mon Sep 17 00:00:00 2001 From: Vadim Mostovoy Date: Mon, 1 Sep 2025 00:45:16 +0700 Subject: [PATCH 1/2] Interpolation Pseudo Section performance optimization. Refactoring --- .../main/kotlin/ru/nucodelabs/util/Point.kt | 9 ++ kfx-utils/build.gradle | 25 ++--- .../ru/nucodelabs/gem/config/AppModule.java | 44 ++++---- .../nucodelabs/gem/config/ChartsModule.java | 5 +- .../view/control/chart/InterpolationMap.kt | 104 +++++++++--------- .../gem/view/controller/AbstractController.kt | 2 +- .../charts/CurvesPseudoSectionController.kt | 5 +- .../controller/tables/ModelTableController.kt | 3 +- .../gem/view/controller/util/TablesHelpers.kt | 12 +- .../ru/nucodelabs/geo/ves/DefaultValues.kt | 7 -- .../ru/nucodelabs/geo/ves/ExperimentalData.kt | 6 +- src/main/java/ru/nucodelabs/geo/ves/Picket.kt | 15 ++- ...Parser.kt => CurvesSectionGraphContext.kt} | 3 +- ...ive.kt => MathVesNativeMisfitsFunction.kt} | 4 +- .../geo/ves/calc/graph/MisfitsFunction.kt | 10 +- .../ru/nucodelabs/geo/ves/calc/graph/Point.kt | 3 - .../geo/ves/calc/graph/VesCurvesFunctions.kt | 1 + .../interpolation/InterpolationDataParser.kt | 19 ---- .../ves/calc/interpolation/Interpolator.kt | 61 +++++----- ...lationParser.kt => InterpolatorContext.kt} | 72 ++++++------ .../interpolation/RBFSpatialInterpolator.kt | 2 - .../interpolation/TinSpatialInterpolator.kt | 2 + .../geo/ves/calc/inverse/InverseSolver.java | 2 +- .../FunctionValue.java | 2 +- .../gem/file/dto/mapper/DtoMapperTest.java | 11 +- 25 files changed, 207 insertions(+), 222 deletions(-) create mode 100644 common-utils/src/main/kotlin/ru/nucodelabs/util/Point.kt delete mode 100644 src/main/java/ru/nucodelabs/geo/ves/DefaultValues.kt rename src/main/java/ru/nucodelabs/geo/ves/calc/graph/{CurvesChartParser.kt => CurvesSectionGraphContext.kt} (96%) rename src/main/java/ru/nucodelabs/geo/ves/calc/graph/{MisfitValuesFactoryNative.kt => MathVesNativeMisfitsFunction.kt} (88%) delete mode 100644 src/main/java/ru/nucodelabs/geo/ves/calc/graph/Point.kt delete mode 100644 src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolationDataParser.kt rename src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/{InterpolationParser.kt => InterpolatorContext.kt} (61%) rename src/main/java/ru/nucodelabs/geo/ves/calc/inverse/{inverse_functions => func}/FunctionValue.java (98%) diff --git a/common-utils/src/main/kotlin/ru/nucodelabs/util/Point.kt b/common-utils/src/main/kotlin/ru/nucodelabs/util/Point.kt new file mode 100644 index 00000000..46aee1e2 --- /dev/null +++ b/common-utils/src/main/kotlin/ru/nucodelabs/util/Point.kt @@ -0,0 +1,9 @@ +package ru.nucodelabs.util + +data class Point( + val x: Double, + val y: Double, + val z: Double +) + +fun Point(x: Double, y: Double) = Point(x, y, .0) \ No newline at end of file diff --git a/kfx-utils/build.gradle b/kfx-utils/build.gradle index 0e0881c0..e4b9e3f0 100644 --- a/kfx-utils/build.gradle +++ b/kfx-utils/build.gradle @@ -1,24 +1,23 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - id 'org.jetbrains.kotlin.jvm' version '2.2.0' - id 'java-library' - id 'org.openjfx.javafxplugin' version '0.1.0' + id "org.jetbrains.kotlin.jvm" version "2.2.0" + id "java-library" + id "org.openjfx.javafxplugin" version "0.1.0" } version = rootProject.version tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' + options.encoding = "UTF-8" } javafx { - version = rootProject['javafx']['version'] - modules = ['javafx.controls', 'javafx.fxml', 'javafx.graphics', 'javafx.swing'] + version = rootProject["javafx"]["version"] + modules = ["javafx.controls", "javafx.fxml", "javafx.graphics", "javafx.swing"] } repositories { - // Use Maven Central for resolving dependencies. mavenCentral() } @@ -39,14 +38,14 @@ compileKotlin { } dependencies { - implementation platform('org.jetbrains.kotlin:kotlin-bom') - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation platform("org.jetbrains.kotlin:kotlin-bom") + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - testImplementation 'org.jetbrains.kotlin:kotlin-test' - testImplementation 'org.jetbrains.kotlin:kotlin-test-junit' + testImplementation "org.jetbrains.kotlin:kotlin-test" + testImplementation "org.jetbrains.kotlin:kotlin-test-junit" testImplementation "org.openjfx:javafx:${javafx.version}" api "org.openjfx:javafx:${javafx.version}" - api group: 'com.google.inject', name: 'guice', version: rootProject.guiceVersion - api 'no.tornado:tornadofx:1.7.20' + api group: "com.google.inject", name: "guice", version: rootProject.guiceVersion + api "no.tornado:tornadofx:1.7.20" } diff --git a/src/main/java/ru/nucodelabs/gem/config/AppModule.java b/src/main/java/ru/nucodelabs/gem/config/AppModule.java index 6dd384b3..d821e2e7 100644 --- a/src/main/java/ru/nucodelabs/gem/config/AppModule.java +++ b/src/main/java/ru/nucodelabs/gem/config/AppModule.java @@ -32,11 +32,11 @@ import ru.nucodelabs.geo.target.RelativeErrorAwareTargetFunction; import ru.nucodelabs.geo.target.impl.SquareDiffTargetFunction; -import java.io.FileInputStream; import java.io.IOException; import java.math.RoundingMode; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Paths; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; @@ -69,8 +69,8 @@ private Locale currentLocale() { @Provides @Singleton - private ResourceBundle uiProperties() { - return ResourceBundle.getBundle("ui", currentLocale()); + private ResourceBundle uiProperties(Locale currentLocale) { + return ResourceBundle.getBundle("ui", currentLocale); } @Provides @@ -149,6 +149,7 @@ private Preferences preferences() { @Provides @Named(Name.PRECISE_FORMAT) + @Singleton DecimalFormat preciseFormat() { DecimalFormat decimalFormat = new DecimalFormat(); decimalFormat.setRoundingMode(RoundingMode.HALF_UP); @@ -162,6 +163,7 @@ DecimalFormat preciseFormat() { } @Provides + @Singleton private DecimalFormat decimalFormat() { DecimalFormat decimalFormat = new DecimalFormat(); decimalFormat.setRoundingMode(RoundingMode.HALF_UP); @@ -176,6 +178,7 @@ private DecimalFormat decimalFormat() { } @Provides + @Singleton private StringConverter doubleStringConverter(DecimalFormat decimalFormat) { return new StringConverter<>() { @Override @@ -199,6 +202,7 @@ public Double fromString(String string) { } @Provides + @Singleton StringConverter numberStringConverter(StringConverter doubleStringConverter) { return new StringConverter<>() { @Override @@ -216,44 +220,42 @@ public Number fromString(String string) { @Provides @Singleton @Named(Name.DEFAULT_CLR) - ClrInfo clrInfo() throws IOException { + LoadedClr colormapFile() throws IOException { // Firstly lookup next to executable - var externalFile = Paths.get("colormap/default.clr").toFile(); - if (!externalFile.exists()) { + var externalFile = Paths.get("colormap/default.clr"); + if (Files.notExists(externalFile)) { // Load default from resources if no external .clr file found var defaultResourceStream = Objects.requireNonNull( this.getClass().getClassLoader().getResourceAsStream("colormap/default.clr"), - "Resource colormap/default.clr is null" + "Resource colormap/default.clr must not be null" ); + log.info("Loading default .clr file from resources"); try (defaultResourceStream) { - log.info("Loading default .clr file from resources"); - return new ClrInfo( + return new LoadedClr( "Default", new String(defaultResourceStream.readAllBytes(), StandardCharsets.UTF_8) ); } } - try (var externalFileStream = new FileInputStream(externalFile)) { - log.info("Loading external .clr file"); - return new ClrInfo( - externalFile.getAbsolutePath(), - new String(externalFileStream.readAllBytes(), StandardCharsets.UTF_8) - ); - } + log.info("Loading external .clr file"); + return new LoadedClr( + externalFile.toAbsolutePath().toString(), + Files.readString(externalFile, StandardCharsets.UTF_8) + ); } @Provides @Singleton @Named(Name.CLR_SOURCE) - String clrSource(@Named(Name.DEFAULT_CLR) ClrInfo clrInfo) { - return clrInfo.source(); + String clrSource(@Named(Name.DEFAULT_CLR) LoadedClr loadedClr) { + return loadedClr.source(); } @Provides @Named(Name.DEFAULT_CLR) @Singleton - ClrParser clrParser(@Named(Name.DEFAULT_CLR) ClrInfo clrInfo) { - return new ClrParser(clrInfo.content()); + ClrParser clrParser(@Named(Name.DEFAULT_CLR) LoadedClr loadedClr) { + return new ClrParser(loadedClr.content()); } @Provides @@ -283,6 +285,6 @@ RelativeErrorAwareTargetFunction targetFunction() { return new SquareDiffTargetFunction(); } - private record ClrInfo(String source, String content) { + private record LoadedClr(String source, String content) { } } diff --git a/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java b/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java index f05ab0cc..5772fe74 100644 --- a/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java +++ b/src/main/java/ru/nucodelabs/gem/config/ChartsModule.java @@ -2,13 +2,16 @@ import com.google.inject.AbstractModule; import com.google.inject.Provides; +import com.google.inject.Singleton; import ru.nucodelabs.geo.forward.ForwardSolver; +import ru.nucodelabs.geo.ves.calc.graph.MathVesNativeMisfitsFunction; import ru.nucodelabs.geo.ves.calc.graph.MisfitsFunction; public class ChartsModule extends AbstractModule { @Provides + @Singleton MisfitsFunction misfitValuesFactory(ForwardSolver forwardSolver) { - return MisfitsFunction.createDefault(forwardSolver); + return new MathVesNativeMisfitsFunction(forwardSolver); } } diff --git a/src/main/java/ru/nucodelabs/gem/view/control/chart/InterpolationMap.kt b/src/main/java/ru/nucodelabs/gem/view/control/chart/InterpolationMap.kt index 7e30bd32..6cfa16ee 100644 --- a/src/main/java/ru/nucodelabs/gem/view/control/chart/InterpolationMap.kt +++ b/src/main/java/ru/nucodelabs/gem/view/control/chart/InterpolationMap.kt @@ -6,31 +6,33 @@ import javafx.beans.property.SimpleObjectProperty import javafx.scene.canvas.Canvas import javafx.scene.chart.ValueAxis import javafx.scene.effect.BlendMode +import javafx.scene.image.Image import javafx.scene.paint.Color import ru.nucodelabs.gem.view.color.ColorMapper -import ru.nucodelabs.geo.ves.calc.interpolation.InterpolationParser import ru.nucodelabs.geo.ves.calc.interpolation.Interpolator +import ru.nucodelabs.geo.ves.calc.interpolation.InterpolatorContext import ru.nucodelabs.kfx.ext.clear +import ru.nucodelabs.util.Point import tornadofx.getValue import tornadofx.setValue -import java.lang.Double.max -import kotlin.math.min class InterpolationMap @JvmOverloads constructor( - @NamedArg("xAxis") xAxis: ValueAxis, - @NamedArg("yAxis") yAxis: ValueAxis, - @NamedArg("colorMapper") colorMapper: ColorMapper? = null + @NamedArg("xAxis") xAxis: ValueAxis, + @NamedArg("yAxis") yAxis: ValueAxis, + @NamedArg("colorMapper") colorMapper: ColorMapper? = null ) : AbstractMap(xAxis, yAxis) { var canvasBlendMode: BlendMode by canvas.blendModeProperty() private val _interpolateSeriesIndex = SimpleIntegerProperty(0) - private lateinit var interpolationParser: InterpolationParser + private lateinit var interpolatorContext: InterpolatorContext private var canBeInterpolated = true - private var interpolatorIsInitialized = false + private var needRedraw = false + + private var snapshot: Image? = null fun interpolateSeriesIndexProperty() = _interpolateSeriesIndex var interpolateSeriesIndex @@ -40,7 +42,7 @@ class InterpolationMap @JvmOverloads constructor( init { interpolateSeriesIndexProperty().addListener { _, _, _ -> initInterpolator() - draw(canvas) + redrawSnapshot() } } @@ -53,45 +55,52 @@ class InterpolationMap @JvmOverloads constructor( init { colorMapperProperty().addListener { _, _, new -> startListening(new) - draw(canvas) + redrawSnapshot() } startListening(colorMapper) } private fun startListening(colorMapper: ColorMapper?) { - colorMapper?.minValueProperty()?.addListener { _, _, _ -> draw(canvas) } - colorMapper?.maxValueProperty()?.addListener { _, _, _ -> draw(canvas) } - colorMapper?.numberOfSegmentsProperty()?.addListener { _, _, _ -> draw(canvas) } - colorMapper?.logScaleProperty()?.addListener { _, _, _ -> draw(canvas) } + colorMapper?.minValueProperty()?.addListener { _, _, _ -> redrawSnapshot() } + colorMapper?.maxValueProperty()?.addListener { _, _, _ -> redrawSnapshot() } + colorMapper?.numberOfSegmentsProperty()?.addListener { _, _, _ -> redrawSnapshot() } + colorMapper?.logScaleProperty()?.addListener { _, _, _ -> redrawSnapshot() } } private lateinit var interpolator: Interpolator - private var preparedData: List>> = mutableListOf() - - fun interpolatedValueAtPoint(x: Double, y: Double): Double = interpolator.getValue(x, y) + private var preparedData: List> = mutableListOf() override fun layoutPlotChildren() { super.layoutPlotChildren() - if (!interpolatorIsInitialized) { - initInterpolator() - interpolatorIsInitialized = true - } - draw(canvas) + if (needRedraw) redrawSnapshot() else layoutSnapshot() + } + + private fun redrawSnapshot() { + initInterpolator() + needRedraw = false + val render = Canvas(1920.0, 1080.0) // FIXME: Remove hardcoded + draw(render) + snapshot = render.snapshot(null, null) + layoutSnapshot() + } + + private fun layoutSnapshot() { + canvas.graphicsContext2D.drawImage(snapshot, 0.0, 0.0, canvas.width, canvas.height) } override fun dataItemAdded(series: Series?, itemIndex: Int, item: Data?) { super.dataItemAdded(series, itemIndex, item) - interpolatorIsInitialized = false + needRedraw = true } override fun dataItemRemoved(item: Data?, series: Series?) { super.dataItemRemoved(item, series) - interpolatorIsInitialized = false + needRedraw = true } override fun dataItemChanged(item: Data?) { super.dataItemChanged(item) - interpolatorIsInitialized = false + needRedraw = true } private fun draw(canvas: Canvas) { @@ -106,35 +115,29 @@ class InterpolationMap @JvmOverloads constructor( } val pw = canvas.graphicsContext2D.pixelWriter - val maxR = interpolationParser.maxResistance() - val minR = interpolationParser.minResistance() + val maxY = interpolatorContext.maxY() + val minY = interpolatorContext.minY() + val xCanvasScale = canvas.width / xAxis.width + val yCanvasScale = canvas.height / yAxis.height for (x in 0..canvas.width.toInt()) { for (y in 0..canvas.height.toInt()) { - val xValue = xAxis.getValueForDisplay(x.toDouble()).toDouble() - var yValue = yAxis.getValueForDisplay(y.toDouble()).toDouble() - yValue = min(max(yValue, minR), maxR) + val xValue = xAxis.getValueForDisplay(x.toDouble() / xCanvasScale).toDouble() + var yValue = yAxis.getValueForDisplay(y.toDouble() / yCanvasScale).toDouble() if (xValue.isNaN() || yValue.isNaN()) { continue } - if (yValue > maxR) continue + yValue = yValue.coerceIn(minY, maxY) val fValue = if (preparedData.size == 1) { interpolator.getValue(yValue) } else { interpolator.getValue(xValue, yValue) } - var color = Color.WHITE - try { - if (fValue != -1.0) color = colorMapper?.colorFor(fValue) - } catch (e: RuntimeException) { - println(fValue) - } + val color = if (fValue != -1.0) colorMapper?.colorFor(fValue) else Color.WHITE pw.setColor(x, y, color) } } } - - @Suppress("UNCHECKED_CAST") private fun initInterpolator() { if (data.isEmpty()) { return @@ -143,28 +146,27 @@ class InterpolationMap @JvmOverloads constructor( if (series.data.isEmpty()) { return } - val groupByX = series.data.sortedBy { it.xValue.toDouble() }.groupBy { it.xValue }.values.toMutableList() + val groupByX = series.data.map { + Point( + it.xValue.toDouble(), + it.yValue.toDouble(), + it.extraValue as Double + ) + }.sortedBy { it.x }.groupBy { it.x }.values.toMutableList() try { - groupByX[0] = groupByX[0].map { - Data( - 0.0, - it.yValue, - it.extraValue - ) - } + groupByX[0] = groupByX[0].map { Point(x = .0, it.y, it.z) } } catch (e: Exception) { e.printStackTrace() } - groupByX as List>> preparedData = groupByX - interpolationParser = InterpolationParser(preparedData) - if (interpolationParser.getGrid()[0].size < 2) { + interpolatorContext = InterpolatorContext(preparedData) + if (interpolatorContext.getGrid()[0].size < 2) { canBeInterpolated = false return } else { canBeInterpolated = true } - interpolator = Interpolator(interpolationParser) + interpolator = Interpolator(interpolatorContext) } } diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/AbstractController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/AbstractController.kt index 6afe93af..2d898e92 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/AbstractController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/AbstractController.kt @@ -12,7 +12,7 @@ import java.util.* @Deprecated( message = "Use AbstractViewController", replaceWith = ReplaceWith( - "AbstractViewController()", + "AbstractViewController()", "ru.nucodelabs.kfx.core.AbstractViewController" ) ) diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/charts/CurvesPseudoSectionController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/charts/CurvesPseudoSectionController.kt index f6b5c04a..2a4e6939 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/charts/CurvesPseudoSectionController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/charts/CurvesPseudoSectionController.kt @@ -12,7 +12,7 @@ import ru.nucodelabs.gem.fxmodel.ves.ObservableSection import ru.nucodelabs.gem.view.control.chart.installTooltips import ru.nucodelabs.geo.ves.ExperimentalData import ru.nucodelabs.geo.ves.calc.effectiveToSortedIndicesMapping -import ru.nucodelabs.geo.ves.calc.graph.CurvesChartParser +import ru.nucodelabs.geo.ves.calc.graph.CurvesSectionGraphContext import ru.nucodelabs.kfx.ext.forCharts import ru.nucodelabs.kfx.ext.toObservableList import java.net.URL @@ -42,7 +42,8 @@ class CurvesPseudoSectionController @Inject constructor( pointMap.clear() chart.data.clear() - chart.data += CurvesChartParser(observableSection.asSection()).getPoints().mapIndexed { picketIndex, curve -> + chart.data += CurvesSectionGraphContext(observableSection.asSection()).getPoints() + .mapIndexed { picketIndex, curve -> val picket = observableSection.pickets[picketIndex] val indexMapping = picket.effectiveToSortedIndicesMapping() val sorted = picket.sortedExperimentalData diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/tables/ModelTableController.kt b/src/main/java/ru/nucodelabs/gem/view/controller/tables/ModelTableController.kt index a4703fe5..55d071a0 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/tables/ModelTableController.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/tables/ModelTableController.kt @@ -477,7 +477,8 @@ class ModelTableController @Inject constructor( val parsedTable = parser.parsedTable.filter { row -> row.none { it == null } } fun String?.process(expected: String, row: Int, col: Int) = - this?.replace(',', '.')?.toDoubleOrNullBy(decimalFormat) + this?.replace(',', '.') + ?.toDoubleOrNullBy(decimalFormat) ?: throw IllegalArgumentException("${a[col]}${row + 1} - Ожидалось $expected, было $this") val pastedItems: List = when (parser.columnsCount) { diff --git a/src/main/java/ru/nucodelabs/gem/view/controller/util/TablesHelpers.kt b/src/main/java/ru/nucodelabs/gem/view/controller/util/TablesHelpers.kt index f38a5a0c..562d2080 100644 --- a/src/main/java/ru/nucodelabs/gem/view/controller/util/TablesHelpers.kt +++ b/src/main/java/ru/nucodelabs/gem/view/controller/util/TablesHelpers.kt @@ -16,14 +16,4 @@ fun indexCellFactory(fromOne: Boolean = true): Callback, .otherwise(it.indexProperty().add(if (fromOne) 1 else 0).asString()) ) } - } - -/** - * Validating string containing index for list/array - * @return true if string represents valid index - */ - -fun String.isIndexOrBlank() = - takeIf { it.isBlank() }?.let { true } ?: toIntOrNull()?.takeIf { it >= 0 }?.let { true } ?: false - -fun String.isIndex() = toIntOrNull()?.takeIf { it >= 0 }?.let { true } ?: false \ No newline at end of file + } \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/geo/ves/DefaultValues.kt b/src/main/java/ru/nucodelabs/geo/ves/DefaultValues.kt deleted file mode 100644 index adaf54ec..00000000 --- a/src/main/java/ru/nucodelabs/geo/ves/DefaultValues.kt +++ /dev/null @@ -1,7 +0,0 @@ -package ru.nucodelabs.geo.ves - -const val DEFAULT_ERROR = 5.0 -const val DEFAULT_PICKET_OFFSET_X = 100.0 -const val DEFAULT_PICKET_NAME = "Пикет" -const val DEFAULT_PICKET_Z = 0.0 -const val DEFAULT_PICKET_COMMENT = "" \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/geo/ves/ExperimentalData.kt b/src/main/java/ru/nucodelabs/geo/ves/ExperimentalData.kt index eef5aed0..33fe236f 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/ExperimentalData.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/ExperimentalData.kt @@ -24,4 +24,8 @@ data class ExperimentalData( @field:DecimalMin("0.1") val resistanceApparent: Double = rhoA(ab2, mn2, amperage, voltage), @field:Min(0) @field:Max(100) val errorResistanceApparent: Double = DEFAULT_ERROR, val isHidden: Boolean = false -) +) { + companion object Defaults { + const val DEFAULT_ERROR = 5.0 + } +} diff --git a/src/main/java/ru/nucodelabs/geo/ves/Picket.kt b/src/main/java/ru/nucodelabs/geo/ves/Picket.kt index 028c80d2..12805ee6 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/Picket.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/Picket.kt @@ -18,12 +18,12 @@ import java.util.* */ data class Picket( @JsonIgnore val id: UUID = UUID.randomUUID(), - val name: String = DEFAULT_PICKET_NAME, + val name: String = DEFAULT_NAME, private var experimentalData: List<@Valid ExperimentalData> = emptyList(), @field:Size(max = 40) var modelData: List<@Valid ModelLayer> = emptyList(), - @field:Min(0) val offsetX: Double = DEFAULT_PICKET_OFFSET_X, - val z: Double = DEFAULT_PICKET_Z, - val comment: String = DEFAULT_PICKET_COMMENT + @field:Min(0) val offsetX: Double = DEFAULT_OFFSET_X, + val z: Double = DEFAULT_Z, + val comment: String = DEFAULT_COMMENT ) { init { modelData = modelData.toMutableList().also { @@ -79,4 +79,11 @@ data class Picket( val effectiveExperimentalData: List by lazy { sortedExperimentalData.filter { !it.isHidden } } + + companion object Defaults { + const val DEFAULT_OFFSET_X = 100.0 + const val DEFAULT_NAME = "Пикет" + const val DEFAULT_Z = 0.0 + const val DEFAULT_COMMENT = "" + } } diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/CurvesChartParser.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/CurvesSectionGraphContext.kt similarity index 96% rename from src/main/java/ru/nucodelabs/geo/ves/calc/graph/CurvesChartParser.kt rename to src/main/java/ru/nucodelabs/geo/ves/calc/graph/CurvesSectionGraphContext.kt index f46b2619..e0e0b3e8 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/CurvesChartParser.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/CurvesSectionGraphContext.kt @@ -4,9 +4,10 @@ import jakarta.inject.Inject import ru.nucodelabs.geo.ves.Section import ru.nucodelabs.geo.ves.calc.Bounds import ru.nucodelabs.geo.ves.calc.picketsBounds +import ru.nucodelabs.util.Point import kotlin.math.min -class CurvesChartParser @Inject constructor(inputSection: Section) { +class CurvesSectionGraphContext @Inject constructor(inputSection: Section) { private val section = inputSection.copy() diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MisfitValuesFactoryNative.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MathVesNativeMisfitsFunction.kt similarity index 88% rename from src/main/java/ru/nucodelabs/geo/ves/calc/graph/MisfitValuesFactoryNative.kt rename to src/main/java/ru/nucodelabs/geo/ves/calc/graph/MathVesNativeMisfitsFunction.kt index 4874c5c9..64af54a6 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MisfitValuesFactoryNative.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MathVesNativeMisfitsFunction.kt @@ -7,7 +7,7 @@ import ru.nucodelabs.geo.ves.calc.adapter.invoke import kotlin.math.abs import kotlin.math.sign -internal class MisfitValuesFactoryNative(val forwardSolver: ForwardSolver) : MisfitsFunction { +internal class MathVesNativeMisfitsFunction(val forwardSolver: ForwardSolver) : MisfitsFunction { override fun invoke(experimentalData: List, modelData: List): List { if (experimentalData.isEmpty() || modelData.isEmpty()) { @@ -18,7 +18,7 @@ internal class MisfitValuesFactoryNative(val forwardSolver: ForwardSolver) : Mis val errorResistanceApparent = experimentalData.map { it.errorResistanceApparent } val solvedResistance = forwardSolver(experimentalData, modelData) - val res = mutableListOf() + val res = ArrayList(experimentalData.size) for (i in experimentalData.indices) { val value = abs( ru.nucodelabs.mathves.MisfitFunctions.calculateRelativeDeviationWithError( diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MisfitsFunction.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MisfitsFunction.kt index 8b6e3153..2b49f9d5 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MisfitsFunction.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/MisfitsFunction.kt @@ -1,6 +1,5 @@ package ru.nucodelabs.geo.ves.calc.graph -import ru.nucodelabs.geo.forward.ForwardSolver import ru.nucodelabs.geo.ves.ExperimentalData import ru.nucodelabs.geo.ves.ModelLayer @@ -9,11 +8,4 @@ interface MisfitsFunction { * Returns list of misfits between experimental and theoretical curves */ operator fun invoke(experimentalData: List, modelData: List): List - - companion object Factory { - @JvmStatic - fun createDefault(forwardSolver: ForwardSolver): MisfitsFunction = MisfitsFunction(forwardSolver) - } -} - -fun MisfitsFunction(forwardSolver: ForwardSolver): MisfitsFunction = MisfitValuesFactoryNative(forwardSolver) \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/Point.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/Point.kt deleted file mode 100644 index 721d5441..00000000 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/Point.kt +++ /dev/null @@ -1,3 +0,0 @@ -package ru.nucodelabs.geo.ves.calc.graph - -data class Point(val x: Double, val y: Double) \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/VesCurvesFunctions.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/VesCurvesFunctions.kt index 32a37048..115b2da9 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/graph/VesCurvesFunctions.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/graph/VesCurvesFunctions.kt @@ -5,6 +5,7 @@ import ru.nucodelabs.geo.ves.Picket import ru.nucodelabs.geo.ves.calc.adapter.invoke import ru.nucodelabs.geo.ves.calc.resistanceApparentLowerBoundByError import ru.nucodelabs.geo.ves.calc.resistanceApparentUpperBoundByError +import ru.nucodelabs.util.Point class VesCurvesContext(val picket: Picket) { val experimentalCurve by lazy { diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolationDataParser.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolationDataParser.kt deleted file mode 100644 index 9ca040fc..00000000 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolationDataParser.kt +++ /dev/null @@ -1,19 +0,0 @@ -package ru.nucodelabs.geo.ves.calc.interpolation - -import javafx.scene.chart.XYChart - -interface InterpolationDataParser { - fun parse() - - fun getMissedPoints(): List>> - - fun getGrid(): List>> - - fun getGridX(): DoubleArray - fun getGridY(): DoubleArray - fun getGridF(): Array - - fun getX(): DoubleArray - fun getY(): DoubleArray - fun getF(): DoubleArray -} \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/Interpolator.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/Interpolator.kt index 9c8da896..a8f0dbf2 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/Interpolator.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/Interpolator.kt @@ -1,18 +1,18 @@ package ru.nucodelabs.geo.ves.calc.interpolation -import javafx.scene.chart.XYChart import org.apache.commons.math3.analysis.interpolation.BicubicInterpolatingFunction import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction +import ru.nucodelabs.util.Point import ru.nucodelabs.util.std.exp10 class Interpolator( - private var interpolationParser: InterpolationParser -): Interpolator2D { - private lateinit var grid: MutableList>> + private var interpolatorContext: InterpolatorContext +) : Interpolator2D { + private lateinit var grid: MutableList> - private lateinit var missedPoints: List>> + private lateinit var missedPoints: List> - private var adjustedGrid: MutableList>> = arrayListOf() + private var adjustedGrid: MutableList> = arrayListOf() private lateinit var bicubicInterpolatingFunction: BicubicInterpolatingFunction @@ -26,7 +26,7 @@ class Interpolator( init { initGrid() - interpolationParser.gridToLogValues(grid) + interpolatorContext.gridToLogValues(grid) adjustGrid() checkInterpolated() if (leftSideInterpolated) leftSideSplineFunction = interpolateSide(adjustedGrid[0]) @@ -52,13 +52,14 @@ class Interpolator( } else { -1.0 } + Side.MIDDLE -> exp10(bicubicInterpolatingFunction.value(x, y)) Side.RIGHT -> if (rightSideInterpolated) { - exp10(interpolateSidePoint(y, rightSideSplineFunction)) - } else { - -1.0 - } + exp10(interpolateSidePoint(y, rightSideSplineFunction)) + } else { + -1.0 + } } } @@ -68,42 +69,42 @@ class Interpolator( } private fun initGrid() { - grid = interpolationParser.getGrid() - missedPoints = interpolationParser.getMissedPoints() + grid = interpolatorContext.getGrid() + missedPoints = interpolatorContext.getMissedPoints() } private fun adjustGrid() { val spatialInterpolator: SpatialInterpolator = RBFSpatialInterpolator() spatialInterpolator.build( - interpolationParser.getX(), - interpolationParser.getY(), - interpolationParser.getF() + interpolatorContext.getX(), + interpolatorContext.getY(), + interpolatorContext.getF() ) - interpolationParser.copyData(grid, adjustedGrid) + interpolatorContext.copyData(grid, adjustedGrid) - val missedPoints = interpolationParser.getMissedPositions() + val missedPoints = interpolatorContext.getMissedPositions() for (point in missedPoints) { val xyPoint = adjustedGrid[point.first][point.second] - if (xyPoint.extraValue != -1.0) + if (xyPoint.z != -1.0) throw RuntimeException("Missed point value != -1") - val f = spatialInterpolator.interpolate(xyPoint.xValue, xyPoint.yValue) - adjustedGrid[point.first][point.second] = XYChart.Data(xyPoint.xValue, xyPoint.yValue, f) + val f = spatialInterpolator.interpolate(xyPoint.x, xyPoint.y) + adjustedGrid[point.first][point.second] = Point(xyPoint.x, xyPoint.y, f) } } private fun interpolateGrid() { - interpolationParser = InterpolationParser(adjustedGrid) + interpolatorContext = InterpolatorContext(adjustedGrid) val regularGridInterpolator = ApacheInterpolator2D() bicubicInterpolatingFunction = regularGridInterpolator.interpolate( - interpolationParser.getGridX(), - interpolationParser.getGridY(), - interpolationParser.getGridF() + interpolatorContext.getGridX(), + interpolatorContext.getGridY(), + interpolatorContext.getGridF() ) } - private fun interpolateSide(picket: List>): PolynomialSplineFunction { - val y: DoubleArray = picket.map { point -> point.yValue }.toDoubleArray() - val f: DoubleArray = picket.map { point -> point.extraValue as Double }.toDoubleArray() + private fun interpolateSide(picket: List): PolynomialSplineFunction { + val y: DoubleArray = picket.map { point -> point.y }.toDoubleArray() + val f: DoubleArray = picket.map { point -> point.z }.toDoubleArray() val interpolator1D: Interpolator1D = ApacheInterpolator1D() return interpolator1D.interpolate(y, f) @@ -114,9 +115,9 @@ class Interpolator( } private fun getRange(x: Double): Side { - if (x < adjustedGrid[0][0].xValue) + if (x < adjustedGrid[0][0].x) return Side.LEFT - if (x > adjustedGrid.last()[0].xValue) + if (x > adjustedGrid.last()[0].x) return Side.RIGHT return Side.MIDDLE } diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolationParser.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolatorContext.kt similarity index 61% rename from src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolationParser.kt rename to src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolatorContext.kt index b7747ac1..ab6a09d8 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolationParser.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/InterpolatorContext.kt @@ -1,9 +1,9 @@ package ru.nucodelabs.geo.ves.calc.interpolation -import javafx.scene.chart.XYChart +import ru.nucodelabs.util.Point import kotlin.math.log10 -class InterpolationParser (private val inputImmutableData: List>>) { +class InterpolatorContext(inputImmutableData: List>) { private lateinit var gridX: DoubleArray private lateinit var gridY: DoubleArray @@ -12,13 +12,13 @@ class InterpolationParser (private val inputImmutableData: List>> = arrayListOf() + private var inputData: MutableList> = arrayListOf() - private var missedPoints: MutableList>> = arrayListOf() + private var missedPoints: MutableList> = arrayListOf() private val uniquePoints: MutableList = arrayListOf() - private val grid: MutableList>> = arrayListOf() + private val grid: MutableList> = arrayListOf() private val missedPositions: MutableList> = arrayListOf() @@ -34,27 +34,27 @@ class InterpolationParser (private val inputImmutableData: List>>) { + fun gridToLogValues(grid: MutableList>) { for (picketIdx in grid.indices) { for (abIdx in grid[picketIdx].indices) { - if (grid[picketIdx][abIdx].extraValue as Double >= 0) - grid[picketIdx][abIdx].extraValue = log10(grid[picketIdx][abIdx].extraValue as Double) + val (x, y, z) = grid[picketIdx][abIdx] + if (z >= 0) grid[picketIdx][abIdx] = Point(x, y, log10(z)) } } } @@ -63,11 +63,11 @@ class InterpolationParser (private val inputImmutableData: List>>, listTo: MutableList>>) { + fun copyData(listFrom: List>, listTo: MutableList>) { for (picketIdx in listFrom.indices) { listTo.add(arrayListOf()) for (ab in listFrom[picketIdx]) { - listTo[picketIdx].add(XYChart.Data(ab.xValue, ab.yValue, ab.extraValue)) + listTo[picketIdx].add(ab.copy()) } } } @@ -76,7 +76,7 @@ class InterpolationParser (private val inputImmutableData: List= 0) { - if (missedPoints[picketIdx][abIdx].extraValue as Double != -1.0) + if (missedPoints[picketIdx][abIdx].z != -1.0) missedPoints[picketIdx].removeAt(abIdx) else missedPositions.add(Pair(picketIdx, abIdx)) @@ -92,9 +92,9 @@ class InterpolationParser (private val inputImmutableData: List e.yValue == ab}) - grid[picketIdx].add(XYChart.Data(inputData[picketIdx][0].xValue, ab, -1.0)) + if (!grid[picketIdx].any { e -> e.y == ab }) + grid[picketIdx].add(Point(inputData[picketIdx][0].x, ab, -1.0)) } - grid[picketIdx].sortBy { it.yValue } + grid[picketIdx].sortBy { it.y } } } private fun parseUnique() { for (picket in inputData) { for (ab in picket) { - if (!uniquePoints.contains(ab.yValue)) - uniquePoints.add(ab.yValue) + if (!uniquePoints.contains(ab.y)) + uniquePoints.add(ab.y) } } uniquePoints.sortBy { it } @@ -146,11 +146,11 @@ class InterpolationParser (private val inputImmutableData: List>> { + fun getMissedPoints(): MutableList> { return missedPoints } - fun getGrid(): MutableList>> { + fun getGrid(): MutableList> { return grid } } \ No newline at end of file diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/RBFSpatialInterpolator.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/RBFSpatialInterpolator.kt index adf17341..8966bcd1 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/RBFSpatialInterpolator.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/RBFSpatialInterpolator.kt @@ -1,8 +1,6 @@ package ru.nucodelabs.geo.ves.calc.interpolation import smile.interpolation.RBFInterpolation2D -import smile.math.rbf.GaussianRadialBasis -import smile.math.rbf.MultiquadricRadialBasis import smile.math.rbf.ThinPlateRadialBasis class RBFSpatialInterpolator: SpatialInterpolator { diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt index ec25dab2..d831cf56 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt @@ -1,5 +1,6 @@ package ru.nucodelabs.geo.ves.calc.interpolation +/* import org.tinfour.common.Vertex import org.tinfour.interpolation.IInterpolatorOverTin import org.tinfour.interpolation.TriangularFacetInterpolator @@ -22,3 +23,4 @@ class TinSpatialInterpolator: SpatialInterpolator { } } +*/ diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/InverseSolver.java b/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/InverseSolver.java index ad06e530..e86ef455 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/InverseSolver.java +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/InverseSolver.java @@ -13,7 +13,7 @@ import ru.nucodelabs.geo.target.RelativeErrorAwareTargetFunction; import ru.nucodelabs.geo.ves.ExperimentalData; import ru.nucodelabs.geo.ves.ModelLayer; -import ru.nucodelabs.geo.ves.calc.inverse.inverse_functions.FunctionValue; +import ru.nucodelabs.geo.ves.calc.inverse.func.FunctionValue; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/inverse_functions/FunctionValue.java b/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/func/FunctionValue.java similarity index 98% rename from src/main/java/ru/nucodelabs/geo/ves/calc/inverse/inverse_functions/FunctionValue.java rename to src/main/java/ru/nucodelabs/geo/ves/calc/inverse/func/FunctionValue.java index e43d499f..71465f6e 100644 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/inverse_functions/FunctionValue.java +++ b/src/main/java/ru/nucodelabs/geo/ves/calc/inverse/func/FunctionValue.java @@ -1,4 +1,4 @@ -package ru.nucodelabs.geo.ves.calc.inverse.inverse_functions; +package ru.nucodelabs.geo.ves.calc.inverse.func; import org.apache.commons.math3.analysis.MultivariateFunction; import ru.nucodelabs.geo.forward.ForwardSolver; diff --git a/src/test/java/ru/nucodelabs/gem/file/dto/mapper/DtoMapperTest.java b/src/test/java/ru/nucodelabs/gem/file/dto/mapper/DtoMapperTest.java index 26125abc..f4d3c909 100644 --- a/src/test/java/ru/nucodelabs/gem/file/dto/mapper/DtoMapperTest.java +++ b/src/test/java/ru/nucodelabs/gem/file/dto/mapper/DtoMapperTest.java @@ -11,7 +11,8 @@ import ru.nucodelabs.geo.anisotropy.Point; import ru.nucodelabs.geo.anisotropy.Signal; import ru.nucodelabs.geo.anisotropy.Signals; -import ru.nucodelabs.geo.ves.DefaultValuesKt; +import ru.nucodelabs.geo.ves.ExperimentalData; +import ru.nucodelabs.geo.ves.Picket; import ru.nucodelabs.geo.ves.calc.VesKt; import java.util.List; @@ -50,7 +51,7 @@ void fromDto() { 1.0, 1.0, resistanceApparent, - DefaultValuesKt.DEFAULT_ERROR, + ExperimentalData.DEFAULT_ERROR, false ), dtoMapper.fromDto(signalDto) @@ -101,15 +102,15 @@ void testFromDto() { amperage, voltage, resistanceApparent, - DefaultValuesKt.DEFAULT_ERROR, + ExperimentalData.DEFAULT_ERROR, false ) )) ) ), List.of(), - DefaultValuesKt.DEFAULT_PICKET_Z, - DefaultValuesKt.DEFAULT_PICKET_COMMENT + Picket.DEFAULT_Z, + Picket.DEFAULT_COMMENT ); assertEquals(expected, dtoMapper.fromDto(pointDto)); From b3a54d313c36e11c502d9a679d06899071888249 Mon Sep 17 00:00:00 2001 From: Vadim Mostovoy Date: Mon, 1 Sep 2025 12:39:08 +0700 Subject: [PATCH 2/2] Remove Tinfour unused dependency --- build.gradle | 1 - .../interpolation/TinSpatialInterpolator.kt | 26 ---------- .../ru/nucodelabs/algorithms/RBFTest.java | 48 ------------------- .../ru/nucodelabs/algorithms/TinTest.java | 28 ----------- 4 files changed, 103 deletions(-) delete mode 100644 src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt delete mode 100644 src/test/java/ru/nucodelabs/algorithms/TinTest.java diff --git a/build.gradle b/build.gradle index 8c47b270..3da6266a 100644 --- a/build.gradle +++ b/build.gradle @@ -117,7 +117,6 @@ dependencies { implementation group: "org.apache.commons", name: "commons-math3", version: "3.6.1" implementation group: "com.google.inject", name: "guice", version: guiceVersion - implementation group: "org.tinfour", name: "TinfourCore", version: "2.1.8" implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion" implementation "org.apache.commons:commons-collections4:4.4" diff --git a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt b/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt deleted file mode 100644 index d831cf56..00000000 --- a/src/main/java/ru/nucodelabs/geo/ves/calc/interpolation/TinSpatialInterpolator.kt +++ /dev/null @@ -1,26 +0,0 @@ -package ru.nucodelabs.geo.ves.calc.interpolation - -/* -import org.tinfour.common.Vertex -import org.tinfour.interpolation.IInterpolatorOverTin -import org.tinfour.interpolation.TriangularFacetInterpolator -import org.tinfour.standard.IncrementalTin - -class TinSpatialInterpolator: SpatialInterpolator { - - private lateinit var inTri: IInterpolatorOverTin - - override fun interpolate(x: Double, y: Double): Double { - return inTri.interpolate(x, y, null) - } - - override fun build(x: DoubleArray, y: DoubleArray, f: DoubleArray) { - val tin = IncrementalTin() - for (i in x.indices) { - tin.add(Vertex(x[i], y[i], f[i])) - } - inTri = TriangularFacetInterpolator(tin) - } - -} -*/ diff --git a/src/test/java/ru/nucodelabs/algorithms/RBFTest.java b/src/test/java/ru/nucodelabs/algorithms/RBFTest.java index 909f7599..51cc5a6e 100644 --- a/src/test/java/ru/nucodelabs/algorithms/RBFTest.java +++ b/src/test/java/ru/nucodelabs/algorithms/RBFTest.java @@ -1,9 +1,6 @@ package ru.nucodelabs.algorithms; import org.junit.jupiter.api.Test; -import org.tinfour.common.Vertex; -import org.tinfour.interpolation.TriangularFacetInterpolator; -import org.tinfour.standard.IncrementalTin; import smile.interpolation.RBFInterpolation2D; import smile.math.rbf.GaussianRadialBasis; import smile.math.rbf.MultiquadricRadialBasis; @@ -61,49 +58,4 @@ public void test2() { double value = interpolation2D.interpolate(25.0, 500.0); System.out.println(value); } - - @Test - public void test3() { - double[] x1 = {1.5, 2.0, 3.0, 4.0, 5.0, 7.0, 9.0, 12.0, 15.0, 15.0, 20.0, 20.0, 32.0, 40.0, 50.0, 65.0, 65.0, 80.0, 80.0, 100.0, 123.0, 1.5, 2.0, 3.0, 4.0, 5.0, 7.0, 9.0, 12.0, 15.0, 15.0, 20.0, 20.0, 25.0, 32.0, 40.0, 50.0, 65.0, 65.0, 80.0, 80.0, 100.0, 123.0, 1.5, 2.0, 3.0, 4.0, 5.0, 7.0, 9.0, 12.0, 15.0, 15.0, 20.0, 20.0, 25.0, 32.0, 40.0, 50.0, 65.0, 65.0, 80.0, 80.0, 100.0, 123.0}; - double[] x2 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 200.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0, 300.0}; - double[] y = {135.01, 130.3, 151.19, 158.34, 169.54, 159.71, 142.06, 142.71, 124.9, 125.4, 142.92, 128.77, 116.4, 106.52, 103.02, 103.23, 96.156, 107.29, 100.73, 113.53, 125.54, 221.09, 163.79, 166.89, 170.74, 179.45, 176.85, 167.28, 143.03, 130.18, 130.5, 123.0, 122.67, 110.11, 105.11, 95.513, 95.813, 95.723, 95.723, 97.983, 100.57, 114.42, 131.75, 138.98, 137.74, 162.18, 173.18, 179.36, 169.39, 159.82, 139.85, 120.48, 117.94, 109.26, 98.269, 94.793, 92.366, 92.135, 96.517, 99.337, 99.337, 123.81, 127.55, 139.81, 161.68}; - - List listX1 = new ArrayList<>(); - for (var d:x1) { - listX1.add(d); - } - List listX2 = new ArrayList<>(); - for (var d:x2) { - listX2.add(d); - } - List listY = new ArrayList<>(); - for (var d:y) { - listY.add(d); - } - - for (int i = 0; i < listX1.size() - 1; i++) { - if (Objects.equals(listX1.get(i), listX1.get(i + 1))) { - listX1.remove(i); - listX2.remove(i); - listY.remove(i); - } - } - - //25, 0, 116.78 - - double[] nx1 = listX1.stream().mapToDouble(Double::doubleValue).toArray(); - double[] nx2 = listX2.stream().mapToDouble(Double::doubleValue).toArray(); - double[] ny = listY.stream().mapToDouble(Double::doubleValue).toArray(); - - IncrementalTin tin = new IncrementalTin(1.0); - - for (int i = 0; i < listX1.size(); i++) { - Vertex vertex = new Vertex(listX1.get(i), listX2.get(i), listY.get(i)); - tin.add(vertex); - } - - TriangularFacetInterpolator inTri = new TriangularFacetInterpolator(tin); - double value = inTri.interpolate(25, 0.0, null); - System.out.println(value); - } } diff --git a/src/test/java/ru/nucodelabs/algorithms/TinTest.java b/src/test/java/ru/nucodelabs/algorithms/TinTest.java deleted file mode 100644 index 68df7725..00000000 --- a/src/test/java/ru/nucodelabs/algorithms/TinTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.nucodelabs.algorithms; - -import org.junit.jupiter.api.Test; -import org.tinfour.common.Vertex; -import org.tinfour.interpolation.TriangularFacetInterpolator; -import org.tinfour.standard.IncrementalTin; - -public class TinTest { - @Test - public void test1() { - Vertex v1 = new Vertex(0.0, 0.0, 100); - Vertex v2 = new Vertex(0.0, 1.0, 100); - Vertex v3 = new Vertex(1.0, 0.0, 100); - Vertex v4 = new Vertex(1.0, 1.0, 100); - Vertex v5 = new Vertex(10.0, 10.0, 500); - - IncrementalTin tin = new IncrementalTin(1.0); - tin.add(v1); - tin.add(v2); - tin.add(v3); - tin.add(v4); - tin.add(v5); - TriangularFacetInterpolator inTri = new TriangularFacetInterpolator(tin); - - double value = inTri.interpolate(2.5, 2.5, null); - System.out.println(value); - } -}