@@ -13,7 +13,7 @@ use segment::data_types::index::{
1313} ;
1414use segment:: data_types:: { facets as segment_facets, vectors as segment_vectors} ;
1515use segment:: index:: query_optimization:: rescore_formula:: parsed_formula:: {
16- ParsedExpression , ParsedFormula ,
16+ DecayKind , ParsedExpression , ParsedFormula ,
1717} ;
1818use segment:: types:: { DateTimePayloadType , FloatPayloadType , default_quantization_ignore_value} ;
1919use segment:: vector_storage:: query as segment_query;
@@ -50,7 +50,9 @@ use crate::grpc::qdrant::{
5050 TextIndexParams , TokenizerType , UpdateResult , UpdateResultInternal , ValuesCount ,
5151 VectorsSelector , WithPayloadSelector , WithVectorsSelector , shard_key, with_vectors_selector,
5252} ;
53- use crate :: grpc:: { DivExpression , GeoDistance , MultExpression , PowExpression , SumExpression } ;
53+ use crate :: grpc:: {
54+ DecayParamsExpression , DivExpression , GeoDistance , MultExpression , PowExpression , SumExpression ,
55+ } ;
5456use crate :: rest:: models:: { CollectionsResponse , VersionInfo } ;
5557use crate :: rest:: schema as rest;
5658
@@ -2780,14 +2782,14 @@ impl Formula {
27802782}
27812783
27822784fn unparse_expression (
2783- formula : ParsedExpression ,
2785+ expression : ParsedExpression ,
27842786 conditions : & Vec < segment:: types:: Condition > ,
27852787) -> Expression {
27862788 use segment:: index:: query_optimization:: rescore_formula:: parsed_formula:: VariableId ;
27872789
27882790 use super :: expression:: Variant ;
27892791
2790- let variant = match formula {
2792+ let variant = match expression {
27912793 ParsedExpression :: Constant ( c) => Variant :: Constant ( c) ,
27922794 ParsedExpression :: Variable ( variable_id) => match variable_id {
27932795 var_id @ VariableId :: Score ( _) => Variant :: Variable ( var_id. unparse ( ) ) ,
@@ -2841,9 +2843,66 @@ fn unparse_expression(
28412843 origin : Some ( GeoPoint :: from ( origin) ) ,
28422844 to : key. to_string ( ) ,
28432845 } ) ,
2846+ ParsedExpression :: Decay {
2847+ kind,
2848+ target,
2849+ lambda,
2850+ x,
2851+ } => {
2852+ let ( midpoint, scale) = decay_lambda_to_params ( lambda, kind) ;
2853+ let params = DecayParamsExpression {
2854+ x : Some ( Box :: new ( unparse_expression ( * x, conditions) ) ) ,
2855+ target : target. map ( |t| Box :: new ( unparse_expression ( * t, conditions) ) ) ,
2856+ midpoint : Some ( midpoint) ,
2857+ scale : Some ( scale) ,
2858+ } ;
2859+ match kind {
2860+ DecayKind :: Lin => Variant :: LinDecay ( Box :: new ( params) ) ,
2861+ DecayKind :: Exp => Variant :: ExpDecay ( Box :: new ( params) ) ,
2862+ DecayKind :: Gauss => Variant :: GaussDecay ( Box :: new ( params) ) ,
2863+ }
2864+ }
28442865 } ;
28452866
28462867 Expression {
28472868 variant : Some ( variant) ,
28482869 }
28492870}
2871+
2872+ /// Converts the already computed lambda value to parameters which will result in
2873+ /// the same lambda when used in a decay function on the peer node.
2874+ ///
2875+ /// Returns a tuple of (midpoint, scale) parameters.
2876+ fn decay_lambda_to_params ( lambda : f32 , kind : DecayKind ) -> ( f32 , f32 ) {
2877+ // We assume lambda is in the range (0, 1)
2878+ debug_assert ! ( 0.0 < lambda && lambda < 1.0 ) ;
2879+ match kind {
2880+ // Linear lambda is (1.0 - midpoint) / scale,
2881+ // setting scale to 1.0 allows us to ignore the division,
2882+ // and only set the midpoint to some value.
2883+ //
2884+ // (1.0 - midpoint) / 1.0 = lambda
2885+ // 1.0 - midpoint = lambda
2886+ // midpoint = 1.0 - lambda
2887+ DecayKind :: Lin => ( ( -lambda + 1.0 ) , 1.0 ) ,
2888+
2889+ // Gauss lambda is scale^2 / ln(midpoint)
2890+ // setting midpoint to e allows us to ignore the division, since ln(e) = 1
2891+ // Then we set scale to sqrt(lambda)
2892+ //
2893+ // scale^2 / ln(e) = lambda
2894+ // scale^2 / 1.0 = lambda
2895+ // scale^2 = lambda
2896+ // scale = sqrt(lambda)
2897+ DecayKind :: Gauss => ( std:: f32:: consts:: E , lambda. sqrt ( ) ) ,
2898+
2899+ // Exponential lambda is ln(midpoint) / scale
2900+ // setting midpoint to e allows us to ignore the division, since ln(e) = 1
2901+ // Then we set scale to 1 / lambda
2902+ //
2903+ // ln(e) / scale = lambda
2904+ // 1.0 / scale = lambda
2905+ // scale = 1.0 / lambda
2906+ DecayKind :: Exp => ( std:: f32:: consts:: E , 1.0 / lambda) ,
2907+ }
2908+ }
0 commit comments