ModelTrainingResult.java

package com.kapil.verbametrics.ml.domain;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * Domain record representing the result of model training operations.
 *
 * @author Kapil Garg
 */
public record ModelTrainingResult(
        String modelId,
        String modelType,
        boolean success,
        double accuracy,
        double precision,
        double recall,
        double f1Score,
        long trainingTimeMs,
        int trainingDataSize,
        int testDataSize,
        Map<String, Object> additionalMetrics,
        String errorMessage,
        LocalDateTime completedAt
) {

    public ModelTrainingResult {
        BaseMLResult.validateModelId(modelId);
        BaseMLResult.validateModelType(modelType);
        BaseMLResult.validateScore(accuracy, "Accuracy");
        BaseMLResult.validateScore(precision, "Precision");
        BaseMLResult.validateScore(recall, "Recall");
        BaseMLResult.validateScore(f1Score, "F1 score");
    }

    /**
     * Calculates the overall model quality score.
     *
     * @return the quality score between 0.0 and 1.0
     */
    public double getQualityScore() {
        return new BaseMLResult() {
        }.calculateAverageScore(accuracy, precision, recall, f1Score);
    }

    /**
     * Gets the training performance level.
     *
     * @return the performance level
     */
    public String getPerformanceLevel() {
        return new BaseMLResult() {
        }.getPerformanceLevel(getQualityScore());
    }

    @Override
    public String toString() {
        return """
                ModelTrainingResult{
                    modelId='%s', modelType='%s', success=%s,
                    accuracy=%.3f, precision=%.3f, recall=%.3f, f1Score=%.3f,
                    qualityScore=%.3f, performanceLevel='%s', trainingTimeMs=%d
                }""".formatted(
                modelId, modelType, success, accuracy, precision, recall, f1Score,
                getQualityScore(), getPerformanceLevel(), trainingTimeMs
        );
    }

}