def METHOD_NAME(self, shareable: Shareable, client_ids: list, fl_ctx: FLContext) -> ModelLearnable:
    """Convert Shareable to ModelLearnable.
    Supporting TYPE == TYPE_WEIGHT_DIFF or TYPE_WEIGHTS
    Args:
        shareable (Shareable): Shareable that contains a DXO object
        client_ids: client id list for getting the personalized models
        fl_ctx (FLContext): FL context
    Returns:
        A ModelLearnable object
    Raises:
        TypeError: if shareable is not of type shareable
        ValueError: if data_kind is not `DataKind.WEIGHTS` and is not `DataKind.WEIGHT_DIFF`
    """
    if not isinstance(shareable, Shareable):
        raise TypeError(f"shareable must be Shareable, but got {type(shareable)}.")
    # base_model_set is a "flattened set", containing all models with ids
    # "select_weights", "select_exp_avg", "select_exp_avg_sq", "global_weights", and client_ids
    base_model_set = fl_ctx.get_prop(AppConstants.GLOBAL_MODEL)["weights"]
    meta = fl_ctx.get_prop(AppConstants.GLOBAL_MODEL)["meta"]
    if not base_model_set:
        self.system_panic(reason="No FedSM base model set!", fl_ctx=fl_ctx)
        return base_model_set
    # dxo from aggregator is hierarchically organized as ["select_weights", "global_weights", "person_weights"]
    # "global_weights" is a dxo for global model
    # "person_weights" is a dxo collection containing dxo for each client_id
    # "select_weights" is a dxo collection containing dxo for ["select_weights", "exp_avg", "exp_avg_sq"]
    dxo = from_shareable(shareable)
    dxo_global = dxo.data.get("global_weights")
    self.update_single_model(dxo_global, base_model_set, "global_weights", fl_ctx)
    dxo_person = dxo.data.get("person_weights")
    for model_id in client_ids:
        dxo_single = dxo_person.get(model_id)
        self.update_single_model(dxo_single, base_model_set, model_id, fl_ctx)
    dxo_select = dxo.data.get("select_weights")
    for model_id in ["select_weights", "select_exp_avg", "select_exp_avg_sq"]:
        dxo_single = dxo_select.get(model_id)
        self.update_single_model(dxo_single, base_model_set, model_id, fl_ctx)
    model_set = make_model_learnable(base_model_set, meta)
    return model_set