Skip to content

results

results

Result compilation for Safe Synthesizer pipeline runs.

Assembles generation output, evaluation scores, and timing into the SafeSynthesizerResults and SafeSynthesizerSummary containers consumed by the SDK and CLI.

Functions:

Name Description
make_nss_summary

Build a pipeline summary from timing, generation results, and evaluation.

make_nss_results

Build the final pipeline results container.

make_nss_summary(timing, results=None, report=None)

Build a pipeline summary from timing, generation results, and evaluation.

Extracts evaluation scores from report when available. If report is None (e.g. PII-only mode), all scores default to None.

Parameters:

Name Type Description Default
timing SafeSynthesizerTiming

Wall-clock timing breakdown for the pipeline.

required
results GenerateJobResults | DataFrame | None

Generation output -- a GenerateJobResults with record counts, or a raw DataFrame, or None.

None
report MultimodalReport | None

Evaluation report containing component scores.

None

Returns:

Type Description
SafeSynthesizerSummary

A populated SafeSynthesizerSummary.

Source code in src/nemo_safe_synthesizer/results.py
def make_nss_summary(
    timing: SafeSynthesizerTiming,
    results: GenerateJobResults | pd.DataFrame | None = None,
    report: MultimodalReport | None = None,
) -> SafeSynthesizerSummary:
    """Build a pipeline summary from timing, generation results, and evaluation.

    Extracts evaluation scores from ``report`` when available. If ``report``
    is ``None`` (e.g. PII-only mode), all scores default to ``None``.

    Args:
        timing: Wall-clock timing breakdown for the pipeline.
        results: Generation output -- a ``GenerateJobResults`` with record
            counts, or a raw ``DataFrame``, or ``None``.
        report: Evaluation report containing component scores.

    Returns:
        A populated ``SafeSynthesizerSummary``.
    """
    gen_fields: dict[str, Any] = {}
    if isinstance(results, GenerateJobResults):
        gen_fields = {field: getattr(results, field) for field in _GENERATE_RESULT_FIELDS}
        completion_tokens = gen_fields["num_completion_tokens"]
        valid_record_tokens = gen_fields["num_valid_record_tokens"]
        if completion_tokens and valid_record_tokens is not None:
            gen_fields["valid_record_token_fraction"] = valid_record_tokens / completion_tokens

    # None when ``report`` is missing (e.g. PII-only mode without evaluation).
    report_scores: dict[str, Any] = {
        field: report.get_score_by_name(name) if report is not None else None
        for field, name in _REPORT_SCORE_FIELDS.items()
    }

    return SafeSynthesizerSummary(timing=timing, **gen_fields, **report_scores)

make_nss_results(generate_results, total_time=None, training_time=None, generation_time=None, evaluation_time=None, report=None)

Build the final pipeline results container.

Combines generation output, timing, and an optional evaluation report into a single SafeSynthesizerResults object.

Parameters:

Name Type Description Default
generate_results GenerateJobResults | DataFrame

Generation output -- a GenerateJobResults or a raw DataFrame of synthetic records.

required
total_time float | None

Total wall-clock time in seconds.

None
training_time float | None

Training phase time in seconds.

None
generation_time float | None

Generation phase time in seconds.

None
evaluation_time float | None

Evaluation phase time in seconds.

None
report MultimodalReport | None

Evaluation report to render as HTML.

None

Returns:

Type Description
SafeSynthesizerResults

A SafeSynthesizerResults with synthetic data, summary, and

SafeSynthesizerResults

optional HTML evaluation report.

Raises:

Type Description
ValueError

If generate_results is None or an empty DataFrame.

Source code in src/nemo_safe_synthesizer/results.py
def make_nss_results(
    generate_results: GenerateJobResults | pd.DataFrame,
    total_time: float | None = None,
    training_time: float | None = None,
    generation_time: float | None = None,
    evaluation_time: float | None = None,
    report: MultimodalReport | None = None,
) -> SafeSynthesizerResults:
    """Build the final pipeline results container.

    Combines generation output, timing, and an optional evaluation report
    into a single ``SafeSynthesizerResults`` object.

    Args:
        generate_results: Generation output -- a ``GenerateJobResults`` or
            a raw ``DataFrame`` of synthetic records.
        total_time: Total wall-clock time in seconds.
        training_time: Training phase time in seconds.
        generation_time: Generation phase time in seconds.
        evaluation_time: Evaluation phase time in seconds.
        report: Evaluation report to render as HTML.

    Returns:
        A ``SafeSynthesizerResults`` with synthetic data, summary, and
        optional HTML evaluation report.

    Raises:
        ValueError: If ``generate_results`` is ``None`` or an empty
            ``DataFrame``.
    """
    timing = SafeSynthesizerTiming(
        total_time_sec=total_time,
        evaluation_time_sec=evaluation_time,
        training_time_sec=training_time,
        generation_time_sec=generation_time,
    )
    summary = make_nss_summary(timing, generate_results, report)
    if generate_results is None:
        raise ValueError("generate_results is required")
    if isinstance(generate_results, pd.DataFrame) and generate_results.empty:
        raise ValueError("generate_results are empty")
    return SafeSynthesizerResults(
        synthetic_data=generate_results.df if isinstance(generate_results, GenerateJobResults) else generate_results,
        summary=summary,
        evaluation_report_html=render_report(report) if report else None,
    )