def _get_pareto_front_2d( study: MultiObjectiveStudy, names: Optional[List[str]], include_dominated_trials: bool = False) -> "go.Figure": if names is None: names = ["Objective 0", "Objective 1"] elif len(names) != 2: raise ValueError("The length of `names` is supposed to be 2.") trials = study.get_pareto_front_trials() if len(trials) == 0: _logger.warning("Your study does not have any completed trials.") point_colors = ["blue"] * len(trials) if include_dominated_trials: non_pareto_trials = _get_non_pareto_front_trials(study, trials) point_colors += ["red"] * len(non_pareto_trials) trials += non_pareto_trials data = go.Scatter( x=[t.values[0] for t in trials], y=[t.values[1] for t in trials], text=[_make_hovertext(t) for t in trials], mode="markers", hovertemplate="%{text}<extra></extra>", marker={"color": point_colors}, ) layout = go.Layout(title="Pareto-front Plot", xaxis_title=names[0], yaxis_title=names[1]) return go.Figure(data=data, layout=layout)
def _get_pareto_front_3d(study: MultiObjectiveStudy, names: Optional[List[str]]) -> "go.Figure": if names is None: names = ["Objective 0", "Objective 1", "Objective 2"] elif len(names) != 3: raise ValueError("The length of `names` is supposed to be 3.") trials = study.get_pareto_front_trials() if len(trials) == 0: _logger.warning("Your study does not have any completed trials.") data = go.Scatter3d( x=[t.values[0] for t in trials], y=[t.values[1] for t in trials], z=[t.values[2] for t in trials], text=[_make_hovertext(t) for t in trials], mode="markers", hovertemplate="%{text}<extra></extra>", ) layout = go.Layout( title="Pareto-front Plot", scene={ "xaxis_title": names[0], "yaxis_title": names[1], "zaxis_title": names[2] }, ) return go.Figure(data=data, layout=layout)
def _get_pareto_front_3d( study: MultiObjectiveStudy, names: Optional[List[str]], include_dominated_trials: bool = False, axis_order: Optional[List[int]] = None, ) -> "go.Figure": if names is None: names = ["Objective 0", "Objective 1", "Objective 2"] elif len(names) != 3: raise ValueError("The length of `names` is supposed to be 3.") trials = study.get_pareto_front_trials() if len(trials) == 0: _logger.warning("Your study does not have any completed trials.") point_colors = ["blue"] * len(trials) if include_dominated_trials: non_pareto_trials = _get_non_pareto_front_trials(study, trials) point_colors += ["red"] * len(non_pareto_trials) trials += non_pareto_trials if axis_order is None: axis_order = list(range(3)) else: if len(axis_order) != 3: raise ValueError( f"Size of `axis_order` {axis_order}. Expect: 3, Actual: {len(axis_order)}." ) if len(set(axis_order)) != 3: raise ValueError(f"Elements of given `axis_order` {axis_order} are not unique!.") if max(axis_order) > 2: raise ValueError( f"Given `axis_order` {axis_order} contains invalid index {max(axis_order)} " "higher than 2." ) if min(axis_order) < 0: raise ValueError( f"Given `axis_order` {axis_order} contains invalid index {min(axis_order)} " "lower than 0." ) data = go.Scatter3d( x=[t.values[axis_order[0]] for t in trials], y=[t.values[axis_order[1]] for t in trials], z=[t.values[axis_order[2]] for t in trials], text=[_make_hovertext(t) for t in trials], mode="markers", hovertemplate="%{text}<extra></extra>", marker={"color": point_colors}, ) layout = go.Layout( title="Pareto-front Plot", scene={ "xaxis_title": names[axis_order[0]], "yaxis_title": names[axis_order[1]], "zaxis_title": names[axis_order[2]], }, ) return go.Figure(data=data, layout=layout)
def from_study(study: MultiObjectiveStudy): return MultiObjectiveResults(study.get_pareto_front_trials(), study.trials)