package Ġcom . ro che . amb ass ador . model Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonIgnore Ċ import Ġcom . fasterxml . jackson . annotation . JsonInclude Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Order Ċ import Ġcom . ro che . amb ass ador . model . project . Project Ċ import Ġcom . ro che . amb ass ador . model . score . Score Builder Ċ import Ġjava . util .* Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . util . stream . Stream Ċ Ċ interface ĠScore Ġ: ĠSpecification , ĠEx plain able Ġ{ ĊĊĠĠĠ Ġfun Ġvalue (): ĠDouble ĊĠĠĠ Ġfun Ġfeatures (): ĠSet < Feature <* >> ĊĠĠĠ Ġfun Ġsub Scores (): ĠSet < Score > ĊĊĠĠĠ Ġfun Ġis Experimental (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġfun Ġis Composite (): ĠBoolean Ġ= Ġsub Scores (). isNotEmpty () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNavigate Ġthrough Ġall Ġsub scores Ġtree Ġto Ġextract Ġall Ġfeatures ĊĠĠĠĠ Ġ* Ġparticip ating Ġin Ġfinal Ġscore ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġfun Ġall Features (): ĠSet < Feature <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStream . concat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeatures (). stream (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Scores () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . all Features (). stream () Ġ} ĊĠĠĠĠĠĠĠ Ġ). collect ( Collectors . to Un modifiable Set ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNavigate Ġthrough Ġall Ġsub scores Ġtree Ġto Ġextract Ġall Ġscores ĊĠĠĠĠ Ġ* Ġparticip ating Ġin Ġfinal Ġscore ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġfun Ġall Sub Scores (): ĠSet < Score > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStream . concat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Scores (). stream (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Scores () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . all Sub Scores (). stream () Ġ} ĊĠĠĠĠĠĠĠ Ġ). collect ( Collectors . to Un modifiable Set ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġzip ( name : ĠString , Ġfirst : ĠScore , Ġsecond : ĠScore , Ġzip per : Ġ( Double , ĠDouble , ĠEx planation . Builder ) Ġ-> ĠDouble ): ĠScore Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexplanation Builder Ġ= ĠEx planation . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġzip per . invoke ( first . value (), Ġsecond . value (), Ġexplanation Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexplanation Ġ= Ġexplanation Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomposite ( name , Ġvalue , Ġmutable Set Of ( first , Ġsecond ), Ġfirst . is Experimental () Ġ|| Ġsecond . is Experimental (), Ġexplanation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuilder ( name : ĠString , Ġproject : ĠProject , Ġexperimental : ĠBoolean Ġ= Ġfalse , Ġinitial Score : ĠDouble Ġ= Ġ 0 . 0 ): ĠScore Builder . Parent Score Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠScore Builder . Parent Score Builder ( name , Ġproject , Ġinitial Score , Ġexperimental ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcomposite ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Scores : ĠMutable Set < Score >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexperimental : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexplanation : ĠEx planation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠScore Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComposite Score ( name , Ġvalue , Ġsub Scores , Ġexperimental , Ġexplanation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfinal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeatures : ĠSet < Feature <* >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Scores : ĠSet < Score >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexperimental : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexplanation : ĠEx planation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠScore Ġ= Ġfinal With Names ( name , Ġvalue , Ġfeatures , Ġfeatures . map Ġ{ Ġit . name () Ġ}. toSet (), Ġsub Scores , Ġexperimental , Ġexplanation ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġfinal With Names ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeatures : ĠSet < Feature <* >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Names : ĠSet < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Scores : ĠSet < Score >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexperimental : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexplanation : ĠEx planation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠScore Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFinal Score ( name , Ġvalue , Ġfeatures . toSet (), Ġfeature Names , Ġsub Scores , Ġexperimental , Ġexplanation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ JsonProperty Order (" name ", Ġ" value ") Ċ @ JsonInclude ( JsonInclude . Include . NON _ EMPTY ) Ċ internal Ġdata Ġclass ĠComposite Score ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġvalue : ĠDouble , ĊĠĠĠ Ġval Ġsub Scores : ĠMutable Set < Score >, ĊĠĠĠ Ġval Ġexperimental : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval Ġexplanation : ĠEx planation ? Ġ= Ġnull Ċ ) Ġ: ĠAbstract Score ( name , Ġset Of (), Ġsub Scores , Ġexperimental , Ġexplanation ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvalue (): ĠDouble Ġ= Ġvalue Ċ } Ċ Ċ @ JsonProperty Order (" name ", Ġ" value ") Ċ @ JsonInclude ( JsonInclude . Include . NON _ EMPTY ) Ċ internal Ġdata Ġclass ĠFinal Score ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġvalue : ĠDouble , ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġval Ġfeatures : ĠSet < Feature <* >>, ĊĠĠĠ Ġ@ JsonProperty (" features ") ĊĠĠĠ Ġval Ġfeature Names : ĠSet < String >, ĊĠĠĠ Ġval Ġsub Scores : ĠSet < Score >, ĊĠĠĠ Ġval Ġexperimental : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġval Ġexplanation : ĠEx planation ? Ġ= Ġnull Ċ ) Ġ: ĠAbstract Score ( name , Ġfeatures , Ġsub Scores , Ġexperimental , Ġexplanation ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġvalue (): ĠDouble Ġ= Ġvalue Ċ } Ċ Ċ @ JsonInclude ( JsonInclude . Include . NON _ EMPTY ) Ċ abstract Ġclass ĠAbstract Score ( ĊĠĠĠ Ġprivate Ġval Ġname : ĠString , ĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġprivate Ġval Ġfeatures : ĠSet < Feature <* >> Ġ= Ġset Of (), ĊĠĠĠ Ġprivate Ġval Ġsub Scores : ĠSet < Score > Ġ= Ġset Of (), ĊĠĠĠ Ġprivate Ġval Ġexperimental : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġexplanation : ĠEx planation Ġ? Ġ= Ġnull Ċ ) Ġ: ĠScore Ġ{ ĊĊĠĠĠ Ġ@ JsonIgnore ĊĠĠĠ Ġoverride Ġfun Ġfeatures () Ġ= Ġfeatures ĊĊĠĠĠ Ġoverride Ġfun Ġsub Scores () Ġ= Ġsub Scores ĊĊĠĠĠ Ġoverride Ġfun Ġname () Ġ= Ġname ĊĊĠĠĠ Ġoverride Ġfun Ġexplain (): ĠEx planation Ġ= Ġexplanation Ġ?: ĠEx planation . empty () ĊĊĠĠĠ Ġoverride Ġfun Ġis Experimental (): ĠBoolean Ġ= Ġexperimental ĊĊĠĠĠ Ġfun Ġget Sub Score ByName ( name : ĠString ): ĠOptional < Score > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOptional . of Nullable ( sub Scores . first OrNull Ġ{ Ġit . name (). equals ( name , Ġignore Case Ġ= Ġtrue ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sub Score Value ByName Or Zero ( name : ĠString ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Sub Score ByName ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . value () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Get Ġ{ Ġ 0 . 0 Ġ} ĊĠĠĠ Ġ} Ċ } Ċ