Mercurial > hg > camir-aes2014
diff toolboxes/SVM-light/src/svm_common.h @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/SVM-light/src/svm_common.h Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,301 @@ +/************************************************************************/ +/* */ +/* svm_common.h */ +/* */ +/* Definitions and functions used in both svm_learn and svm_classify. */ +/* */ +/* Author: Thorsten Joachims */ +/* Date: 02.07.02 */ +/* */ +/* Copyright (c) 2002 Thorsten Joachims - All rights reserved */ +/* */ +/* This software is available for non-commercial use only. It must */ +/* not be modified and distributed without prior permission of the */ +/* author. The author is not responsible for implications from the */ +/* use of this software. */ +/* */ +/************************************************************************/ + +#ifndef SVM_COMMON +#define SVM_COMMON + +# define MAXSHRINK 50000 /* maximum number of shrinking rounds */ +# define MAXFEATNUM 99999999 /* maximum feature number (must be in + valid range of long int type!) */ + +# include <stdio.h> +# include <ctype.h> +# include <math.h> +# include <string.h> +# include <stdlib.h> +# include <time.h> +# include <float.h> + +# define VERSION "V6.01" +# define VERSION_DATE "01.09.04" + +# define CFLOAT float /* the type of float to use for caching */ + /* kernel evaluations. Using float saves */ + /* us some memory, but you can use double, too */ +# define FNUM long /* the type used for storing feature ids */ +# define FVAL float /* the type used for storing feature values */ + +# define LINEAR 0 /* linear kernel type */ +# define POLY 1 /* polynoial kernel type */ +# define RBF 2 /* rbf kernel type */ +# define SIGMOID 3 /* sigmoid kernel type */ + +# define CLASSIFICATION 1 /* train classification model */ +# define REGRESSION 2 /* train regression model */ +# define RANKING 3 /* train ranking model */ +# define OPTIMIZATION 4 /* train on general set of constraints */ + +typedef struct word { + FNUM wnum; /* word number */ + FVAL weight; /* word weight */ +} WORD; + +typedef struct svector { + WORD *words; /* The features/values in the vector by + increasing feature-number. Feature + numbers that are skipped are + interpreted as having value zero. */ + double twonorm_sq; /* The squared euclidian length of the + vector. Used to speed up the RBF kernel. */ + char *userdefined; /* You can put additional information + here. This can be useful, if you are + implementing your own kernel that + does not work with feature/values + representations (for example a + string kernel). By default, + svm-light will put here the string + after the # sign from each line of + the input file. */ + long kernel_id; /* Feature vectors with different + kernel_id's are orthogonal (ie. the + feature number do not match). This + is used for computing component + kernels for linear constraints which + are a sum of several different + weight vectors. (currently not + implemented). */ + struct svector *next; /* Let's you set up a list of SVECTOR's + for linear constraints which are a + sum of multiple feature + vectors. List is terminated by + NULL. */ + double factor; /* Factor by which this feature vector + is multiplied in the sum. */ +} SVECTOR; + +typedef struct doc { + long docnum; /* Document ID. This has to be the position of + the document in the training set array. */ + long queryid; /* for learning rankings, constraints are + generated for documents with the same + queryID. */ + double costfactor; /* Scales the cost of misclassifying this + document by this factor. The effect of this + value is, that the upper bound on the alpha + for this example is scaled by this factor. + The factors are set by the feature + 'cost:<val>' in the training data. */ + long slackid; /* Index of the slack variable + corresponding to this + constraint. All constraints with the + same slackid share the same slack + variable. This can only be used for + svm_learn_optimization. */ + SVECTOR *fvec; /* Feature vector of the example. The + feature vector can actually be a + list of feature vectors. For + example, the list will have two + elements, if this DOC is a + preference constraint. The one + vector that is supposed to be ranked + higher, will have a factor of +1, + the lower ranked one should have a + factor of -1. */ +} DOC; + +typedef struct learn_parm { + long type; /* selects between regression and + classification */ + double svm_c; /* upper bound C on alphas */ + double eps; /* regression epsilon (eps=1.0 for + classification */ + double svm_costratio; /* factor to multiply C for positive examples */ + double transduction_posratio;/* fraction of unlabeled examples to be */ + /* classified as positives */ + long biased_hyperplane; /* if nonzero, use hyperplane w*x+b=0 + otherwise w*x=0 */ + long sharedslack; /* if nonzero, it will use the shared + slack variable mode in + svm_learn_optimization. It requires + that the slackid is set for every + training example */ + long svm_maxqpsize; /* size q of working set */ + long svm_newvarsinqp; /* new variables to enter the working set + in each iteration */ + long kernel_cache_size; /* size of kernel cache in megabytes */ + double epsilon_crit; /* tolerable error for distances used + in stopping criterion */ + double epsilon_shrink; /* how much a multiplier should be above + zero for shrinking */ + long svm_iter_to_shrink; /* iterations h after which an example can + be removed by shrinking */ + long maxiter; /* number of iterations after which the + optimizer terminates, if there was + no progress in maxdiff */ + long remove_inconsistent; /* exclude examples with alpha at C and + retrain */ + long skip_final_opt_check; /* do not check KT-Conditions at the end of + optimization for examples removed by + shrinking. WARNING: This might lead to + sub-optimal solutions! */ + long compute_loo; /* if nonzero, computes leave-one-out + estimates */ + double rho; /* parameter in xi/alpha-estimates and for + pruning leave-one-out range [1..2] */ + long xa_depth; /* parameter in xi/alpha-estimates upper + bounding the number of SV the current + alpha_t is distributed over */ + char predfile[200]; /* file for predicitions on unlabeled examples + in transduction */ + char alphafile[200]; /* file to store optimal alphas in. use + empty string if alphas should not be + output */ + + /* you probably do not want to touch the following */ + double epsilon_const; /* tolerable error on eq-constraint */ + double epsilon_a; /* tolerable error on alphas at bounds */ + double opt_precision; /* precision of solver, set to e.g. 1e-21 + if you get convergence problems */ + + /* the following are only for internal use */ + long svm_c_steps; /* do so many steps for finding optimal C */ + double svm_c_factor; /* increase C by this factor every step */ + double svm_costratio_unlab; + double svm_unlabbound; + double *svm_cost; /* individual upper bounds for each var */ + long totwords; /* number of features */ +} LEARN_PARM; + +typedef struct kernel_parm { + long kernel_type; /* 0=linear, 1=poly, 2=rbf, 3=sigmoid, 4=custom */ + long poly_degree; + double rbf_gamma; + double coef_lin; + double coef_const; + char custom[50]; /* for user supplied kernel */ +} KERNEL_PARM; + +typedef struct model { + long sv_num; + long at_upper_bound; + double b; + DOC **supvec; + double *alpha; + long *index; /* index from docnum to position in model */ + long totwords; /* number of features */ + long totdoc; /* number of training documents */ + KERNEL_PARM kernel_parm; /* kernel */ + + /* the following values are not written to file */ + double loo_error,loo_recall,loo_precision; /* leave-one-out estimates */ + double xa_error,xa_recall,xa_precision; /* xi/alpha estimates */ + double *lin_weights; /* weights for linear case using + folding */ + double maxdiff; /* precision, up to which this + model is accurate */ +} MODEL; + +typedef struct quadratic_program { + long opt_n; /* number of variables */ + long opt_m; /* number of linear equality constraints */ + double *opt_ce,*opt_ce0; /* linear equality constraints */ + double *opt_g; /* hessian of objective */ + double *opt_g0; /* linear part of objective */ + double *opt_xinit; /* initial value for variables */ + double *opt_low,*opt_up; /* box constraints */ +} QP; + +typedef struct kernel_cache { + long *index; /* cache some kernel evalutations */ + CFLOAT *buffer; /* to improve speed */ + long *invindex; + long *active2totdoc; + long *totdoc2active; + long *lru; + long *occu; + long elems; + long max_elems; + long time; + long activenum; + long buffsize; +} KERNEL_CACHE; + + +typedef struct timing_profile { + long time_kernel; + long time_opti; + long time_shrink; + long time_update; + long time_model; + long time_check; + long time_select; +} TIMING; + +typedef struct shrink_state { + long *active; + long *inactive_since; + long deactnum; + double **a_history; /* for shrinking with non-linear kernel */ + long maxhistory; + double *last_a; /* for shrinking with linear kernel */ + double *last_lin; /* for shrinking with linear kernel */ +} SHRINK_STATE; + +double classify_example(MODEL *, DOC *); +double classify_example_linear(MODEL *, DOC *); +CFLOAT kernel(KERNEL_PARM *, DOC *, DOC *); +CFLOAT single_kernel(KERNEL_PARM *, SVECTOR *, SVECTOR *); +double custom_kernel(KERNEL_PARM *, SVECTOR *, SVECTOR *); +SVECTOR *create_svector(WORD *, char *, double); +SVECTOR *copy_svector(SVECTOR *); +void free_svector(SVECTOR *); +double sprod_ss(SVECTOR *, SVECTOR *); +SVECTOR* sub_ss(SVECTOR *, SVECTOR *); +SVECTOR* add_ss(SVECTOR *, SVECTOR *); +SVECTOR* add_list_ss(SVECTOR *); +void append_svector_list(SVECTOR *a, SVECTOR *b); +SVECTOR* smult_s(SVECTOR *, double); +int featvec_eq(SVECTOR *, SVECTOR *); +double model_length_s(MODEL *, KERNEL_PARM *); +void clear_vector_n(double *, long); +void add_vector_ns(double *, SVECTOR *, double); +double sprod_ns(double *, SVECTOR *); +void add_weight_vector_to_linear_model(MODEL *); +DOC *create_example(long, long, long, double, SVECTOR *); +void free_example(DOC *, long); +MODEL *read_model(char *); +MODEL *copy_model(MODEL *); +void free_model(MODEL *, int); +void read_documents(char *, DOC ***, double **, long *, long *); +int parse_document(char *, WORD *, double *, long *, long *, double *, long *, long, char **); +double *read_alphas(char *,long); +void nol_ll(char *, long *, long *, long *); +long minl(long, long); +long maxl(long, long); +long get_runtime(void); +int space_or_null(int); +void *my_malloc(size_t); +void copyright_notice(void); +# ifdef _MSC_VER + int isnan(double); +# endif + +extern long verbosity; /* verbosity level (0-4) */ +extern long kernel_cache_statistic; + +#endif