>, per_dimension:array, aggregate:float, adapter_count:int} */ public static function report(): array { $adapters = class_exists( 'TMDO_HivePress_Bootstrap' ) ? TMDO_HivePress_Bootstrap::adapters() : array(); $per_adapter = array(); foreach ( $adapters as $slug => $adapter ) { if ( $adapter instanceof TMDO_HivePress_Adapter ) { $per_adapter[ $slug ] = $adapter->suitability_score(); } } return array( 'adapters' => $per_adapter, 'per_dimension' => self::compute_per_dimension( $per_adapter ), 'aggregate' => self::compute_aggregate( $per_adapter ), 'adapter_count' => count( $per_adapter ), ); } /** * Compute the per-dimension average across all adapter reports. * * @param array> $per_adapter Adapter score map. * @return array Dimension key → average value. */ public static function compute_per_dimension( array $per_adapter ): array { $out = array(); if ( empty( $per_adapter ) ) { foreach ( self::DIMENSIONS as $d ) { $out[ $d ] = 0.0; } return $out; } foreach ( self::DIMENSIONS as $d ) { $sum = 0.0; foreach ( $per_adapter as $score ) { $sum += (float) ( $score[ $d ] ?? 0.0 ); } $out[ $d ] = round( $sum / count( $per_adapter ), 2 ); } return $out; } /** * Compute the site-wide aggregate (mean of adapter aggregates). * * @param array> $per_adapter Adapter score map. */ public static function compute_aggregate( array $per_adapter ): float { if ( empty( $per_adapter ) ) { return 0.0; } $sum = 0.0; foreach ( $per_adapter as $score ) { $sum += (float) ( $score['aggregate'] ?? 0.0 ); } return round( $sum / count( $per_adapter ), 2 ); } /** * Identify which dimensions are dragging the aggregate down. * * Returns adapter slugs whose given dimension is below the threshold. * * @param string $dimension Dimension key (e.g. 'd8_perf'). * @param float $threshold Minimum acceptable value (default 1.0). * @return array Slugs needing attention for this dimension. */ public static function adapters_below_threshold( string $dimension, float $threshold = 1.0 ): array { if ( ! in_array( $dimension, self::DIMENSIONS, true ) ) { return array(); } $report = self::report(); $flagged = array(); foreach ( $report['adapters'] as $slug => $score ) { if ( ( (float) ( $score[ $dimension ] ?? 0.0 ) ) < $threshold ) { $flagged[] = $slug; } } return $flagged; } } } // end if ( ! class_exists )