double DistanceSet::get_average_time_per_coord() const
{
	double sum = 0;
	int size = get_num_points();
	int count = 0;
	for (int i = 0; i < size; i++)
	{
		for (int j = 0; j < size; j++)
		{
			if (i == j)
			{
				continue;
			}

			double di = get_point(i).get_euclidean_distance(get_point(j));
			double time = durations[i][j];

			if (di == 0)
			{
				continue;
			}

			sum += time / di;
			count++;
		}
	}
	return sum / count;
}
double DistanceSet::get_average_time_per_meter() const
{
	double sum = 0;
	int size = get_num_points();
	int count = 0;
	for (int i = 0; i < size; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (i == j)
			{
				continue;
			}

			double di = distances[i][j];
			double time = durations[i][j];

			if (di == 0)
			{
				continue;
			}

			sum += time / di;
			count++;
		}
	}
	return sum / count;
}
my_bool CRT_GAMAL_SUM_160_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
                          char *error) {
    // For each row, the current value is added to the sum
    EC_POINT **curR, **curS;
    int numCiphers;
    sum_state *state = (sum_state *) initid->ptr;
    size_t encodedLength = (size_t) args->lengths[0];
    char *encoded = (char *) args->args[0];

    if(check_encoding_size(encodedLength)) {
        strcpy(error, "Wrong Cipher Size");
        return 1;
    }

    numCiphers = get_num_points(encodedLength);

    if(state->isFirst) {
        init_sum_state(state, numCiphers);
    } else {
        if(numCiphers!=state->numCiphers) {
            strcpy(error, "Number of ciphers missmatch");
            return 1;
        }
    }

    if(decode_points(state->group, encoded, encodedLength, numCiphers, &curR, &curS)) {
        strcpy(error, "Error while decoding");
        return 1;
    }

    add_points_up(state->group,state->curSumR, state->curSumS, state->curSumR, state->curSumS, curR, curS, state->numCiphers);

    free_points(curR, curS, numCiphers);
    return 0;
}