46#include <hugin_config.h>
48#define log1p(x) log(1+x)
62template <
class T>
static inline T
min(T x,T y) {
return (x<y)?x:y; }
65template <
class T>
static inline T
max(T x,T y) {
return (x>y)?x:y; }
67template <
class T>
static inline void swap(T& x, T& y) { T
t=x; x=y; y=
t; }
68template <
class S,
class T>
static inline void clone(T*&
dst,
S*
src,
int n)
86#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
102 (*svm_print_string)(
buf);
105static void info(
const char *
fmt,...) {}
160 h->prev->next = h->next;
161 h->next->prev = h->prev;
177 int more = len - h->len;
220 swap(h->data[
i],h->data[
j]);
301:kernel_type(param.kernel_type), degree(param.degree),
302 gamma(param.gamma), coef0(param.coef0)
344 while(
px->index != -1 &&
py->index != -1)
346 if(
px->index ==
py->index)
354 if(
px->index >
py->index)
405 while(y->
index != -1)
475 return (
y[
i] > 0)?
Cp :
Cn;
526 info(
"\nWARNING: using -h 0 may be faster\n");
552 double *
alpha_,
double Cp,
double Cn,
double eps,
609 int counter =
min(
l,1000)+1;
617 counter =
min(
l,1000);
787 fprintf(
stderr,
"\nWARNING: reaching max number of iterations\n");
821 info(
"\noptimization finished, #iter = %d\n",
iter);
1332 for(
int j=start;
j<len;
j++)
1381 for(
int j=start;
j<len;
j++)
1417 QD =
new double[2*
l];
1420 for(
int k=0;
k<
l;
k++)
1501 if(
prob->y[
i] > 0) y[
i] = +1;
else y[
i] = -1;
1528 double nu = param->
nu;
1553 double *
zeros =
new double[l];
1563 info(
"C = %f\n",1/r);
1582 double *
zeros =
new double[l];
1591 alpha[
n] = param->
nu *
prob->l -
n;
1614 double *
alpha2 =
new double[2*l];
1652 double C = param->
C;
1653 double *
alpha2 =
new double[2*l];
1658 double sum = C * param->
nu * l / 2;
1675 info(
"epsilon = %f\n",-si->
r);
1696 double Cp,
double Cn)
1727 if(
fabs(alpha[
i]) > 0)
1743 info(
"nSV = %d, nBSV = %d\n",nSV,
nBSV);
1754 double& A,
double&
B)
1857 info(
"Line search fails in two-class probability estimates\n");
1863 info(
"Reaching maximal iterations in two-class probability estimates\n");
1882 double **Q=
Malloc(
double *,
k);
1893 Q[
t][
t]+=r[
j][
t]*r[
j][
t];
1898 Q[
t][
t]+=r[
j][
t]*r[
j][
t];
1899 Q[
t][
j]=-r[
j][
t]*r[
t][
j];
1935 info(
"Exceeds max_iter in multiclass_prob\n");
1944 double Cp,
double Cn,
double& probA,
double& probB)
1970 for(
j=0;
j<begin;
j++)
1990 for(
j=begin;
j<end;
j++)
1993 for(
j=begin;
j<end;
j++)
1996 for(
j=begin;
j<end;
j++)
2011 for(
j=begin;
j<end;
j++)
2055 info(
"Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma= %g\n",
mae);
2077 for(
j=0;
j<nr_class;
j++)
2095 count[nr_class] = 1;
2105 if (nr_class == 2 && label[0] == -1 && label[1] == 1)
2107 swap(label[0],label[1]);
2108 swap(count[0],count[1]);
2118 int *start =
Malloc(
int,nr_class);
2120 for(
i=1;
i<nr_class;
i++)
2121 start[
i] = start[
i-1]+count[
i-1];
2128 for(
i=1;
i<nr_class;
i++)
2129 start[
i] = start[
i-1]+count[
i-1];
2144 model->param = *param;
2152 model->nr_class = 2;
2203 info(
"WARNING: training data in only one class. See README for details.\n");
2213 for(
i=0;
i<nr_class;
i++)
2218 for(
j=0;
j<nr_class;
j++)
2237 probA=
Malloc(
double,nr_class*(nr_class-1)/2);
2238 probB=
Malloc(
double,nr_class*(nr_class-1)/2);
2242 for(
i=0;
i<nr_class;
i++)
2243 for(
int j=
i+1;
j<nr_class;
j++)
2246 int si = start[
i],
sj = start[
j];
2247 int ci = count[
i],
cj = count[
j];
2280 model->nr_class = nr_class;
2283 for(
i=0;
i<nr_class;
i++)
2286 model->rho =
Malloc(
double,nr_class*(nr_class-1)/2);
2287 for(
i=0;
i<nr_class*(nr_class-1)/2;
i++)
2292 model->probA =
Malloc(
double,nr_class*(nr_class-1)/2);
2293 model->probB =
Malloc(
double,nr_class*(nr_class-1)/2);
2294 for(
i=0;
i<nr_class*(nr_class-1)/2;
i++)
2309 for(
i=0;
i<nr_class;
i++)
2312 for(
int j=0;
j<count[
i];
j++)
2337 for(
i=1;
i<nr_class;
i++)
2341 for(
i=0;
i<nr_class-1;
i++)
2345 for(
i=0;
i<nr_class;
i++)
2346 for(
int j=
i+1;
j<nr_class;
j++)
2378 for(
i=0;
i<nr_class*(nr_class-1)/2;
i++)
2398 fprintf(
stderr,
"WARNING: # folds > # data. Will use # folds = # data instead (i.e., leave-one-out cross validation)\n");
2414 int *index =
Malloc(
int,l);
2417 for (c=0; c<nr_class; c++)
2418 for(
i=0;
i<count[c];
i++)
2420 int j =
i+
rand()%(count[c]-
i);
2421 swap(index[start[c]+
j],index[start[c]+
i]);
2426 for (c=0; c<nr_class;c++)
2432 for (c=0; c<nr_class;c++)
2435 int begin = start[c]+
i*count[c]/
nr_fold;
2436 int end = start[c]+(
i+1)*count[c]/
nr_fold;
2437 for(
int j=begin;
j<end;
j++)
2476 for(
j=0;
j<begin;
j++)
2493 for(
j=begin;
j<end;
j++)
2498 for(
j=begin;
j<end;
j++)
2511 return model->param.svm_type;
2516 return model->nr_class;
2542 return model->probA[0];
2545 fprintf(
stderr,
"Model doesn't contain information for SVR probability inference\n");
2557 double *sv_coef =
model->sv_coef[0];
2561 sum -=
model->rho[0];
2565 return (sum>0)?1:-1;
2571 int nr_class =
model->nr_class;
2578 int *start =
Malloc(
int,nr_class);
2580 for(
i=1;
i<nr_class;
i++)
2581 start[
i] = start[
i-1]+
model->nSV[
i-1];
2584 for(
i=0;
i<nr_class;
i++)
2588 for(
i=0;
i<nr_class;
i++)
2589 for(
int j=
i+1;
j<nr_class;
j++)
2604 sum -=
model->rho[p];
2615 for(
i=1;
i<nr_class;
i++)
2628 int nr_class =
model->nr_class;
2648 int nr_class =
model->nr_class;
2654 for(
i=0;
i<nr_class;
i++)
2657 for(
i=0;
i<nr_class;
i++)
2658 for(
int j=
i+1;
j<nr_class;
j++)
2667 for(
i=1;
i<nr_class;
i++)
2670 for(
i=0;
i<nr_class;
i++)
2682 "c_svc",
"nu_svc",
"one_class",
"epsilon_svr",
"nu_svr",
NULL
2687 "linear",
"polynomial",
"rbf",
"sigmoid",
"precomputed",
NULL
2712 int nr_class =
model->nr_class;
2719 for(
int i=0;
i<nr_class*(nr_class-1)/2;
i++)
2727 for(
int i=0;
i<nr_class;
i++)
2735 for(
int i=0;
i<nr_class*(nr_class-1)/2;
i++)
2742 for(
int i=0;
i<nr_class*(nr_class-1)/2;
i++)
2750 for(
int i=0;
i<nr_class;
i++)
2756 const double *
const *sv_coef =
model->sv_coef;
2759 for(
int i=0;
i<l;
i++)
2761 for(
int j=0;
j<nr_class-1;
j++)
2769 while(p->
index != -1)
2810#define FSCANF(_stream, _format, _var) do{ if (fscanf(_stream, _format, _var) != 1) return false; }while(0)
2864 if (
model->nr_class > 128)
2876 for(
int i=0;
i<
n;
i++)
2883 for(
int i=0;
i<
n;
i++)
2890 for(
int i=0;
i<
n;
i++)
2897 for(
int i=0;
i<
n;
i++)
2904 for(
int i=0;
i<
n;
i++)
2918 if(c==
EOF || c==
'\n')
break;
2984 elements +=
model->l;
2988 int m =
model->nr_class - 1;
3006 for(
int k=1;
k<m;
k++)
3094 if(svm_type !=
C_SVC &&
3099 return "unknown svm type";
3104 if(kernel_type !=
LINEAR &&
3105 kernel_type !=
POLY &&
3106 kernel_type !=
RBF &&
3109 return "unknown kernel type";
3111 if(param->
gamma < 0)
3115 return "degree of polynomial kernel < 0";
3120 return "cache_size <= 0";
3125 if(svm_type ==
C_SVC ||
3134 if(param->
nu <= 0 || param->
nu > 1)
3135 return "nu <= 0 or nu > 1";
3143 return "shrinking != 0 and shrinking != 1";
3147 return "probability != 0 and probability != 1";
3151 return "one-class SVM probability output not supported yet";
3169 for(
j=0;
j<nr_class;
j++)
3184 count[nr_class] = 1;
3189 for(
i=0;
i<nr_class;
i++)
3192 for(
int j=
i+1;
j<nr_class;
j++)
3199 return "specified nu is infeasible";
void lru_insert(head_t *h)
int get_data(const int index, Qfloat **data, int len)
void lru_delete(head_t *h)
Cache(int l, long int size)
void swap_index(int i, int j)
double kernel_precomputed(int i, int j) const
double kernel_rbf(int i, int j) const
static double dot(const svm_node *px, const svm_node *py)
virtual Qfloat * get_Q(int column, int len) const =0
double(Kernel::* kernel_function)(int i, int j) const
double kernel_sigmoid(int i, int j) const
virtual double * get_QD() const =0
Kernel(int l, svm_node *const *x, const svm_parameter ¶m)
virtual void swap_index(int i, int j) const
double kernel_poly(int i, int j) const
static double k_function(const svm_node *x, const svm_node *y, const svm_parameter ¶m)
double kernel_linear(int i, int j) const
ONE_CLASS_Q(const svm_problem &prob, const svm_parameter ¶m)
void swap_index(int i, int j) const
Qfloat * get_Q(int i, int len) const
virtual double * get_QD() const =0
virtual Qfloat * get_Q(int column, int len) const =0
virtual void swap_index(int i, int j) const =0
void swap_index(int i, int j) const
SVC_Q(const svm_problem &prob, const svm_parameter ¶m, const schar *y_)
Qfloat * get_Q(int i, int len) const
SVR_Q(const svm_problem &prob, const svm_parameter ¶m)
Qfloat * get_Q(int i, int len) const
void swap_index(int i, int j) const
int select_working_set(int &i, int &j)
void Solve(int l, const QMatrix &Q, const double *p, const schar *y, double *alpha, double Cp, double Cn, double eps, SolutionInfo *si, int shrinking)
bool be_shrunk(int i, double Gmax1, double Gmax2, double Gmax3, double Gmax4)
virtual double calculate_rho()
bool is_upper_bound(int i)
virtual void do_shrinking()
void reconstruct_gradient()
virtual int select_working_set(int &i, int &j)
void update_alpha_status(int i)
bool is_lower_bound(int i)
void swap_index(int i, int j)
void Solve(int l, const QMatrix &Q, const double *p_, const schar *y_, double *alpha_, double Cp, double Cn, double eps, SolutionInfo *si, int shrinking)
bool be_shrunk(int i, double Gmax1, double Gmax2)
svm_model * svm_load_model(const char *model_file_name)
void svm_destroy_param(svm_parameter *param)
static void multiclass_probability(int k, double **r, double *p)
const char * svm_check_parameter(const svm_problem *prob, const svm_parameter *param)
static void solve_one_class(const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo *si)
int svm_get_svm_type(const svm_model *model)
void svm_get_labels(const svm_model *model, int *label)
static void svm_group_classes(const svm_problem *prob, int *nr_class_ret, int **label_ret, int **start_ret, int **count_ret, int *perm)
static double powi(double base, int times)
int svm_save_model(const char *model_file_name, const svm_model *model)
static const char * kernel_type_table[]
static double sigmoid_predict(double decision_value, double A, double B)
void svm_set_print_string_function(void(*print_func)(const char *))
static void solve_c_svc(const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo *si, double Cp, double Cn)
static decision_function svm_train_one(const svm_problem *prob, const svm_parameter *param, double Cp, double Cn)
static void sigmoid_train(int l, const double *dec_values, const double *labels, double &A, double &B)
void svm_free_and_destroy_model(svm_model **model_ptr_ptr)
svm_model * svm_train(const svm_problem *prob, const svm_parameter *param)
int svm_get_nr_sv(const svm_model *model)
int svm_check_probability_model(const svm_model *model)
static double svm_svr_probability(const svm_problem *prob, const svm_parameter *param)
double svm_predict_values(const svm_model *model, const svm_node *x, double *dec_values)
static char * readline(FILE *input)
double svm_predict_probability(const svm_model *model, const svm_node *x, double *prob_estimates)
static void solve_epsilon_svr(const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo *si)
void svm_cross_validation(const svm_problem *prob, const svm_parameter *param, int nr_fold, double *target)
static void(* svm_print_string)(const char *)
static void swap(T &x, T &y)
static const char * svm_type_table[]
static void solve_nu_svr(const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo *si)
double svm_predict(const svm_model *model, const svm_node *x)
double svm_get_svr_probability(const svm_model *model)
void svm_get_sv_indices(const svm_model *model, int *indices)
int svm_get_nr_class(const svm_model *model)
static void svm_binary_svc_probability(const svm_problem *prob, const svm_parameter *param, double Cp, double Cn, double &probA, double &probB)
static void print_string_stdout(const char *s)
static void clone(T *&dst, S *src, int n)
static void info(const char *fmt,...)
bool read_model_header(FILE *fp, svm_model *model)
void svm_free_model_content(svm_model *model_ptr)
static void solve_nu_svc(const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo *si)
#define FSCANF(_stream, _format, _var)
std::vector< deghosting::BImagePtr > threshold(const std::vector< deghosting::FImagePtr > &inputImages, const double threshold, const uint16_t flags)
Threshold function used for creating alpha masks for images.