From: <cli...@li...> - 2009-04-03 12:02:58
|
Send clisp-cvs mailing list submissions to cli...@li... To subscribe or unsubscribe via the World Wide Web, visit https://lists.sourceforge.net/lists/listinfo/clisp-cvs or, via email, send a message with subject or body 'help' to cli...@li... You can reach the person managing the list at cli...@li... When replying, please edit your Subject line so it is more specific than "Re: Contents of clisp-cvs digest..." CLISP CVS commits for today Today's Topics: 1. clisp/src ChangeLog, 1.6835, 1.6836 constsym.d, 1.378, 1.379 subr.d, 1.262, 1.263 threads.lisp, 1.13, 1.14 zthread.d, 1.38, 1.39 (Vladimir Tzankov) 2. clisp/src ChangeLog,1.6836,1.6837 NEWS,1.498,1.499 (Sam Steingold) 3. clisp/modules/libsvm COPYRIGHT, 1.5, 1.6 README, 1.6, 1.7 libsvm.lisp, 1.15, 1.16 svm.cpp, 1.9, 1.10 svm.h, 1.6, 1.7 svm.xml, 1.14, 1.15 (Sam Steingold) ---------------------------------------------------------------------- Message: 1 Date: Thu, 02 Apr 2009 18:58:24 +0000 From: Vladimir Tzankov <vt...@us...> Subject: clisp/src ChangeLog, 1.6835, 1.6836 constsym.d, 1.378, 1.379 subr.d, 1.262, 1.263 threads.lisp, 1.13, 1.14 zthread.d, 1.38, 1.39 To: cli...@li... Message-ID: <E1L...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv9610/src Modified Files: ChangeLog constsym.d subr.d threads.lisp zthread.d Log Message: [MULTITHREAD]: remove functions not suitable for preemptive MT Index: subr.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/subr.d,v retrieving revision 1.262 retrieving revision 1.263 diff -u -d -r1.262 -r1.263 --- subr.d 16 Jan 2009 16:00:53 -0000 1.262 +++ subr.d 2 Apr 2009 18:58:22 -0000 1.263 @@ -1422,7 +1422,6 @@ #ifdef MULTITHREAD LISPFUN(make_thread,seclass_default,1,0,norest,key,4, (kw(name),kw(initial_bindings),kw(cstack_size),kw(vstack_size))) -LISPFUN(thread_wait,seclass_default,3,0,rest,nokey,0,NIL) LISPFUNN(call_with_timeout,3) LISPFUNN(thread_yield,0) LISPFUNN(thread_kill,1) @@ -1430,7 +1429,6 @@ LISPFUNN(threadp,1) LISPFUNN(thread_name,1) LISPFUNN(thread_active_p,1) -LISPFUNN(thread_state,1) LISPFUNN(current_thread,0) LISPFUNN(list_threads,0) LISPFUNNR(symbol_value_thread,2) Index: zthread.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/zthread.d,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- zthread.d 27 Feb 2009 12:28:44 -0000 1.38 +++ zthread.d 2 Apr 2009 18:58:22 -0000 1.39 @@ -406,15 +406,6 @@ #endif } -LISPFUN(thread_wait,seclass_default,3,0,rest,nokey,0,NIL) -{ /* (THREAD-WAIT whostate timeout predicate &rest arguments) - predicate may be a LOCK structure in which case we wait for its release - timeout maybe NIL in which case we wait forever */ - /* set whostate! */ - /* Probbaly this will go entirely in LISP when locks are ready. */ - NOTREACHED; -} - LISPFUNN(thread_yield,0) { /* (THREAD-YIELD) */ begin_blocking_system_call(); /* give GC chance */ @@ -515,11 +506,6 @@ VALUES_IF(TheThread(obj)->xth_globals != NULL); } -LISPFUNN(thread_state,1) -{ /* (THREAD-STATE thread) */ - NOTREACHED; -} - LISPFUNN(current_thread,0) { /* (CURRENT-THREAD) */ VALUES1(current_thread()->_lthread); Index: constsym.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/constsym.d,v retrieving revision 1.378 retrieving revision 1.379 diff -u -d -r1.378 -r1.379 --- constsym.d 5 Dec 2008 16:16:38 -0000 1.378 +++ constsym.d 2 Apr 2009 18:58:22 -0000 1.379 @@ -1199,7 +1199,6 @@ #ifdef MULTITHREAD LISPSYM(thread,"THREAD",mt) /* type for THREAD */ LISPSYM(make_thread,"MAKE-THREAD",mt) -LISPSYM(thread_wait,"THREAD-WAIT",mt) LISPSYM(call_with_timeout,"CALL-WITH-TIMEOUT",mt) /* ABI */ LISPSYM(thread_yield,"THREAD-YIELD",mt) LISPSYM(thread_kill,"THREAD-KILL",mt) @@ -1207,7 +1206,6 @@ LISPSYM(threadp,"THREADP",mt) LISPSYM(thread_name,"THREAD-NAME",mt) LISPSYM(thread_active_p,"THREAD-ACTIVE-P",mt) -LISPSYM(thread_state,"THREAD-STATE",mt) LISPSYM(thread_whostate_symbol,"*THREAD-WHOSTATE*",mt) LISPSYM(current_thread,"CURRENT-THREAD",mt) LISPSYM(list_threads,"LIST-THREADS",mt) Index: threads.lisp =================================================================== RCS file: /cvsroot/clisp/clisp/src/threads.lisp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- threads.lisp 25 Dec 2008 21:00:56 -0000 1.13 +++ threads.lisp 2 Apr 2009 18:58:22 -0000 1.14 @@ -3,15 +3,13 @@ (defpackage "THREADS" (:nicknames "MT" "MP") (:use "COMMON-LISP" "EXT") - (:export "THREAD" "MAKE-THREAD" "THREAD-WAIT" - "THREADP" "THREAD-YIELD" "THREAD-KILL" - "THREAD-INTERRUPT" "THREADP" "THREAD-NAME" - "THREAD-ACTIVE-P" "THREAD-WHOSTATE" "CURRENT-THREAD" "LIST-THREADS" + (:export "THREAD" "MAKE-THREAD" "THREADP" "THREAD-YIELD" "THREAD-KILL" + "THREAD-INTERRUPT" "THREADP" "THREAD-NAME" "THREAD-ACTIVE-P" + "CURRENT-THREAD" "LIST-THREADS" "MUTEX" "MUTEXP" "MAKE-MUTEX" "MUTEX-LOCK" "MUTEX-UNLOCK" - "MUTEX-OWNER" "MUTEX-RECURSIVE-P" + "MUTEX-OWNER" "MUTEX-RECURSIVE-P" "WITH-LOCK" "EXEMPTION" "EXEMPTIONP" "MAKE-EXEMPTION" "EXEMPTION-SIGNAL" "EXEMPTION-WAIT" "EXEMPTION-BROADCAST" - "MAKE-LOCK" "THREAD-LOCK" "THREAD-UNLOCK" "WITH-LOCK" "Y-OR-N-P-TIMEOUT" "YES-OR-NO-P-TIMEOUT" "WITH-TIMEOUT" "SYMBOL-VALUE-THREAD" "*DEFAULT-SPECIAL-BINDINGS*")) @@ -31,16 +29,12 @@ ;; the value will be initialized from the runtime (defvar *DEFAULT-VALUE-STACK-SIZE*) -;; declare special variable for thread's whostate -(defvar *THREAD-WHOSTATE* nil) - ;; TODO: add more variables (something should done about the ;; standartd input/output streams. (defvar *DEFAULT-SPECIAL-BINDINGS* '((*random-state* . (make-random-state nil)) (*gensym-counter* . 0) (ext::*command-index* . 0) - (*thread-whostate* . nil) (*print-base* . 10) (*print-length* . nil) (*print-level* . nil) @@ -56,9 +50,6 @@ (defsetf SYMBOL-VALUE-THREAD MT::SET-SYMBOL-VALUE-THREAD) -(defun thread-whostate (thread) - (symbol-value-thread *thread-whostate* thread)) - (defmacro with-timeout ((seconds &body timeout-forms) &body body) "Execute BODY; if execution takes more than SECONDS seconds, terminate and evaluate TIMEOUT-FORMS." Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6835 retrieving revision 1.6836 diff -u -d -r1.6835 -r1.6836 --- ChangeLog 23 Mar 2009 08:31:52 -0000 1.6835 +++ ChangeLog 2 Apr 2009 18:58:14 -0000 1.6836 @@ -1,3 +1,12 @@ +2009-04-02 Vladimir Tzankov <vtz...@gm...> + + [MULTITHREAD]: remove functions not suitable for preemptive MT + * zthread.d (THREAD-WAIT, THREAD-STATE) [MULTITHREAD]: remove + * constsym.d (THREAD-WAIT, THREAD-STATE) [MULTITHREAD]: ditto + * subr.d (THREAD-WAIT, THREAD-STATE) [MULTITHREAD]: ditto + * threads.lisp (*THREAD-WHOSTATE*, THREAD-WHOSTATE MAKE-LOCK) + (THREAD-LOCK, THREAD-UNLOCK) [MULTITHREAD]: remove + 2009-03-23 Vladimir Tzankov <vtz...@gm...> [MULTITHREAD]: Fix uninitialized package mutexes ------------------------------ Message: 2 Date: Fri, 03 Apr 2009 01:29:31 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.6836,1.6837 NEWS,1.498,1.499 To: cli...@li... Message-ID: <E1L...@dd...> Update of /cvsroot/clisp/clisp/src In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv340/src Modified Files: ChangeLog NEWS Log Message: Upgrade libsvm to 2.89 Index: NEWS =================================================================== RCS file: /cvsroot/clisp/clisp/src/NEWS,v retrieving revision 1.498 retrieving revision 1.499 diff -u -d -r1.498 -r1.499 --- NEWS 25 Feb 2009 21:34:04 -0000 1.498 +++ NEWS 3 Apr 2009 01:29:28 -0000 1.499 @@ -1,6 +1,9 @@ Important notes --------------- +* Module libsvm has been upgraded to the upstream version 2.89. + See <http://clisp.cons.org/impnotes/libsvm.html> for details. + * Module Berkeley-DB now supports Berkeley DB 4.7. (older versions 4.* are, of course, still supported). See <http://clisp.cons.org/impnotes/berkeley-db.html> for details. Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.6836 retrieving revision 1.6837 diff -u -d -r1.6836 -r1.6837 --- ChangeLog 2 Apr 2009 18:58:14 -0000 1.6836 +++ ChangeLog 3 Apr 2009 01:29:24 -0000 1.6837 @@ -1,3 +1,8 @@ +2009-04-02 Sam Steingold <sd...@gn...> + + * modules/libsvm/libsvm.lisp: Upgrade libsvm to 2.89 + (svm_print_string): renamed from print_string + 2009-04-02 Vladimir Tzankov <vtz...@gm...> [MULTITHREAD]: remove functions not suitable for preemptive MT ------------------------------ Message: 3 Date: Fri, 03 Apr 2009 01:29:32 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/modules/libsvm COPYRIGHT, 1.5, 1.6 README, 1.6, 1.7 libsvm.lisp, 1.15, 1.16 svm.cpp, 1.9, 1.10 svm.h, 1.6, 1.7 svm.xml, 1.14, 1.15 To: cli...@li... Message-ID: <E1L...@dd...> Update of /cvsroot/clisp/clisp/modules/libsvm In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv340/modules/libsvm Modified Files: COPYRIGHT README libsvm.lisp svm.cpp svm.h svm.xml Log Message: Upgrade libsvm to 2.89 Index: COPYRIGHT =================================================================== RCS file: /cvsroot/clisp/clisp/modules/libsvm/COPYRIGHT,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- COPYRIGHT 29 Jun 2008 18:00:50 -0000 1.5 +++ COPYRIGHT 3 Apr 2009 01:29:29 -0000 1.6 @@ -1,6 +1,5 @@ -This copyright note covers README, svm.cpp and svm.h. -Copyright (c) 2000-2008 Chih-Chung Chang and Chih-Jen Lin +Copyright (c) 2000-2009 Chih-Chung Chang and Chih-Jen Lin All rights reserved. Redistribution and use in source and binary forms, with or without Index: svm.h =================================================================== RCS file: /cvsroot/clisp/clisp/modules/libsvm/svm.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- svm.h 22 Dec 2008 20:29:23 -0000 1.6 +++ svm.h 3 Apr 2009 01:29:30 -0000 1.7 @@ -1,7 +1,7 @@ #ifndef _LIBSVM_H #define _LIBSVM_H -#define LIBSVM_VERSION 288 +#define LIBSVM_VERSION 289 #ifdef __cplusplus extern "C" { @@ -67,7 +67,7 @@ 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); -extern void (*print_string) (const char *); +extern void (*svm_print_string) (const char *); #ifdef __cplusplus } Index: svm.cpp =================================================================== RCS file: /cvsroot/clisp/clisp/modules/libsvm/svm.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- svm.cpp 22 Dec 2008 20:29:23 -0000 1.9 +++ svm.cpp 3 Apr 2009 01:29:30 -0000 1.10 @@ -23,25 +23,25 @@ } inline double powi(double base, int times) { - double tmp = base, ret = 1.0; + double tmp = base, ret = 1.0; - for(int t=times; t>0; t/=2) + for(int t=times; t>0; t/=2) { - if(t%2==1) ret*=tmp; - tmp = tmp * tmp; - } - return ret; + if(t%2==1) ret*=tmp; + tmp = tmp * tmp; + } + return ret; } #define INF HUGE_VAL #define TAU 1e-12 #define Malloc(type,n) (type *)malloc((n)*sizeof(type)) -void print_string_stdout (const char *s); -void print_string_stdout (const char *s) + +static void print_string_stdout(const char *s) { fputs(s,stdout); fflush(stdout); } -void (*print_string) (const char *) = &print_string_stdout; +void (*svm_print_string) (const char *) = &print_string_stdout; #if 1 static void info(const char *fmt,...) { @@ -50,10 +50,10 @@ va_start(ap,fmt); vsprintf(buf,fmt,ap); va_end(ap); - (*print_string)(buf); + (*svm_print_string)(buf); } #else -static void info(char *fmt,...) {} +static void info(const char *fmt,...) {} #endif // @@ -72,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; @@ -306,7 +306,7 @@ ++py; else ++px; - } + } } return sum; } @@ -335,7 +335,7 @@ else { if(x->index > y->index) - { + { sum += y->value * y->value; ++y; } @@ -358,7 +358,7 @@ sum += y->value * y->value; ++y; } - + return exp(-param.gamma*sum); } case SIGMOID: @@ -366,7 +366,7 @@ case PRECOMPUTED: //x: test (validation), y: SV return x[(int)(y->value)].value; default: - return 0; // Unreachable + return 0; // Unreachable } } @@ -442,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) @@ -582,11 +582,11 @@ else counter = 1; // do shrinking next iteration } - + ++iter; // update alpha[i] and alpha[j], handle bounds carefully - + const Qfloat *Q_i = Q.get_Q(i,active_size); const Qfloat *Q_j = Q.get_Q(j,active_size); @@ -605,7 +605,7 @@ double diff = alpha[i] - alpha[j]; alpha[i] += delta; alpha[j] += delta; - + if(diff > 0) { if(alpha[j] < 0) @@ -687,7 +687,7 @@ double delta_alpha_i = alpha[i] - old_alpha_i; double delta_alpha_j = alpha[j] - old_alpha_j; - + for(int k=0;k<active_size;k++) { G[k] += Q_i[k]*delta_alpha_i + Q_j[k]*delta_alpha_j; @@ -775,7 +775,7 @@ // j: minimizes the decrease of obj value // (if quadratic coefficeint <= 0, replace it with tau) // -y_j*grad(f)_j < -y_i*grad(f)_i, j in I_low(\alpha) - + double Gmax = -INF; double Gmax2 = -INF; int Gmax_idx = -1; @@ -783,7 +783,7 @@ double obj_diff_min = INF; for(int t=0;t<active_size;t++) - if(y[t]==+1) + if(y[t]==+1) { if(!is_upper_bound(t)) if(-G[t] >= Gmax) @@ -818,7 +818,7 @@ Gmax2 = G[j]; if (grad_diff > 0) { - double obj_diff; + 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; @@ -842,7 +842,7 @@ Gmax2 = -G[j]; if (grad_diff > 0) { - double obj_diff; + 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; @@ -880,7 +880,7 @@ { if(y[i]==+1) return(G[i] > Gmax2); - else + else return(G[i] > Gmax1); } else @@ -896,27 +896,27 @@ // find maximal violating pair first for(i=0;i<active_size;i++) { - if(y[i]==+1) + if(y[i]==+1) { - if(!is_upper_bound(i)) + if(!is_upper_bound(i)) { if(-G[i] >= Gmax1) Gmax1 = -G[i]; } - if(!is_lower_bound(i)) + if(!is_lower_bound(i)) { if(G[i] >= Gmax2) Gmax2 = G[i]; } } - else + else { - if(!is_upper_bound(i)) + if(!is_upper_bound(i)) { if(-G[i] >= Gmax2) Gmax2 = -G[i]; } - if(!is_lower_bound(i)) + if(!is_lower_bound(i)) { if(G[i] >= Gmax1) Gmax1 = G[i]; @@ -924,7 +924,7 @@ } } - if(unshrink == false && Gmax1 + Gmax2 <= eps*10) + if(unshrink == false && Gmax1 + Gmax2 <= eps*10) { unshrink = true; reconstruct_gradient(); @@ -1063,14 +1063,14 @@ { if(y[j]==+1) { - if (!is_lower_bound(j)) + if (!is_lower_bound(j)) { double grad_diff=Gmaxp+G[j]; if (G[j] >= Gmaxp2) Gmaxp2 = G[j]; if (grad_diff > 0) { - double obj_diff; + 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; @@ -1094,7 +1094,7 @@ Gmaxn2 = -G[j]; if (grad_diff > 0) { - double obj_diff; + 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; @@ -1112,7 +1112,7 @@ } if(max(Gmaxp+Gmaxp2,Gmaxn+Gmaxn2) < eps) - return 1; + return 1; if (y[Gmin_idx] == +1) out_i = Gmaxp_idx; @@ -1129,14 +1129,14 @@ { if(y[i]==+1) return(-G[i] > Gmax1); - else + else return(-G[i] > Gmax4); } else if(is_lower_bound(i)) { if(y[i]==+1) return(G[i] > Gmax2); - else + else return(G[i] > Gmax3); } else @@ -1165,14 +1165,14 @@ if(!is_lower_bound(i)) { if(y[i]==+1) - { + { if(G[i] > Gmax2) Gmax2 = G[i]; } else if(G[i] > Gmax3) Gmax3 = G[i]; } } - if(unshrink == false && max(Gmax1+Gmax2,Gmax3+Gmax4) <= eps*10) + if(unshrink == false && max(Gmax1+Gmax2,Gmax3+Gmax4) <= eps*10) { unshrink = true; reconstruct_gradient(); @@ -1235,12 +1235,12 @@ r1 = sum_free1/nr_free1; else r1 = (ub1+lb1)/2; - + if(nr_free2 > 0) r2 = sum_free2/nr_free2; else r2 = (ub2+lb2)/2; - + si->r = (r1+r2)/2; return (r1-r2)/2; } @@ -1249,7 +1249,7 @@ // Q matrices for various formulations // class SVC_Q: public Kernel -{ +{ public: SVC_Q(const svm_problem& prob, const svm_parameter& param, const schar *y_) :Kernel(prob.l, prob.x, param) @@ -1260,7 +1260,7 @@ for(int i=0;i<prob.l;i++) QD[i]= (Qfloat)(this->*kernel_function)(i,i); } - + Qfloat *get_Q(int i, int len) const { Qfloat *data; @@ -1309,7 +1309,7 @@ for(int i=0;i<prob.l;i++) QD[i]= (Qfloat)(this->*kernel_function)(i,i); } - + Qfloat *get_Q(int i, int len) const { Qfloat *data; @@ -1345,7 +1345,7 @@ }; class SVR_Q: public Kernel -{ +{ public: SVR_Q(const svm_problem& prob, const svm_parameter& param) :Kernel(prob.l, prob.x, param) @@ -1375,7 +1375,7 @@ swap(index[i],index[j]); swap(QD[i],QD[j]); } - + Qfloat *get_Q(int i, int len) const { Qfloat *data; @@ -1390,7 +1390,7 @@ Qfloat *buf = buffer[next_buffer]; next_buffer = 1 - next_buffer; schar si = sign[i]; - for(int j=0;j<len;j++) + for(j=0;j<len;j++) buf[j] = (Qfloat) si * (Qfloat) sign[j] * data[index[j]]; return buf; } @@ -1626,7 +1626,7 @@ struct decision_function { double *alpha; - double rho; + double rho; }; decision_function svm_train_one( @@ -1697,7 +1697,7 @@ 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 *probA; // pariwise probability information double *probB; // for classification only @@ -1712,7 +1712,7 @@ // Platt's binary SVM Probablistic Output: an improvement from Lin et al. void sigmoid_train( - int l, const double *dec_values, const double *labels, + int l, const double *dec_values, const double *labels, double& A, double& B) { double prior1=0, prior0 = 0; @@ -1721,8 +1721,8 @@ for (i=0;i<l;i++) if (labels[i] > 0) prior1+=1; else prior0+=1; - - int max_iter=100; // Maximal number of iterations + + int max_iter=100; // Maximal number of iterations double min_step=1e-10; // Minimal step taken in line search double sigma=1e-12; // For numerically strict PD of Hessian double eps=1e-5; @@ -1731,8 +1731,8 @@ 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)); double fval = 0.0; @@ -1786,7 +1786,7 @@ gd=g1*dA+g2*dB; - stepsize = 1; // Line Search + stepsize = 1; // Line Search while (stepsize >= min_step) { newA = A + stepsize * dA; @@ -1841,7 +1841,7 @@ double **Q=Malloc(double *,k); double *Qp=Malloc(double,k); double pQp, eps=0.005/k; - + for (t=0;t<k;t++) { p[t]=1.0/k; // Valid if k = 1 @@ -1877,7 +1877,7 @@ max_error=error; } if (max_error<eps) break; - + for (t=0;t<k;t++) { double diff=(-Qp[t]+pQp)/Q[t][t]; @@ -1924,7 +1924,7 @@ subprob.l = prob->l-(end-begin); subprob.x = Malloc(struct svm_node*,subprob.l); subprob.y = Malloc(double,subprob.l); - + k=0; for(j=0;j<begin;j++) { @@ -1969,22 +1969,22 @@ 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_destroy_model(submodel); svm_destroy_param(&subparam); } free(subprob.x); free(subprob.y); - } + } sigmoid_train(prob->l,dec_values,prob->y,probA,probB); free(dec_values); free(perm); } -// Return parameter of a Laplace distribution +// Return parameter of a Laplace distribution double svm_svr_probability( const svm_problem *prob, const svm_parameter *param) { @@ -2000,16 +2000,16 @@ { ymv[i]=prob->y[i]-ymv[i]; mae += fabs(ymv[i]); - } + } mae /= prob->l; double std=sqrt(2*mae*mae); int count=0; mae=0; for(i=0;i<prob->l;i++) - if (fabs(ymv[i]) > 5*std) - count=count+1; - else - mae+=fabs(ymv[i]); + if (fabs(ymv[i]) > 5*std) + count=count+1; + else + mae+=fabs(ymv[i]); mae /= (prob->l-count); info("Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma= %g\n",mae); free(ymv); @@ -2026,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++) @@ -2096,7 +2096,7 @@ model->probA = NULL; model->probB = NULL; model->sv_coef = Malloc(double *,1); - if(param->probability && + if(param->probability && (param->svm_type == EPSILON_SVR || param->svm_type == NU_SVR)) { @@ -2122,7 +2122,7 @@ model->SV[j] = prob->x[i]; model->sv_coef[0][j] = f.alpha[i]; ++j; - } + } free(f.alpha); } @@ -2137,7 +2137,7 @@ int *perm = Malloc(int,l); // group training data of the same class - svm_group_classes(prob,&nr_class,&label,&start,&count,perm); + 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++) @@ -2149,7 +2149,7 @@ for(i=0;i<nr_class;i++) weighted_C[i] = param->C; for(i=0;i<param->nr_weight;i++) - { + { int j; for(j=0;j<nr_class;j++) if(param->weight_label[i] == label[j]) @@ -2161,7 +2161,7 @@ } // train k*(k-1)/2 models - + bool *nonzero = Malloc(bool,l); for(i=0;i<l;i++) nonzero[i] = false; @@ -2214,11 +2214,11 @@ // build output model->nr_class = nr_class; - + model->label = Malloc(int,nr_class); for(i=0;i<nr_class;i++) model->label[i] = label[i]; - + model->rho = Malloc(double,nr_class*(nr_class-1)/2); for(i=0;i<nr_class*(nr_class-1)/2;i++) model->rho[i] = f[i].rho; @@ -2247,14 +2247,14 @@ int nSV = 0; for(int j=0;j<count[i];j++) if(nonzero[start[i]+j]) - { + { ++nSV; ++total_sv; } model->nSV[i] = nSV; nz_count[i] = nSV; } - + info("Total nSV = %d\n",total_sv); model->l = total_sv; @@ -2284,7 +2284,7 @@ int sj = start[j]; int ci = count[i]; int cj = count[j]; - + int q = nz_start[i]; int k; for(k=0;k<ci;k++) @@ -2296,7 +2296,7 @@ model->sv_coef[i][q++] = f[p].alpha[ci+k]; ++p; } - + free(label); free(probA); free(probB); @@ -2340,7 +2340,7 @@ int *index = Malloc(int,l); for(i=0;i<l;i++) index[i]=perm[i]; - for (c=0; c<nr_class; c++) + for (c=0; c<nr_class; c++) for(i=0;i<count[c];i++) { int j = i+rand()%(count[c]-i); @@ -2369,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); } @@ -2397,7 +2397,7 @@ subprob.l = l-(end-begin); subprob.x = Malloc(struct svm_node*,subprob.l); subprob.y = Malloc(double,subprob.l); - + k=0; for(j=0;j<begin;j++) { @@ -2412,13 +2412,13 @@ ++k; } struct svm_model *submodel = svm_train(&subprob,param); - if(param->probability && + if(param->probability && (param->svm_type == C_SVC || param->svm_type == NU_SVC)) { 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++) @@ -2426,9 +2426,9 @@ svm_destroy_model(submodel); free(subprob.x); free(subprob.y); - } + } free(fold_start); - free(perm); + free(perm); } @@ -2456,7 +2456,7 @@ return model->probA[0]; else { - info("Model doesn't contain information for SVR probability inference\n"); + fprintf(stderr,"Model doesn't contain information for SVR probability inference\n"); return 0; } } @@ -2479,7 +2479,7 @@ int i; int nr_class = model->nr_class; int l = model->l; - + double *kvalue = Malloc(double,l); for(i=0;i<l;i++) kvalue[i] = Kernel::k_function(x,model->SV[i],model->param); @@ -2498,7 +2498,7 @@ int sj = start[j]; int ci = model->nSV[i]; int cj = model->nSV[j]; - + int k; double *coef1 = model->sv_coef[j-1]; double *coef2 = model->sv_coef[i]; @@ -2524,7 +2524,7 @@ { double res; svm_predict_values(model, x, &res); - + if(model->param.svm_type == ONE_CLASS) return (res>0)?1:-1; else @@ -2592,10 +2592,10 @@ 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 + else return svm_predict(model, x); } @@ -2632,14 +2632,14 @@ int l = model->l; fprintf(fp, "nr_class %d\n", nr_class); fprintf(fp, "total_sv %d\n",l); - + { fprintf(fp, "rho"); for(int i=0;i<nr_class*(nr_class-1)/2;i++) fprintf(fp," %g",model->rho[i]); fprintf(fp, "\n"); } - + if(model->label) { fprintf(fp, "label"); @@ -2696,11 +2696,32 @@ else return 0; } +static char *line = NULL; +static int max_line_len; + +static char* readline(FILE *input) +{ + int len; + + if(fgets(line,max_line_len,input) == NULL) + return NULL; + + while(strrchr(line,'\n') == NULL) + { + max_line_len *= 2; + line = (char *) realloc(line,max_line_len); + len = (int) strlen(line); + if(fgets(line+len,max_line_len-len,input) == NULL) + break; + } + return line; +} + 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); @@ -2739,7 +2760,7 @@ } } else if(strcmp(cmd,"kernel_type")==0) - { + { fscanf(fp,"%80s",cmd); int i; for(i=0;kernel_type_table[i];i++) @@ -2810,7 +2831,7 @@ while(1) { int c = getc(fp); - if(c==EOF || c=='\n') break; + if(c==EOF || c=='\n') break; } break; } @@ -2830,23 +2851,23 @@ int elements = 0; long pos = ftell(fp); - while(1) + max_line_len = 1024; + line = Malloc(char,max_line_len); + char *p,*endptr,*idx,*val; + + while(readline(fp)!=NULL) { - int c = fgetc(fp); - switch(c) + p = strtok(line,":"); + while(1) { - case '\n': - // count the '-1' element - case ':': - ++elements; + p = strtok(NULL,":"); + if(p == NULL) break; - case EOF: - goto out; - default: - ; + ++elements; } } -out: + elements += model->l; + fseek(fp,pos,SEEK_SET); int m = model->nr_class - 1; @@ -2856,30 +2877,41 @@ for(i=0;i<m;i++) model->sv_coef[i] = Malloc(double,l); model->SV = Malloc(svm_node*,l); - svm_node *x_space=NULL; + svm_node *x_space = NULL; if(l>0) x_space = Malloc(svm_node,elements); int j=0; for(i=0;i<l;i++) { + readline(fp); model->SV[i] = &x_space[j]; - for(int k=0;k<m;k++) - fscanf(fp,"%lf",&model->sv_coef[k][i]); + + p = strtok(line, " \t"); + model->sv_coef[0][i] = strtod(p,&endptr); + for(int k=1;k<m;k++) + { + p = strtok(NULL, " \t"); + model->sv_coef[k][i] = strtod(p,&endptr); + } + while(1) { - int c; - do { - c = getc(fp); - if(c=='\n') goto out2; - } while(isspace(c)); - ungetc(c,fp); - fscanf(fp,"%d:%lf",&(x_space[j].index),&(x_space[j].value)); + idx = strtok(NULL, ":"); + val = strtok(NULL, " \t"); + + if(val == NULL) + break; + x_space[j].index = (int) strtol(idx,&endptr,10); + x_space[j].value = strtod(val,&endptr); + ++j; } -out2: x_space[j++].index = -1; } - if (ferror(fp) != 0 || fclose(fp) != 0) return NULL; + free(line); + + if (ferror(fp) != 0 || fclose(fp) != 0) + return NULL; model->free_sv = 1; // XXX return model; @@ -2918,9 +2950,9 @@ svm_type != EPSILON_SVR && svm_type != NU_SVR) return "unknown svm type"; - + // kernel_type, degree - + int kernel_type = param->kernel_type; if(kernel_type != LINEAR && kernel_type != POLY && @@ -2970,7 +3002,7 @@ // check whether nu-svc is feasible - + if(svm_type == NU_SVC) { int l = prob->l; @@ -3003,7 +3035,7 @@ ++nr_class; } } - + for(i=0;i<nr_class;i++) { int n1 = count[i]; Index: README =================================================================== RCS file: /cvsroot/clisp/clisp/modules/libsvm/README,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- README 15 Dec 2008 15:10:54 -0000 1.6 +++ README 3 Apr 2009 01:29:29 -0000 1.7 @@ -137,10 +137,12 @@ -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1) -m cachesize : set cache memory size in MB (default 100) -e epsilon : set tolerance of termination criterion (default 0.001) --h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1) --b probability_estimates: whether to train an SVC or SVR model for probability estimates, 0 or 1 (default 0) --wi weight: set the parameter C of class i to weight*C in C-SVC (default 1) +-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1) +-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0) +-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1) -v n: n-fold cross validation mode +-q : quiet mode (no outputs) + The k in the -g option means the number of attributes in the input data. @@ -290,7 +292,8 @@ `svm.h'. You need to #include "svm.h" in your C/C++ source files and link your program with `svm.cpp'. You can see `svm-train.c' and `svm-predict.c' for examples showing how to use them. We define -LIBSVM_VERSION in svm.h, so you can check the version number. +LIBSVM_VERSION and declare `extern int libsvm_version; ' in svm.h, so +you can check the version number. Before you classify test data, you need to construct an SVM model (`svm_model') using training data. A model can also be saved in @@ -532,6 +535,11 @@ This function frees the memory used by a parameter set. +- Variable: extern void (*svm_print_string) (const char *); + + Users can specify their output format by + svm_print_string = &your_print_function; + Java Version ============ @@ -551,7 +559,8 @@ Library usages are similar to the C version. These functions are available: public class svm { - public static final int LIBSVM_VERSION=288; + public static final int LIBSVM_VERSION=289; + public static svm_print_interface svm_print_string; public static svm_model svm_train(svm_problem prob, svm_parameter param); public static void svm_cross_validation(svm_problem prob, svm_parameter param, int nr_fold, double[] target); public static int svm_get_svm_type(svm_model model); @@ -570,6 +579,15 @@ The library is in the "libsvm" package. Note that in Java version, svm_node[] is not ended with a node whose index = -1. +Users can specify their output format by + + svm.svm_print_string = new svm_print_interface() + { + public void print(String s) + { + // your own format + } + }; Building Windows Binaries ========================= Index: svm.xml =================================================================== RCS file: /cvsroot/clisp/clisp/modules/libsvm/svm.xml,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- svm.xml 15 Dec 2008 15:10:54 -0000 1.14 +++ svm.xml 3 Apr 2009 01:29:30 -0000 1.15 @@ -2,7 +2,7 @@ <section id="libsvm"><title>LibSVM Interface</title> -<para>This is an &ffi-pac;-based interface to the version 2.88 of +<para>This is an &ffi-pac;-based interface to the version 2.89 of &libsvm-link; (included in the source distribution in the directory <filename role="clisp-cvs">modules/libsvm/</filename>, so you do not need to install it yourself).</para> Index: libsvm.lisp =================================================================== RCS file: /cvsroot/clisp/clisp/modules/libsvm/libsvm.lisp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- libsvm.lisp 22 Dec 2008 20:29:23 -0000 1.15 +++ libsvm.lisp 3 Apr 2009 01:29:30 -0000 1.16 @@ -1,7 +1,7 @@ ;;; LIBSVM interface ;;; <http://www.csie.ntu.edu.tw/~cjlin/libsvm/> ;;; -;;; Copyright (C) 2006-2008 Sam Steingold <sd...@gn...> +;;; Copyright (C) 2006-2009 Sam Steingold <sd...@gn...> ;;; This is Free Software, covered by the GNU GPL (v2) ;;; See http://www.gnu.org/copyleft/gpl.html @@ -25,7 +25,7 @@ (def-call-in write-string-to-libsvm-output (:name "libsvm_print_string") (:arguments (s c-string)) (:return-type nil)) (c-lines :init-always - " print_string = (void (*) (const char*))&libsvm_print_string;") + " svm_print_string = (void (*) (const char*))&libsvm_print_string;") ;;; ;;; types and constants ------------------------------ ------------------------------------------------------------------------------ ------------------------------ _______________________________________________ clisp-cvs mailing list cli...@li... https://lists.sourceforge.net/lists/listinfo/clisp-cvs End of clisp-cvs Digest, Vol 36, Issue 3 **************************************** |