Interval merge_if_possible (Interval const A, Interval const B)
{
	if ( is_periodic(B) && (A.r == B.p) && (A.s == B.q) )
		return (Interval) {A.p, A.q, B.r, B.s};
	else
		return A;
}
Exemple #2
0
static void handle_expired_timer(struct sw_timer *swt)
{
        set_scheduled(swt, false);

        /* Invoke user's callback routine */
        if(swt->timeout_cb)
                swt->timeout_cb(swt->cb_param);
        
        /* Period timer: Set-up next iteration */
        if(true == is_periodic(swt))
                setup_timer_exec(swt, 0);

        return;
}
int main (int argc, char **argv)
{
	TimeSeries T = timeseries_from_stdin();
	
	ValueType sigma = 0.0;
	
	IndexType max_tau = (length(T)-1)/2;
	if (argc>1)
		max_tau = atoi(argv[1]);
	
	if (max_tau > length(T)-1)
	{
		max_tau = length(T)-1;
		fprintf(stderr, "Warning: Lowering maximum period length to length of time series.\n");
	}
	else if (max_tau <= 2)
	{
		max_tau = 3;
		fprintf(stderr, "Warning: Raising maximum period length to 3.\n");
	}
	
	if (argc>2)
		sigma = atof(argv[2]);
	
	if (sigma<0)
	{
		sigma = 0.0;
		fprintf(stderr, "Warning: Raising error allowance to 0.\n");
	}
	
	
	Interval result = periodicity_test (T, max_tau, sigma);
	
	if (is_periodic(result))
	{
		printf(
			"Data complies with any period between %.16f and %.16f.",
			result.p/((double) result.q),
			result.r/((double) result.s)
		);
	}
	else
		printf("Data does not comply with no period length in the specified interval.");
	
	timeseries_free (T);
}
static PyObject * py_periodicitytest(PyObject *self, PyObject *args)
{
	TimeSeries T;
	IndexType max_tau = 0;
	ValueType sigma = 0;
	
	if (!PyArg_ParseTuple(args, "O!|Id", &PyArray_Type, &T, &max_tau, &sigma))
		return NULL;
	
	if (PyArray_NDIM(T) != 1)
	{
		PyErr_SetString(PyExc_ValueError,"Array must be one-dimensional.");
		return NULL;
	}
	else if ((PyArray_TYPE(T) != TYPE_INDEX) && (sigma != 0))
	{
		PyErr_SetString(PyExc_TypeError,"Unless sigma is 0, array needs to be of type double.");
		return NULL;
	}
	else if (length(T) < 3)
	{
		PyErr_SetString(PyExc_ValueError,"Array length smaller than 3.");
		return NULL;
	}
	
	if (max_tau == 0)
		max_tau = (length(T)-1)/2;
	else if (max_tau > length(T)-1)
	{
		max_tau = length(T)-1;
		PyErr_WarnEx (NULL, "Warning: Lowering maximum period length to length of time series.\n", 1);
	}
	else if (max_tau <= 2)
	{
		max_tau = 3;
		PyErr_WarnEx (NULL, "Warning: Raising maximum period length to 3.\n", 1);
	}
	
	if (sigma < 0)
	{
		PyErr_SetString(PyExc_ValueError,"Negative sigma.");
		return NULL;
	}
	
	
	
	Interval result = periodicity_test (T, max_tau, sigma);
	
	if (is_periodic(result))
	{
		PyObject * result_interval = PyTuple_Pack (4,
												PyLong_FromLong(result.p),
												PyLong_FromLong(result.q),
												PyLong_FromLong(result.r),
												PyLong_FromLong(result.s));
		PyObject * result_interval_2 = PyTuple_Pack (2,
												PyFloat_FromDouble(result.p/((double) result.q)),
												PyFloat_FromDouble(result.r/((double) result.s)));
		return PyTuple_Pack (3, Py_True, result_interval, result_interval_2);
	}
	else if (max_tau == length(T)-1)
	{
		PyObject * result_interval = PyTuple_Pack (4,
												PyLong_FromLong(length(T)-1),
												PyLong_FromLong(1),
												PyLong_FromLong(1),
												PyLong_FromLong(0));
		PyObject * result_interval_2 = PyTuple_Pack (2,
												PyFloat_FromDouble((double) length(T)-1),
												PyFloat_FromDouble(INFINITY));
		return PyTuple_Pack (3, Py_False, result_interval, result_interval_2);
	}
	else
		return PyTuple_Pack (3, Py_False, Py_None, Py_None);

}
bool contains_Interval (Interval A, Interval B)
{
	return is_periodic(A) && (A.p*B.q <= B.p*A.q) && (B.r*A.s <= A.r*B.s);
}