ScoringStrategy.java

/*
 * SPDX-License-Identifier: Apache-2.0
 * Copyright 2026 Nikolas Charalambidis
 */

package dev.nichar.facepalm.engine;

/**
 * Mathematical strategies for calculating a composite threat score from risk and confidence.
 */
public enum ScoringStrategy {

    /**
     * Arithmetic mean for a balanced, linear score.
     */
    AVERAGE {

        @Override
        public double calculate(final int r, final int c) {
            return (r + c) / 2.0;
        }
    },

    /**
     * Geometric mean that heavily discounts findings with low individual scores.
     */
    GEOMETRIC {

        @Override
        public double calculate(final int r, final int c) {
            return Math.sqrt(r * (double) c);
        }
    },

    /**
     * Quadratic mean that emphasizes higher values to surface critical findings.
     */
    ROOT_MEAN_SQUARE {

        @Override
        public double calculate(final int r, final int c) {
            return Math.sqrt((r * r + c * c) / 2.0);
        }
    },

    /**
     * Weights the square of the risk score to prioritize extreme threats.
     */
    WEIGHTED_QUADRATIC {

        @Override
        public double calculate(final int r, final int c) {
            final double rScaled = (r * r) / 100.0;
            return (rScaled * 0.8) + (c * 0.2);
        }
    },

    /**
     * Returns the maximum score for critical risks; otherwise applies a balanced split.
     */
    GATEKEEPER {

        @Override
        public double calculate(final int r, final int c) {
            if (r >= 90) {
                return Math.max(r, c);
            }
            return (r * 0.5) + (c * 0.5);
        }
    };

    /**
     * Computes the final composite score based on the implementation strategy.
     */
    public abstract double calculate(int risk, int confidence);
}