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:
        """
        Given a list of individuals, return the simple, scaled, and categorical scores
        """

        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
        )
Given a list of individuals, return the simple, scaled, and categorical scores