summarylogtreecommitdiffstats
path: root/buildfix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'buildfix.patch')
-rw-r--r--buildfix.patch914
1 files changed, 914 insertions, 0 deletions
diff --git a/buildfix.patch b/buildfix.patch
new file mode 100644
index 000000000000..f93014ff9ea8
--- /dev/null
+++ b/buildfix.patch
@@ -0,0 +1,914 @@
+diff -ruN RNAmicro1.1.4/Makefile RNAmicro1.1.4a/Makefile
+--- RNAmicro1.1.4/Makefile 2014-08-07 09:00:31.000000000 +0200
++++ RNAmicro1.1.4a/Makefile 2015-09-19 13:32:15.872994369 +0200
+@@ -1,7 +1,7 @@
+ EXE = RNAmicro
+ CC = gcc
+ LL = g++
+-VERSION = 1.0
++VERSION = 1.1.4
+ DISTNAME= RNAmicro
+ WARN = -Wall -pedantic
+ CCFLAGS = -O1 -DUNUSED='' -g $(WARN)
+@@ -15,11 +15,13 @@
+ strand.c zscore.c descriptors.c
+ OBJS = $(foreach file, $(SRCS:.c=.o), $(file))
+ all: $(EXE)
+-$(EXE): $(OBJS)
++$(EXE): $(OBJS) svm.o
+ $(LL) $(CCFLAGS) $(LIBS) -o $(EXE) svm.o $(OBJS)
+ $(OBJS): %.o: %.c
+ $(CC) -c $(CCFLAGS) $< -o $@
++svm.o: svm.cpp svm.h
++ $(CC) -c $(CCFLAGS) svm.cpp -o svm.o
+ veryclean:
+ rm -f $(OBJS) $(EXE)
+ clean:
+- rm -f $(OBJS) core
++ rm -f $(OBJS) svm.o core
+diff -ruN RNAmicro1.1.4/fold.c RNAmicro1.1.4a/fold.c
+--- RNAmicro1.1.4/fold.c 2014-08-07 09:00:31.000000000 +0200
++++ RNAmicro1.1.4a/fold.c 2015-09-19 13:28:25.954382460 +0200
+@@ -783,7 +783,7 @@
+
+ /*---------------------------------------------------------------------------*/
+
+-inline int HairpinE(int size, int type, int si1, int sj1, const char *string) {
++int HairpinE(int size, int type, int si1, int sj1, const char *string) {
+ int energy;
+ energy = (size <= 30) ? P->hairpin[size] :
+ P->hairpin[30]+(int)(P->lxc*log((size)/30.));
+@@ -811,7 +811,7 @@
+
+ /*---------------------------------------------------------------------------*/
+
+-inline PRIVATE int oldLoopEnergy(int i, int j, int p, int q, int type, int type_2) {
++PRIVATE int oldLoopEnergy(int i, int j, int p, int q, int type, int type_2) {
+ /* compute energy of degree 2 loop (stack bulge or interior) */
+ int n1, n2, m, energy;
+ n1 = p-i-1;
+@@ -853,7 +853,7 @@
+
+ /*--------------------------------------------------------------------------*/
+
+-inline int LoopEnergy(int n1, int n2, int type, int type_2,
++int LoopEnergy(int n1, int n2, int type, int type_2,
+ int si1, int sj1, int sp1, int sq1) {
+ /* compute energy of degree 2 loop (stack bulge or interior) */
+ int nl, ns, energy;
+diff -ruN RNAmicro1.1.4/svm.cpp RNAmicro1.1.4a/svm.cpp
+--- RNAmicro1.1.4/svm.cpp 2014-08-07 09:03:56.000000000 +0200
++++ RNAmicro1.1.4a/svm.cpp 2015-09-19 13:26:10.468533764 +0200
+@@ -5,8 +5,6 @@
+ #include <float.h>
+ #include <string.h>
+ #include <stdarg.h>
+-#include <limits.h>
+-#include <locale.h>
+ #include "svm.h"
+ int libsvm_version = LIBSVM_VERSION;
+ typedef float Qfloat;
+@@ -74,7 +72,7 @@
+ // return some position p where [p,len) need to be filled
+ // (p >= len if nothing needs to be filled)
+ int get_data(const int index, Qfloat **data, int len);
+- void swap_index(int i, int j);
++ void swap_index(int i, int j);
+ private:
+ int l;
+ long int size;
+@@ -194,7 +192,7 @@
+ class QMatrix {
+ public:
+ virtual Qfloat *get_Q(int column, int len) const = 0;
+- virtual double *get_QD() const = 0;
++ virtual Qfloat *get_QD() const = 0;
+ virtual void swap_index(int i, int j) const = 0;
+ virtual ~QMatrix() {}
+ };
+@@ -207,7 +205,7 @@
+ static double k_function(const svm_node *x, const svm_node *y,
+ const svm_parameter& param);
+ virtual Qfloat *get_Q(int column, int len) const = 0;
+- virtual double *get_QD() const = 0;
++ virtual Qfloat *get_QD() const = 0;
+ virtual void swap_index(int i, int j) const // no so const...
+ {
+ swap(x[i],x[j]);
+@@ -414,7 +412,7 @@
+ char *alpha_status; // LOWER_BOUND, UPPER_BOUND, FREE
+ double *alpha;
+ const QMatrix *Q;
+- const double *QD;
++ const Qfloat *QD;
+ double eps;
+ double Cp,Cn;
+ double *p;
+@@ -444,7 +442,7 @@
+ virtual double calculate_rho();
+ virtual void do_shrinking();
+ private:
+- bool be_shrunk(int i, double Gmax1, double Gmax2);
++ bool be_shrunk(int i, double Gmax1, double Gmax2);
+ };
+
+ void Solver::swap_index(int i, int j)
+@@ -476,7 +474,7 @@
+ nr_free++;
+
+ if(2*nr_free < active_size)
+- info("\nWARNING: using -h 0 may be faster\n");
++ info("\nWarning: using -h 0 may be faster\n");
+
+ if (nr_free*l > 2*active_size*(l-active_size))
+ {
+@@ -558,10 +556,9 @@
+ // optimization step
+
+ int iter = 0;
+- int max_iter = max(10000000, l>INT_MAX/100 ? INT_MAX : 100*l);
+ int counter = min(l,1000)+1;
+-
+- while(iter < max_iter)
++
++ while(1)
+ {
+ // show progress and do shrinking
+
+@@ -601,7 +598,7 @@
+
+ if(y[i]!=y[j])
+ {
+- double quad_coef = QD[i]+QD[j]+2*Q_i[j];
++ double quad_coef = Q_i[i]+Q_j[j]+2*Q_i[j];
+ if (quad_coef <= 0)
+ quad_coef = TAU;
+ double delta = (-G[i]-G[j])/quad_coef;
+@@ -644,7 +641,7 @@
+ }
+ else
+ {
+- double quad_coef = QD[i]+QD[j]-2*Q_i[j];
++ double quad_coef = Q_i[i]+Q_j[j]-2*Q_i[j];
+ if (quad_coef <= 0)
+ quad_coef = TAU;
+ double delta = (G[i]-G[j])/quad_coef;
+@@ -728,18 +725,6 @@
+ }
+ }
+
+- if(iter >= max_iter)
+- {
+- if(active_size < l)
+- {
+- // reconstruct the whole gradient to calculate objective value
+- reconstruct_gradient();
+- active_size = l;
+- info("*");
+- }
+- fprintf(stderr,"\nWARNING: reaching max number of iterations\n");
+- }
+-
+ // calculate rho
+
+ si->rho = calculate_rho();
+@@ -833,8 +818,8 @@
+ Gmax2 = G[j];
+ if (grad_diff > 0)
+ {
+- double obj_diff;
+- double quad_coef = QD[i]+QD[j]-2.0*y[i]*Q_i[j];
++ double obj_diff;
++ double quad_coef=Q_i[i]+QD[j]-2.0*y[i]*Q_i[j];
+ if (quad_coef > 0)
+ obj_diff = -(grad_diff*grad_diff)/quad_coef;
+ else
+@@ -857,8 +842,8 @@
+ Gmax2 = -G[j];
+ if (grad_diff > 0)
+ {
+- double obj_diff;
+- double quad_coef = QD[i]+QD[j]+2.0*y[i]*Q_i[j];
++ double obj_diff;
++ double quad_coef=Q_i[i]+QD[j]+2.0*y[i]*Q_i[j];
+ if (quad_coef > 0)
+ obj_diff = -(grad_diff*grad_diff)/quad_coef;
+ else
+@@ -1006,7 +991,7 @@
+ //
+ // additional constraint: e^T \alpha = constant
+ //
+-class Solver_NU: public Solver
++class Solver_NU : public Solver
+ {
+ public:
+ Solver_NU() {}
+@@ -1085,8 +1070,8 @@
+ Gmaxp2 = G[j];
+ if (grad_diff > 0)
+ {
+- double obj_diff;
+- double quad_coef = QD[ip]+QD[j]-2*Q_ip[j];
++ double obj_diff;
++ double quad_coef = Q_ip[ip]+QD[j]-2*Q_ip[j];
+ if (quad_coef > 0)
+ obj_diff = -(grad_diff*grad_diff)/quad_coef;
+ else
+@@ -1109,8 +1094,8 @@
+ Gmaxn2 = -G[j];
+ if (grad_diff > 0)
+ {
+- double obj_diff;
+- double quad_coef = QD[in]+QD[j]-2*Q_in[j];
++ double obj_diff;
++ double quad_coef = Q_in[in]+QD[j]-2*Q_in[j];
+ if (quad_coef > 0)
+ obj_diff = -(grad_diff*grad_diff)/quad_coef;
+ else
+@@ -1271,9 +1256,9 @@
+ {
+ clone(y,y_,prob.l);
+ cache = new Cache(prob.l,(long int)(param.cache_size*(1<<20)));
+- QD = new double[prob.l];
++ QD = new Qfloat[prob.l];
+ for(int i=0;i<prob.l;i++)
+- QD[i] = (this->*kernel_function)(i,i);
++ QD[i]= (Qfloat)(this->*kernel_function)(i,i);
+ }
+
+ Qfloat *get_Q(int i, int len) const
+@@ -1288,7 +1273,7 @@
+ return data;
+ }
+
+- double *get_QD() const
++ Qfloat *get_QD() const
+ {
+ return QD;
+ }
+@@ -1310,7 +1295,7 @@
+ private:
+ schar *y;
+ Cache *cache;
+- double *QD;
++ Qfloat *QD;
+ };
+
+ class ONE_CLASS_Q: public Kernel
+@@ -1320,9 +1305,9 @@
+ :Kernel(prob.l, prob.x, param)
+ {
+ cache = new Cache(prob.l,(long int)(param.cache_size*(1<<20)));
+- QD = new double[prob.l];
++ QD = new Qfloat[prob.l];
+ for(int i=0;i<prob.l;i++)
+- QD[i] = (this->*kernel_function)(i,i);
++ QD[i]= (Qfloat)(this->*kernel_function)(i,i);
+ }
+
+ Qfloat *get_Q(int i, int len) const
+@@ -1337,7 +1322,7 @@
+ return data;
+ }
+
+- double *get_QD() const
++ Qfloat *get_QD() const
+ {
+ return QD;
+ }
+@@ -1356,7 +1341,7 @@
+ }
+ private:
+ Cache *cache;
+- double *QD;
++ Qfloat *QD;
+ };
+
+ class SVR_Q: public Kernel
+@@ -1367,7 +1352,7 @@
+ {
+ l = prob.l;
+ cache = new Cache(l,(long int)(param.cache_size*(1<<20)));
+- QD = new double[2*l];
++ QD = new Qfloat[2*l];
+ sign = new schar[2*l];
+ index = new int[2*l];
+ for(int k=0;k<l;k++)
+@@ -1376,8 +1361,8 @@
+ sign[k+l] = -1;
+ index[k] = k;
+ index[k+l] = k;
+- QD[k] = (this->*kernel_function)(k,k);
+- QD[k+l] = QD[k];
++ QD[k]= (Qfloat)(this->*kernel_function)(k,k);
++ QD[k+l]=QD[k];
+ }
+ buffer[0] = new Qfloat[2*l];
+ buffer[1] = new Qfloat[2*l];
+@@ -1410,7 +1395,7 @@
+ return buf;
+ }
+
+- double *get_QD() const
++ Qfloat *get_QD() const
+ {
+ return QD;
+ }
+@@ -1431,7 +1416,7 @@
+ int *index;
+ mutable int next_buffer;
+ Qfloat *buffer[2];
+- double *QD;
++ Qfloat *QD;
+ };
+
+ //
+@@ -1451,7 +1436,7 @@
+ {
+ alpha[i] = 0;
+ minus_ones[i] = -1;
+- if(prob->y[i] > 0) y[i] = +1; else y[i] = -1;
++ if(prob->y[i] > 0) y[i] = +1; else y[i]=-1;
+ }
+
+ Solver s;
+@@ -1641,7 +1626,7 @@
+ struct decision_function
+ {
+ double *alpha;
+- double rho;
++ double rho;
+ };
+
+ static decision_function svm_train_one(
+@@ -1701,6 +1686,30 @@
+ return f;
+ }
+
++//
++// svm_model
++//
++struct svm_model
++{
++ struct svm_parameter param; /* parameter */
++ int nr_class; /* number of classes, = 2 in regression/one class svm */
++ int l; /* total #SV */
++ struct svm_node **SV; /* SVs (SV[l]) */
++ double **sv_coef; /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
++ double *rho; /* constants in decision functions (rho[k*(k-1)/2]) */
++ double *probA; /* pariwise probability information */
++ double *probB;
++
++ /* for classification only */
++
++ int *label; /* label of each class (label[k]) */
++ int *nSV; /* number of SVs for each class (nSV[k]) */
++ /* nSV[0] + nSV[1] + ... + nSV[k-1] = l */
++ /* XXX */
++ int free_sv; /* 1 if svm_model is created by svm_load_model*/
++ /* 0 if svm_model is created by svm_train */
++};
++
+ // Platt's binary SVM Probablistic Output: an improvement from Lin et al.
+ static void sigmoid_train(
+ int l, const double *dec_values, const double *labels,
+@@ -1722,7 +1731,7 @@
+ double *t=Malloc(double,l);
+ double fApB,p,q,h11,h22,h21,g1,g2,det,dA,dB,gd,stepsize;
+ double newA,newB,newf,d1,d2;
+- int iter;
++ int iter;
+
+ // Initial Point and Initial Fun Value
+ A=0.0; B=log((prior0+1.0)/(prior1+1.0));
+@@ -1818,7 +1827,6 @@
+ static double sigmoid_predict(double decision_value, double A, double B)
+ {
+ double fApB = decision_value*A+B;
+- // 1-p used later; avoid catastrophic cancellation
+ if (fApB >= 0)
+ return exp(-fApB)/(1.0+exp(-fApB));
+ else
+@@ -1961,11 +1969,11 @@
+ struct svm_model *submodel = svm_train(&subprob,&subparam);
+ for(j=begin;j<end;j++)
+ {
+- svm_predict_values(submodel,prob->x[perm[j]],&(dec_values[perm[j]]));
++ svm_predict_values(submodel,prob->x[perm[j]],&(dec_values[perm[j]]));
+ // ensure +1 -1 order; reason not using CV subroutine
+ dec_values[perm[j]] *= submodel->label[0];
+ }
+- svm_free_and_destroy_model(&submodel);
++ svm_destroy_model(submodel);
+ svm_destroy_param(&subparam);
+ }
+ free(subprob.x);
+@@ -2018,7 +2026,7 @@
+ int nr_class = 0;
+ int *label = Malloc(int,max_nr_class);
+ int *count = Malloc(int,max_nr_class);
+- int *data_label = Malloc(int,l);
++ int *data_label = Malloc(int,l);
+ int i;
+
+ for(i=0;i<l;i++)
+@@ -2048,24 +2056,6 @@
+ }
+ }
+
+- //
+- // Labels are ordered by their first occurrence in the training set.
+- // However, for two-class sets with -1/+1 labels and -1 appears first,
+- // we swap labels to ensure that internally the binary SVM has positive data corresponding to the +1 instances.
+- //
+- if (nr_class == 2 && label[0] == -1 && label[1] == 1)
+- {
+- swap(label[0],label[1]);
+- swap(count[0],count[1]);
+- for(i=0;i<l;i++)
+- {
+- if(data_label[i] == 0)
+- data_label[i] = 1;
+- else
+- data_label[i] = 0;
+- }
+- }
+-
+ int *start = Malloc(int,nr_class);
+ start[0] = 0;
+ for(i=1;i<nr_class;i++)
+@@ -2125,14 +2115,12 @@
+ model->l = nSV;
+ model->SV = Malloc(svm_node *,nSV);
+ model->sv_coef[0] = Malloc(double,nSV);
+- model->sv_indices = Malloc(int,nSV);
+ int j = 0;
+ for(i=0;i<prob->l;i++)
+ if(fabs(f.alpha[i]) > 0)
+ {
+ model->SV[j] = prob->x[i];
+ model->sv_coef[0][j] = f.alpha[i];
+- model->sv_indices[j] = i+1;
+ ++j;
+ }
+
+@@ -2149,10 +2137,7 @@
+ int *perm = Malloc(int,l);
+
+ // group training data of the same class
+- svm_group_classes(prob,&nr_class,&label,&start,&count,perm);
+- if(nr_class == 1)
+- info("WARNING: training data in only one class. See README for details.\n");
+-
++ svm_group_classes(prob,&nr_class,&label,&start,&count,perm);
+ svm_node **x = Malloc(svm_node *,l);
+ int i;
+ for(i=0;i<l;i++)
+@@ -2170,7 +2155,7 @@
+ if(param->weight_label[i] == label[j])
+ break;
+ if(j == nr_class)
+- fprintf(stderr,"WARNING: class label %d specified in weight is not found\n", param->weight_label[i]);
++ fprintf(stderr,"warning: class label %d specified in weight is not found\n", param->weight_label[i]);
+ else
+ weighted_C[j] *= param->weight[i];
+ }
+@@ -2274,14 +2259,9 @@
+
+ model->l = total_sv;
+ model->SV = Malloc(svm_node *,total_sv);
+- model->sv_indices = Malloc(int,total_sv);
+ p = 0;
+ for(i=0;i<l;i++)
+- if(nonzero[i])
+- {
+- model->SV[p] = x[i];
+- model->sv_indices[p++] = perm[i] + 1;
+- }
++ if(nonzero[i]) model->SV[p++] = x[i];
+
+ int *nz_start = Malloc(int,nr_class);
+ nz_start[0] = 0;
+@@ -2339,16 +2319,11 @@
+ void svm_cross_validation(const svm_problem *prob, const svm_parameter *param, int nr_fold, double *target)
+ {
+ int i;
+- int *fold_start;
++ int *fold_start = Malloc(int,nr_fold+1);
+ int l = prob->l;
+ int *perm = Malloc(int,l);
+ int nr_class;
+- if (nr_fold > l)
+- {
+- nr_fold = l;
+- fprintf(stderr,"WARNING: # folds > # data. Will use # folds = # data instead (i.e., leave-one-out cross validation)\n");
+- }
+- fold_start = Malloc(int,nr_fold+1);
++
+ // stratified cv may not give leave-one-out rate
+ // Each class to l folds -> some folds may have zero elements
+ if((param->svm_type == C_SVC ||
+@@ -2394,9 +2369,9 @@
+ fold_start[0]=0;
+ for (i=1;i<=nr_fold;i++)
+ fold_start[i] = fold_start[i-1]+fold_count[i-1];
+- free(start);
++ free(start);
+ free(label);
+- free(count);
++ free(count);
+ free(index);
+ free(fold_count);
+ }
+@@ -2443,17 +2418,17 @@
+ double *prob_estimates=Malloc(double,svm_get_nr_class(submodel));
+ for(j=begin;j<end;j++)
+ target[perm[j]] = svm_predict_probability(submodel,prob->x[perm[j]],prob_estimates);
+- free(prob_estimates);
++ free(prob_estimates);
+ }
+ else
+ for(j=begin;j<end;j++)
+ target[perm[j]] = svm_predict(submodel,prob->x[perm[j]]);
+- svm_free_and_destroy_model(&submodel);
++ svm_destroy_model(submodel);
+ free(subprob.x);
+ free(subprob.y);
+ }
+ free(fold_start);
+- free(perm);
++ free(perm);
+ }
+
+
+@@ -2474,18 +2449,6 @@
+ label[i] = model->label[i];
+ }
+
+-void svm_get_sv_indices(const svm_model *model, int* indices)
+-{
+- if (model->sv_indices != NULL)
+- for(int i=0;i<model->l;i++)
+- indices[i] = model->sv_indices[i];
+-}
+-
+-int svm_get_nr_sv(const svm_model *model)
+-{
+- return model->l;
+-}
+-
+ double svm_get_svr_probability(const svm_model *model)
+ {
+ if ((model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) &&
+@@ -2500,14 +2463,13 @@
+
+ double svm_predict_values(const svm_model *model, const svm_node *x, double* dec_values)
+ {
+- int i;
+ if(model->param.svm_type == ONE_CLASS ||
+ model->param.svm_type == EPSILON_SVR ||
+ model->param.svm_type == NU_SVR)
+ {
+ double *sv_coef = model->sv_coef[0];
+ double sum = 0;
+- for(i=0;i<model->l;i++)
++ for(int i=0;i<model->l;i++)
+ sum += sv_coef[i] * Kernel::k_function(x,model->SV[i],model->param);
+ sum -= model->rho[0];
+ *dec_values = sum;
+@@ -2519,6 +2481,7 @@
+ }
+ else
+ {
++ int i;
+ int nr_class = model->nr_class;
+ int l = model->l;
+
+@@ -2621,7 +2584,7 @@
+ for(i=0;i<nr_class;i++)
+ free(pairwise_prob[i]);
+ free(dec_values);
+- free(pairwise_prob);
++ free(pairwise_prob);
+ return model->label[prob_max_idx];
+ }
+ else
+@@ -2643,9 +2606,6 @@
+ FILE *fp = fopen(model_file_name,"w");
+ if(fp==NULL) return -1;
+
+- char *old_locale = strdup(setlocale(LC_ALL, NULL));
+- setlocale(LC_ALL, "C");
+-
+ const svm_parameter& param = model->param;
+
+ fprintf(fp,"svm_type %s\n", svm_type_table[param.svm_type]);
+@@ -2724,10 +2684,6 @@
+ }
+ fprintf(fp, "\n");
+ }
+-
+- setlocale(LC_ALL, old_locale);
+- free(old_locale);
+-
+ if (ferror(fp) != 0 || fclose(fp) != 0) return -1;
+ else return 0;
+ }
+@@ -2753,25 +2709,29 @@
+ return line;
+ }
+
+-//
+-// FSCANF helps to handle fscanf failures.
+-// Its do-while block avoids the ambiguity when
+-// if (...)
+-// FSCANF();
+-// is used
+-//
+-#define FSCANF(_stream, _format, _var) do{ if (fscanf(_stream, _format, _var) != 1) return false; }while(0)
+-bool read_model_header(FILE *fp, svm_model* model)
++svm_model *svm_load_model(const char *model_file_name)
+ {
++ FILE *fp = fopen(model_file_name,"rb");
++ if(fp==NULL) return NULL;
++
++ // read parameters
++
++ svm_model *model = Malloc(svm_model,1);
+ svm_parameter& param = model->param;
++ model->rho = NULL;
++ model->probA = NULL;
++ model->probB = NULL;
++ model->label = NULL;
++ model->nSV = NULL;
++
+ char cmd[81];
+ while(1)
+ {
+- FSCANF(fp,"%80s",cmd);
++ fscanf(fp,"%80s",cmd);
+
+ if(strcmp(cmd,"svm_type")==0)
+ {
+- FSCANF(fp,"%80s",cmd);
++ fscanf(fp,"%80s",cmd);
+ int i;
+ for(i=0;svm_type_table[i];i++)
+ {
+@@ -2784,12 +2744,16 @@
+ if(svm_type_table[i] == NULL)
+ {
+ fprintf(stderr,"unknown svm type.\n");
+- return false;
++ free(model->rho);
++ free(model->label);
++ free(model->nSV);
++ free(model);
++ return NULL;
+ }
+ }
+ else if(strcmp(cmd,"kernel_type")==0)
+ {
+- FSCANF(fp,"%80s",cmd);
++ fscanf(fp,"%80s",cmd);
+ int i;
+ for(i=0;kernel_type_table[i];i++)
+ {
+@@ -2801,106 +2765,79 @@
+ }
+ if(kernel_type_table[i] == NULL)
+ {
+- fprintf(stderr,"unknown kernel function.\n");
+- return false;
++ fprintf(stderr,"unknown kernel function.\n");
++ free(model->rho);
++ free(model->label);
++ free(model->nSV);
++ free(model);
++ return NULL;
+ }
+ }
+ else if(strcmp(cmd,"degree")==0)
+- FSCANF(fp,"%d",&param.degree);
++ fscanf(fp,"%d",&param.degree);
+ else if(strcmp(cmd,"gamma")==0)
+- FSCANF(fp,"%lf",&param.gamma);
++ fscanf(fp,"%lf",&param.gamma);
+ else if(strcmp(cmd,"coef0")==0)
+- FSCANF(fp,"%lf",&param.coef0);
++ fscanf(fp,"%lf",&param.coef0);
+ else if(strcmp(cmd,"nr_class")==0)
+- FSCANF(fp,"%d",&model->nr_class);
++ fscanf(fp,"%d",&model->nr_class);
+ else if(strcmp(cmd,"total_sv")==0)
+- FSCANF(fp,"%d",&model->l);
++ fscanf(fp,"%d",&model->l);
+ else if(strcmp(cmd,"rho")==0)
+ {
+ int n = model->nr_class * (model->nr_class-1)/2;
+ model->rho = Malloc(double,n);
+ for(int i=0;i<n;i++)
+- FSCANF(fp,"%lf",&model->rho[i]);
++ fscanf(fp,"%lf",&model->rho[i]);
+ }
+ else if(strcmp(cmd,"label")==0)
+ {
+ int n = model->nr_class;
+ model->label = Malloc(int,n);
+ for(int i=0;i<n;i++)
+- FSCANF(fp,"%d",&model->label[i]);
++ fscanf(fp,"%d",&model->label[i]);
+ }
+ else if(strcmp(cmd,"probA")==0)
+ {
+ int n = model->nr_class * (model->nr_class-1)/2;
+ model->probA = Malloc(double,n);
+ for(int i=0;i<n;i++)
+- FSCANF(fp,"%lf",&model->probA[i]);
++ fscanf(fp,"%lf",&model->probA[i]);
+ }
+ else if(strcmp(cmd,"probB")==0)
+ {
+ int n = model->nr_class * (model->nr_class-1)/2;
+ model->probB = Malloc(double,n);
+ for(int i=0;i<n;i++)
+- FSCANF(fp,"%lf",&model->probB[i]);
++ fscanf(fp,"%lf",&model->probB[i]);
+ }
+ else if(strcmp(cmd,"nr_sv")==0)
+ {
+ int n = model->nr_class;
+ model->nSV = Malloc(int,n);
+ for(int i=0;i<n;i++)
+- FSCANF(fp,"%d",&model->nSV[i]);
++ fscanf(fp,"%d",&model->nSV[i]);
+ }
+ else if(strcmp(cmd,"SV")==0)
+ {
+ while(1)
+ {
+ int c = getc(fp);
+- if(c==EOF || c=='\n') break;
++ if(c==EOF || c=='\n') break;
+ }
+ break;
+ }
+ else
+ {
+ fprintf(stderr,"unknown text in model file: [%s]\n",cmd);
+- return false;
++ free(model->rho);
++ free(model->label);
++ free(model->nSV);
++ free(model);
++ return NULL;
+ }
+ }
+
+- return true;
+-
+-}
+-
+-svm_model *svm_load_model(const char *model_file_name)
+-{
+- FILE *fp = fopen(model_file_name,"rb");
+- if(fp==NULL) return NULL;
+-
+- char *old_locale = strdup(setlocale(LC_ALL, NULL));
+- setlocale(LC_ALL, "C");
+-
+- // read parameters
+-
+- svm_model *model = Malloc(svm_model,1);
+- model->rho = NULL;
+- model->probA = NULL;
+- model->probB = NULL;
+- model->sv_indices = NULL;
+- model->label = NULL;
+- model->nSV = NULL;
+-
+- // read header
+- if (!read_model_header(fp, model))
+- {
+- fprintf(stderr, "ERROR: fscanf failed to read model\n");
+- setlocale(LC_ALL, old_locale);
+- free(old_locale);
+- free(model->rho);
+- free(model->label);
+- free(model->nSV);
+- free(model);
+- return NULL;
+- }
+-
+ // read sv_coef and SV
+
+ int elements = 0;
+@@ -2965,9 +2902,6 @@
+ }
+ free(line);
+
+- setlocale(LC_ALL, old_locale);
+- free(old_locale);
+-
+ if (ferror(fp) != 0 || fclose(fp) != 0)
+ return NULL;
+
+@@ -2975,49 +2909,20 @@
+ return model;
+ }
+
+-void svm_free_model_content(svm_model* model_ptr)
+-{
+- if(model_ptr->free_sv && model_ptr->l > 0 && model_ptr->SV != NULL)
+- free((void *)(model_ptr->SV[0]));
+- if(model_ptr->sv_coef)
+- {
+- for(int i=0;i<model_ptr->nr_class-1;i++)
+- free(model_ptr->sv_coef[i]);
+- }
+-
+- free(model_ptr->SV);
+- model_ptr->SV = NULL;
+-
+- free(model_ptr->sv_coef);
+- model_ptr->sv_coef = NULL;
+-
+- free(model_ptr->rho);
+- model_ptr->rho = NULL;
+-
+- free(model_ptr->label);
+- model_ptr->label= NULL;
+-
+- free(model_ptr->probA);
+- model_ptr->probA = NULL;
+-
+- free(model_ptr->probB);
+- model_ptr->probB= NULL;
+-
+- free(model_ptr->sv_indices);
+- model_ptr->sv_indices = NULL;
+-
+- free(model_ptr->nSV);
+- model_ptr->nSV = NULL;
+-}
+-
+-void svm_free_and_destroy_model(svm_model** model_ptr_ptr)
++void svm_destroy_model(svm_model* model)
+ {
+- if(model_ptr_ptr != NULL && *model_ptr_ptr != NULL)
+- {
+- svm_free_model_content(*model_ptr_ptr);
+- free(*model_ptr_ptr);
+- *model_ptr_ptr = NULL;
+- }
++ if(model->free_sv && model->l > 0)
++ free((void *)(model->SV[0]));
++ for(int i=0;i<model->nr_class-1;i++)
++ free(model->sv_coef[i]);
++ free(model->SV);
++ free(model->sv_coef);
++ free(model->rho);
++ free(model->label);
++ free(model->probA);
++ free(model->probB);
++ free(model->nSV);
++ free(model);
+ }
+
+ void svm_destroy_param(svm_parameter* param)
+diff -ruN RNAmicro1.1.4/svm.h RNAmicro1.1.4a/svm.h
+--- RNAmicro1.1.4/svm.h 2014-08-07 09:00:31.000000000 +0200
++++ RNAmicro1.1.4a/svm.h 2015-09-19 13:26:06.338558698 +0200
+@@ -1,10 +1,14 @@
+ #ifndef _LIBSVM_H
+ #define _LIBSVM_H
+
++#define LIBSVM_VERSION 291
++
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+
++extern int libsvm_version;
++
+ struct svm_node
+ {
+ int index;
+@@ -53,7 +57,7 @@
+ void svm_get_labels(const struct svm_model *model, int *label);
+ double svm_get_svr_probability(const struct svm_model *model);
+
+-void svm_predict_values(const struct svm_model *model, const struct svm_node *x, double* dec_values);
++double svm_predict_values(const struct svm_model *model, const struct svm_node *x, double* dec_values);
+ double svm_predict(const struct svm_model *model, const struct svm_node *x);
+ double svm_predict_probability(const struct svm_model *model, const struct svm_node *x, double* prob_estimates);
+
+@@ -63,6 +67,8 @@
+ const char *svm_check_parameter(const struct svm_problem *prob, const struct svm_parameter *param);
+ int svm_check_probability_model(const struct svm_model *model);
+
++void svm_set_print_string_function(void (*print_func)(const char *));
++
+ #ifdef __cplusplus
+ }
+ #endif