summaryrefslogtreecommitdiff
path: root/http/api.php
diff options
context:
space:
mode:
Diffstat (limited to 'http/api.php')
-rw-r--r--http/api.php207
1 files changed, 13 insertions, 194 deletions
diff --git a/http/api.php b/http/api.php
index 3ab7f3d..acf2752 100644
--- a/http/api.php
+++ b/http/api.php
@@ -28,204 +28,23 @@ Parametry:
*/
-if (!function_exists('http_response_code')) {
- function http_response_code($code = NULL) {
- $codes = array(400 => "Bad Request",
- 500 => "Internal Server Error");
- if (!isset($codes[$code])) {
- return;
- }
- $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
- header($protocol . ' ' . $code . ' ' . $codes[$code]);
- }
-}
-
-class ParametersException extends Exception {};
-
-function safe_ceil($value, $precision = 1e-6) {
- $ceilValue = ceil($value);
- return (abs($value - $ceilValue) < (1-$precision)) ? $ceilValue : round($value);
-}
-
-function recursive_ksort(&$array, $flags = SORT_REGULAR) {
- if (!is_array($array)) return false;
- ksort($array, $flags);
- foreach ($array as &$arr) {
- recursive_ksort($arr, $flags);
- }
- return true;
-}
-
-function ensure_parameters($parameters, $params) {
- foreach ($params as $param) {
- if (!isset($parameters[$param])) {
- throw new ParametersException('Missing parameter: ' . $param);
- }
- if (!is_numeric($parameters[$param])) {
- throw new ParametersException('Parameter: ' . $param . ' is not a numeric value (' . $parameters[$param] . ')');
- }
- }
-}
-
-function check_values($parameters, $params) {
- foreach ($params as $param => $test) {
- if (!$test($parameters[$param])) {
- throw new ParametersException('Parameter: ' . $param . ' has incorrect value (' . $parameters[$param] . ')');
- }
- }
-}
-
-function check_parameters($parameters) {
- ensure_parameters($parameters, array('type', 'contestants', 'title_sum'));
- check_values($parameters, array(
- 'type' => function($r) { return ctype_digit($r) && intval($r) > 0; },
- 'contestants' => function($r) { return ctype_digit($r) && intval($r) > 0; },
- 'title_sum' => function($r) { return floatval($r) >= 0; }
- ));
- if (isset($parameters['players'])) {
- check_values($parameters, array(
- 'players' => function($r) { return ctype_digit($r) && intval($r) > 0; }
- ));
- }
- if (!isset($parameters['manual']) || !isset($parameters['manual']['min_points']) || !isset($parameters['manual']['tournament_weight'])) {
- ensure_parameters($parameters, array('tournament_rank', 'over39_boards'));
- check_values($parameters, array(
- 'tournament_rank' => function($r) { return ctype_digit($r) && ((intval($r) >= 0 && intval($r) <= 7) || intval($r) == RANK_KMP); },
- 'over39_boards' => function($r) { return ctype_digit($r) && intval($r) >= 0 && intval($r) <= 1; }
- ));
- } else {
- check_values($parameters['manual'], array(
- 'min_points' => function($r) { return ctype_digit($r) && intval($r) >= 0; },
- 'tournament_weight' => function($r) { return ctype_digit($r) && intval($r) > 0; }
- ));
- }
- if (isset($parameters['manual']) && isset($parameters['manual']['players_coefficient'])) {
- check_values($parameters['manual'], array(
- 'players_coefficient' => function($r) { return floatval($r) >= 0; }
- ));
- }
-}
-
-const RANK_KMP = 101;
-
-function parse_parameters($parameters) {
- $return = array();
- $return['type'] = intval($parameters['type']);
- if ($return['type'] == 3 || $return['type'] > 4) {
- throw new ParametersException('Parameter: type has incorrect value (' . $return['type'] . ')');
- }
- if ($return['type'] != 2 && $parameters['tournament_rank'] == RANK_KMP) {
- throw new ParametersException('Parameter: type has incorrect value (' . $return['type'] . ') for KMP tournament');
- }
- $return['contestants'] = intval($parameters['contestants']);
- $return['players'] = isset($parameters['players']) ? intval($parameters['players']) : intval($parameters['contestants']) * $return['type'];
- $return['title_sum'] = floatval($parameters['title_sum']);
- $weights = array(
- array(1, 2, 4, 5, 7, 10, 15, 25, RANK_KMP => 0),
- array(2, 3, 5, 7, 10, 15, 25, 40, RANK_KMP => 0)
- );
- $return['tournament_weight'] = (isset($parameters['manual']) && isset($parameters['manual']['tournament_weight'])) ? intval($parameters['manual']['tournament_weight']) : $weights[intval($parameters['over39_boards'])][intval($parameters['tournament_rank'])];
- $min_points = array(
- array(0, 0, 0, 0, 50, 75, 150, 200, RANK_KMP => 0),
- array(0, 0, 0, 0, 70, 100, 200, 300, RANK_KMP => 0)
- );
- $return['min_points'] = (isset($parameters['manual']) && isset($parameters['manual']['min_points'])) ? intval($parameters['manual']['min_points']) : $min_points[intval($parameters['over39_boards'])][intval($parameters['tournament_rank'])];
- $return['players_coefficient'] = (isset($parameters['manual']) && isset($parameters['manual']['players_coefficient'])) ? floatval($parameters['manual']['players_coefficient']) : 0.05;
- $return['points_cutoffs'] = (isset($parameters['manual']) && isset($parameters['manual']['points_cutoffs']) && is_array($parameters['manual']['points_cutoffs'])) ? $parameters['manual']['points_cutoffs'] : array(
- array(0.0, 1.0),
- array(0.02, 0.9),
- array(0.2, 0.2),
- array(0.5, 0.0)
- );
- recursive_ksort($return['points_cutoffs']);
- if ($return['points_cutoffs'][0][0] != 0.0) {
- array_unshift($return['points_cutoffs'], array(0.0, 1.0));
- }
- if ($return['points_cutoffs'][count($return['points_cutoffs'])-1][1] != 0.0) {
- array_push($return['points_cutoffs'], array(1.0, 0.0));
- }
- foreach ($return['points_cutoffs'] as &$cutoff) {
- if (($cutoff[0] < 0.0) || ($cutoff[0] > 1.0)) {
- throw new ParametersException('Cutoff points need to be between 0.0 and 1.0: ' . $cutoff[0]);
- }
- $cutoff[0] = floatval($cutoff[0]);
- if (($cutoff[1] < 0.0) || ($cutoff[1] > 1.0)) {
- throw new ParametersException('Cutoff values need to be between 1.0 and 0.0: ' . $cutoff[1]);
- }
- $cutoff[1] = floatval($cutoff[1]);
- }
- unset($cutoff);
- for ($prev = 0; $prev < count($return['points_cutoffs']) - 1; $prev++) {
- $next = $prev + 1;
- if ($return['points_cutoffs'][$prev][0] >= $return['points_cutoffs'][$next][0]) {
- throw new ParametersException(
- 'Cutoff points need to be ascending: ' . $return['points_cutoffs'][$prev][0] . ', ' . $return['points_cutoffs'][$next][0]);
- }
- if ($return['points_cutoffs'][$prev][1] < $return['points_cutoffs'][$next][1]) {
- throw new ParametersException(
- 'Cutoff values need to be non-ascending: ' . $return['points_cutoffs'][$prev][1] . ', ' . $return['points_cutoffs'][$next][1]);
- }
- }
- return $return;
-}
-
-function get_position_percentage_from_position($position, $contestants) {
- return ($position - 1) / $contestants;
-}
-
-function get_percentage_from_position($position, $contestants, $cutoffs) {
- $position_percentage = get_position_percentage_from_position($position, $contestants);
- for ($prev = 0; $prev < count($cutoffs) - 1; $prev++) {
- $next = $prev + 1;
- if (($cutoffs[$prev][0] <= $position_percentage) && ($cutoffs[$next][0] >= $position_percentage)) {
- $result = ($position_percentage - $cutoffs[$prev][0]) * ($cutoffs[$prev][1] - $cutoffs[$next][1]) / ($cutoffs[$prev][0] - $cutoffs[$next][0]) + $cutoffs[$prev][1];
- return $result;
- }
- }
- return 0.0;
-}
-
-function calculate_points($parameters) {
- $max_points = safe_ceil(max(
- $parameters['min_points'],
- (1 + 0.25 * ($parameters['type'] > 2)) * (max(0.15, $parameters['title_sum'] / $parameters['players']) * $parameters['tournament_weight'] + $parameters['players_coefficient'] * $parameters['contestants'] * $parameters['type'])
- ));
- $min_points = 1;
- $result = array("sum" => 0, "points" => array());
- for ($place = 1; $place <= $parameters['contestants']; $place++) {
- $percentage = get_percentage_from_position($place, $parameters['contestants'], $parameters['points_cutoffs']);
- $points = safe_ceil(floatval($max_points) * $percentage);
- $result['points'][$place] = max($min_points, intval($points));
- $result['sum'] += $parameters['type'] * $result['points'][$place];
- }
- return $result;
-}
-
-function calculate_kmp_points($parameters) {
- $max_points = safe_ceil($parameters['contestants'] * 0.5);
- $min_points = 1;
- $result = array("sum" => 0, "points" => array(1 => $max_points));
- for ($place = 2; $place <= $parameters['contestants']; $place++) {
- $result['points'][$place] = max($min_points, $result['points'][$place-1]-1);
- $result['sum'] += $parameters['type'] * $result['points'][$place];
- }
- if ($parameters['title_sum'] / $parameters['players'] >= 2.5) {
- $result['points'][1] += 5;
- $result['points'][2] += 3;
- $result['points'][3] += 1;
- $result['sum'] += $parameters['type'] * 8;
- }
- return $result;
-}
+require_once('api-inc.php');
function run($parameters) {
+
try {
- check_parameters($parameters);
- $params = parse_parameters($parameters);
- if ($parameters['tournament_rank'] == RANK_KMP) {
- $result = calculate_kmp_points($params);
+ $versionClasses = array(
+ '1' => 'ApiPklV1', // RegKlas 2018.11.01
+ '2' => 'ApiPklV2', // RegKMP 2020.01.01
+ '_default' => 'ApiPklV2'
+ );
+ $version = isset($parameters['version']) ? $parameters['version'] : '_default';
+ $apiClass = isset($versionClasses[$version]) ? $versionClasses[$version] : $versionClasses['_default'];
+ $api = new $apiClass($parameters);
+ if ($parameters['tournament_rank'] == ApiPkl::RANK_KMP) {
+ $result = $api->calculate_kmp_points();
} else {
- $result = calculate_points($params);
+ $result = $api->calculate_points();
}
return $result;
}