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``.
    """
    # Extract scores from report if available, otherwise use None for all scores
    # (e.g., when running PII-only mode without evaluation)
    if report is not None:
        synthetic_data_quality_score = report.get_score_by_name("Synthetic Quality Score")
        column_correlation_stability_score = report.get_score_by_name("Column Correlation Stability")
        deep_structure_stability_score = report.get_score_by_name("Deep Structure Stability")
        column_distribution_stability_score = report.get_score_by_name("Column Distribution Stability")
        text_semantic_similarity_score = report.get_score_by_name("Text Semantic Similarity")
        text_structure_similarity_score = report.get_score_by_name("Text Structure Similarity")
        data_privacy_score = report.get_score_by_name("Data Privacy Score")
        membership_inference_protection_score = report.get_score_by_name("Membership Inference Protection")
        attribute_inference_protection_score = report.get_score_by_name("Attribute Inference Protection")
    else:
        synthetic_data_quality_score = None
        column_correlation_stability_score = None
        deep_structure_stability_score = None
        column_distribution_stability_score = None
        text_semantic_similarity_score = None
        text_structure_similarity_score = None
        data_privacy_score = None
        membership_inference_protection_score = None
        attribute_inference_protection_score = None

    num_valid_records = None
    num_invalid_records = None
    num_prompts = None
    valid_record_fraction = None
    if isinstance(results, GenerateJobResults):
        num_valid_records = results.num_valid_records
        num_invalid_records = results.num_invalid_records
        num_prompts = results.num_prompts
        valid_record_fraction = results.valid_record_fraction

    return SafeSynthesizerSummary(
        timing=timing,
        num_valid_records=num_valid_records,
        num_invalid_records=num_invalid_records,
        num_prompts=num_prompts,
        valid_record_fraction=valid_record_fraction,
        synthetic_data_quality_score=synthetic_data_quality_score,
        column_correlation_stability_score=column_correlation_stability_score,
        deep_structure_stability_score=deep_structure_stability_score,
        column_distribution_stability_score=column_distribution_stability_score,
        text_semantic_similarity_score=text_semantic_similarity_score,
        text_structure_similarity_score=text_structure_similarity_score,
        data_privacy_score=data_privacy_score,
        membership_inference_protection_score=membership_inference_protection_score,
        attribute_inference_protection_score=attribute_inference_protection_score,
    )

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,
    )