#ifndef RC_VECTOR_H
#define RC_VECTOR_H
#ifdef __cplusplus
extern "C" {
#endif
extern double zero_tolerance;
typedef struct rc_vector_t{
int len; double* d; int initialized;} rc_vector_t;
#define RC_VECTOR_INITIALIZER {\
.len = 0,\
.d = NULL,\
.initialized = 0}
rc_vector_t rc_vector_empty(void);
int rc_vector_alloc(rc_vector_t* v, int length);
int rc_vector_free(rc_vector_t* v);
int rc_vector_zeros(rc_vector_t* v, int length);
int rc_vector_ones(rc_vector_t* v, int length);
int rc_vector_random(rc_vector_t* v, int length);
int rc_vector_fibonnaci(rc_vector_t* v, int length);
int rc_vector_from_array(rc_vector_t* v, double* ptr, int length);
int rc_vector_duplicate(rc_vector_t a, rc_vector_t* b);
int rc_vector_print(rc_vector_t v);
int rc_vector_print_sci(rc_vector_t v);
int rc_vector_zero_out(rc_vector_t* v);
int rc_vector_times_scalar(rc_vector_t* v, double s);
double rc_vector_norm(rc_vector_t v, double p);
int rc_vector_max(rc_vector_t v);
int rc_vector_min(rc_vector_t v);
double rc_vector_std_dev(rc_vector_t v);
double rc_vector_mean(rc_vector_t v);
int rc_vector_projection(rc_vector_t v, rc_vector_t e, rc_vector_t* p);
double rc_vector_dot_product(rc_vector_t v1, rc_vector_t v2);
int rc_vector_cross_product(rc_vector_t v1, rc_vector_t v2, rc_vector_t* p);
int rc_vector_sum(rc_vector_t v1, rc_vector_t v2, rc_vector_t* s);
int rc_vector_sum_inplace(rc_vector_t* v1, rc_vector_t v2);
int rc_vector_subtract(rc_vector_t v1, rc_vector_t v2, rc_vector_t* s);
#ifdef __cplusplus
}
#endif
#endif