From edb40a80afcdf9a6e58daec9f50ea9a009d9a2ba Mon Sep 17 00:00:00 2001 From: Ralph Gasser Date: Mon, 25 Mar 2024 10:48:26 +0100 Subject: [PATCH] Fixes compilation error. --- .../sphericalharmonics/SphericalHarmonics.kt | 20 ++++++++++++++++--- .../SphericalHarmonicsRetriever.kt | 8 +++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonics.kt b/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonics.kt index efbbca92..e0718e9c 100644 --- a/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonics.kt +++ b/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonics.kt @@ -12,6 +12,9 @@ import org.vitrivr.engine.core.model.descriptor.vector.FloatVectorDescriptor import org.vitrivr.engine.core.model.mesh.Mesh import org.vitrivr.engine.core.model.metamodel.Analyser import org.vitrivr.engine.core.model.metamodel.Schema +import org.vitrivr.engine.core.model.query.Query +import org.vitrivr.engine.core.model.query.basics.Distance +import org.vitrivr.engine.core.model.query.proximity.ProximityQuery import org.vitrivr.engine.core.model.retrievable.Retrievable import org.vitrivr.engine.core.model.types.Value import org.vitrivr.engine.core.operators.Operator @@ -75,18 +78,29 @@ class SphericalHarmonics: Analyser { override fun newRetrieverForContent(field: Schema.Field, content: Collection, context: QueryContext): Retriever { require(field.analyser == this) { "The field '${field.fieldName}' analyser does not correspond with this analyser. This is a programmer's error!" } + + /* Extract parameters from field and context. */ val mesh = content.first().content.getMaterials().first().meshes.first() val gridSize = field.parameters[GRID_SIZE_PARAMETER_NAME]?.toIntOrNull() ?: GRID_SIZE_PARAMETER_DEFAULT val cap = field.parameters[CAP_PARAMETER_NAME]?.toIntOrNull() ?: CAP_PARAMETER_DEFAULT val minL = field.parameters[MINL_PARAMETER_NAME]?.toIntOrNull() ?: MINL_PARAMETER_DEFAULT val maxL = field.parameters[MAXL_PARAMETER_NAME]?.toIntOrNull() ?: MAXL_PARAMETER_DEFAULT val descriptor = this.analyse(mesh, gridSize, cap, minL, maxL) - return SphericalHarmonicsRetriever(field, descriptor, context) + val k = context.getProperty(field.fieldName, "limit")?.toIntOrNull() ?: 1000 //TODO get limit + val returnDescriptor = context.getProperty(field.fieldName, "returnDescriptor")?.toBooleanStrictOrNull() ?: false + + /* Construct query. */ + val query = ProximityQuery(value = descriptor.vector, k = k, distance = Distance.EUCLIDEAN, fetchVector = returnDescriptor) + return SphericalHarmonicsRetriever(field, query, context) } - override fun newRetrieverForDescriptors(field: Schema.Field, descriptors: Collection, context: QueryContext): Retriever { + override fun newRetrieverForQuery(field: Schema.Field, query: Query, context: QueryContext): Retriever { require(field.analyser == this) { "The field '${field.fieldName}' analyser does not correspond with this analyser. This is a programmer's error!" } - return SphericalHarmonicsRetriever(field, descriptors.first(), context) + require(query is ProximityQuery<*> && query.value.first() is Value.Float) { } + + /* Construct query. */ + @Suppress("UNCHECKED_CAST") + return SphericalHarmonicsRetriever(field, query as ProximityQuery, context) } override fun newExtractor(field: Schema.Field, input: Operator, context: IndexContext, persisting: Boolean, parameters: Map): SphericalHarmonicsExtractor { diff --git a/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonicsRetriever.kt b/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonicsRetriever.kt index 50d97b0a..a7881811 100644 --- a/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonicsRetriever.kt +++ b/vitrivr-engine-module-m3d/src/main/kotlin/org/vitrivr/engine/model3d/features/sphericalharmonics/SphericalHarmonicsRetriever.kt @@ -23,7 +23,7 @@ import org.vitrivr.engine.core.operators.retrieve.Retriever * @author Ralph Gasser * @version 1.0.0 */ -class SphericalHarmonicsRetriever(override val field: Schema.Field, private val query: FloatVectorDescriptor, private val context: QueryContext) : Retriever { +class SphericalHarmonicsRetriever(override val field: Schema.Field, private val query: ProximityQuery<*>, private val context: QueryContext) : Retriever { companion object { private const val MAXIMUM_DISTANCE = 1.0f fun scoringFunction(retrieved: Retrieved) : Float { @@ -33,12 +33,10 @@ class SphericalHarmonicsRetriever(override val field: Schema.Field { - val k = this.context.getProperty(this.field.fieldName, "limit")?.toIntOrNull() ?: 1000 //TODO get limit - val returnDescriptor = this.context.getProperty(this.field.fieldName, "returnDescriptor")?.toBooleanStrictOrNull() ?: false + val reader = this.field.getReader() - val query = ProximityQuery(value = this.query.vector, k = k, distance = Distance.EUCLIDEAN, fetchVector = returnDescriptor) return flow { - reader.getAll(query).forEach { + reader.getAll(this@SphericalHarmonicsRetriever.query).forEach { it.addAttribute(ScoreAttribute(scoringFunction(it))) emit(it) }