00001
00023 #ifndef __UKR_H
00024 #define __UKR_H
00025
00027 typedef enum {
00028 UKR_KERNEL_UNKNOWN=0,
00029 UKR_KERNEL_GAUSSIAN=1,
00030 UKR_KERNEL_SPARSE=100,
00031 UKR_KERNEL_QUARTIC=102,
00032 UKR_KERNEL_TRIWEIGHT=103
00033 } UKR_Kernel;
00034
00036 typedef enum {
00037 UKR_LOSS_UNKNOWN=-1,
00038 UKR_LOSS_L2=0,
00039 UKR_LOSS_HUBER=1,
00040 UKR_LOSS_EPS2=2,
00041 UKR_LOSS_EPS=3
00042 } UKR_Loss;
00043
00045 typedef struct {
00046 const double *X;
00047 const double *Y;
00048 const double *G;
00049 int q;
00050 int d;
00051 int N;
00052 const int *MaskIs;
00053 const int *MaskJs;
00054 const double *epsilon;
00055 int epsM;
00056 int epsN;
00057 UKR_Kernel kernel;
00058 UKR_Loss lossFunction;
00059 double eta;
00060 } UKR_Model;
00061
00063 typedef struct {
00064 const double *y;
00065 const double *KyY;
00066 double Kyy;
00067 int *ir;
00068 int *nz;
00069 double *b;
00070 double *p;
00071 double *fm;
00072 double *J;
00073 double *GJ;
00074 } UKR_G_Struct;
00075
00076 #ifdef __cplusplus
00077 extern "C" {
00078 #endif
00079
00087 typedef double (*Ukr_bp_dists_sparse)(int,const double *,double *,double *,int *,int *,int,const int*,int);
00088
00095 typedef double (*Ukr_bp_dists_full)(int,const double *,double *,double *,int,const int*,int);
00096
00103 Ukr_bp_dists_sparse ukr_get_kernel_sparse(UKR_Kernel kernel);
00104
00110 Ukr_bp_dists_full ukr_get_kernel_full(UKR_Kernel kernel);
00111
00118 double ukr_f(double *f,const double *x,UKR_Model model);
00119
00128 double ukr_fJ(double *f,double *J,const double *x,UKR_Model model);
00129
00146 double ukr_bp_dists_gaussian(int M,const double *dist,double *b,double *p,int numExclude,const int *exclude,int normalize);
00147
00167 double ukr_bp_dists_quartic(int M,const double *dist,double *b,double *p,int *ir,int *nz,int numExclude,const int *exclude,int normalize);
00168
00172 double ukr_bp_dists_triweight(int M,const double *dist,double *b,double *p,int *ir,int *nz,int numExclude,const int *exclude,int normalize);
00173
00182 double ukr_loss_function(int col, double *yr,const double *y,UKR_Model model);
00183
00188 UKR_Kernel ukr_kernel_by_name(const char *name);
00189
00194 UKR_Loss ukr_loss_by_name(const char *name);
00195
00206 double ukr_errgrad(double *grad,UKR_Model model,int forceCV);
00207
00220 double ukr_errgrad_scale(double *grad,const double *s,UKR_Model model,int forceCV);
00221
00222 int ukr_dens_penalty(double *pen,double *grad,UKR_Model model);
00223 int ukr_densvar_penalty(double *pen,double *grad,UKR_Model model);
00224
00225 int ukr_aux_dens_penalty_sparse(double *pen,double *grad,UKR_Model model);
00226 int ukr_aux_dens_penalty_full(double *pen,double *grad,UKR_Model model);
00227 int ukr_aux_densvar_penalty_sparse(double *pen,double *grad,UKR_Model model);
00228 int ukr_aux_densvar_penalty_full(double *pen,double *grad,UKR_Model model);
00229
00230 double ukr_aux_errgrad_sparse(double *grad,UKR_Model model,int forceCV);
00231 double ukr_aux_errgrad_full(double *grad,UKR_Model model,int forceCV);
00232 double ukr_aux_errgrad_scale_sparse(double *grad,const double *s,UKR_Model model,int forceCV);
00233 double ukr_aux_errgrad_scale_full(double *grad,const double *s,UKR_Model model,int forceCV);
00234 double ukr_aux_M(int col,double *M,double *B,double *tmp_d,UKR_Model model);
00235 double ukr_aux_M_sp(int col,double *M,const double *B,const int *ir,int nz,double *tmp_d,UKR_Model model);
00236 void ukr_aux_R(double *R,const double *B,const double *P,const double *M,int n);
00237 void ukr_aux_addXv_sp(double *u,const double *X,const double *v,const int *ir,int nz,int q);
00238 void ukr_aux_add_xvT_sp(double *U,const double *x,const double *v,const int *ir,int nz,int q);
00239 void ukr_aux_addXv(double *u,const double *X,const double *v,int q,int N);
00240 void ukr_aux_add_xvT(double *U,const double *x,const double *v,int q,int N);
00241 void ukr_aux_subX_diag(double *grad, const double *X, const double *sumR, int q, int N);
00242 void ukr_aux_scaleX(double *sX,double *XX,const double *X,const double *s,int q,int N);
00243
00244
00245 void ukr_aux_Jb_sparse(double *J,const double *b,const double *p,const double *x,const int *ir,int nnz,UKR_Model model);
00246 void ukr_aux_Jb_full(double *J,const double *b,const double *p,const double *x,UKR_Model model);
00247 void ukr_aux_f_sparse(double *f,const double *b,const int *ir,int nz,UKR_Model model);
00248 void ukr_aux_f_full(double *f,const double *b,UKR_Model model);
00249 void ukr_aux_Jf_sparse(double *Jf,const double *b,const double *p,const double *x,const int *ir,int nnz,UKR_Model model);
00250 void ukr_aux_Jf_full(double *Jf,const double *b,const double *p,const double *x,UKR_Model model);
00251
00252 int ukr_aux_alloc_g_struct(UKR_Model model, UKR_G_Struct *gs);
00253 void ukr_aux_free_g_struct(UKR_G_Struct gs);
00254
00255 double ukr_g_congrad(double *g,const double *x,UKR_Model model, UKR_G_Struct gs);
00256 double ukr_g_errgradhess(double *g,double *H,const double *x,UKR_Model model, UKR_G_Struct ukr_gs,int bp_ready);
00257 void ukr_aux_normalize_gs(UKR_Model model, UKR_G_Struct ukr_gs);
00258
00259 #ifdef __cplusplus
00260 }
00261 #endif
00262
00263 #endif