code: def get_annotation_sufficiency(
              self,
              profile: List[str],
              negated_classes: List[str],
              categories: Optional[List] = None,
              negation_weight: Optional[float] = .25,
              category_weight: Optional[float] = .5) -> AnnotationSufficiency:
          
  
          if categories is None:
              categories = [enum.value for enum in HpoUpperLevel]
          ic_map = self.ic_store.get_profile_ic(profile + negated_classes)
  
          # Simple score is the weighted average of the present and
          # explicitly stated negative/absent phenotypes
          #
          # Note that we're deviating from the publication
          # to match the reference java implementation where
          # mean_max_ic is replaced with max_max_ic:
          # https://github.com/owlcollab/owltools/blob/452b4a/
          # OWLTools-Sim/src/main/java/owltools/sim2/AbstractOwlSim.java#L1038
          simple_score = self._get_simple_score(
              profile, negated_classes, self.ic_store.statistics.mean_mean_ic,
              self.ic_store.statistics.max_max_ic, self.ic_store.statistics.mean_sum_ic,
              negation_weight, ic_map
          )
  
          categorical_score = self._get_categorical_score(
              profile, negated_classes, categories,
              negation_weight, ic_map
          )
          scaled_score = self._get_scaled_score(
              simple_score, categorical_score, category_weight)
  
          return AnnotationSufficiency(
              simple_score=simple_score,
              scaled_score=scaled_score,
              categorical_score=categorical_score
          )
docs: Given a list of individuals, return the simple, scaled, and categorical scores