From b504f25068483022a258cae315e8d6da7c2fd4e0 Mon Sep 17 00:00:00 2001 From: biconnect Date: Thu, 18 Jun 2009 11:58:09 +0000 Subject: [PATCH] - move everything to trunk/ --- COPYRIGHT | 31 + Makefile | 26 + Makefile.win | 27 + README | 411 ++++++++++ blas/Makefile | 22 + blas/blas.h | 25 + blas/blasp.h | 430 ++++++++++ blas/daxpy.c | 49 ++ blas/ddot.c | 50 ++ blas/dnrm2.c | 62 ++ blas/dscal.c | 44 ++ heart_scale | 270 +++++++ linear.cpp | 1446 ++++++++++++++++++++++++++++++++++ linear.h | 69 ++ matlab/Makefile | 58 ++ matlab/README | 184 +++++ matlab/libsvmread.c | 1 + matlab/libsvmwrite.c | 1 + matlab/linear_model_matlab.c | 168 ++++ matlab/linear_model_matlab.h | 2 + matlab/make.m | 10 + matlab/predict.c | 300 +++++++ matlab/run.m | 4 + matlab/train.c | 334 ++++++++ predict.c | 215 +++++ train.c | 313 ++++++++ tron.cpp | 214 +++++ tron.h | 32 + windows/predict.exe | Bin 0 -> 106496 bytes windows/predict.mexw32 | Bin 0 -> 13824 bytes windows/read_sparse.mexw32 | Bin 0 -> 8192 bytes windows/train.exe | Bin 0 -> 131072 bytes windows/train.mexw32 | Bin 0 -> 32256 bytes 33 files changed, 4798 insertions(+) create mode 100644 COPYRIGHT create mode 100644 Makefile create mode 100644 Makefile.win create mode 100644 README create mode 100644 blas/Makefile create mode 100644 blas/blas.h create mode 100644 blas/blasp.h create mode 100644 blas/daxpy.c create mode 100644 blas/ddot.c create mode 100644 blas/dnrm2.c create mode 100644 blas/dscal.c create mode 100644 heart_scale create mode 100644 linear.cpp create mode 100644 linear.h create mode 100644 matlab/Makefile create mode 100644 matlab/README create mode 120000 matlab/libsvmread.c create mode 120000 matlab/libsvmwrite.c create mode 100644 matlab/linear_model_matlab.c create mode 100644 matlab/linear_model_matlab.h create mode 100644 matlab/make.m create mode 100644 matlab/predict.c create mode 100644 matlab/run.m create mode 100644 matlab/train.c create mode 100644 predict.c create mode 100644 train.c create mode 100644 tron.cpp create mode 100644 tron.h create mode 100755 windows/predict.exe create mode 100755 windows/predict.mexw32 create mode 100755 windows/read_sparse.mexw32 create mode 100755 windows/train.exe create mode 100755 windows/train.mexw32 diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..58e56fa --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,31 @@ + +Copyright (c) 2007-2009 The LIBLINEAR Project. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither name of copyright holders nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..42a484f --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +CXX ?= g++ +CC ?= gcc +CFLAGS ?= -Wall -Wconversion -O3 -fPIC +LIBS ?= blas/blas.a +#LIBS ?= -lblas + +all: train predict + +train: tron.o linear.o train.c blas/blas.a + $(CXX) $(CFLAGS) -o train train.c tron.o linear.o $(LIBS) + +predict: tron.o linear.o predict.c blas/blas.a + $(CXX) $(CFLAGS) -o predict predict.c tron.o linear.o $(LIBS) + +tron.o: tron.cpp tron.h + $(CXX) $(CFLAGS) -c -o tron.o tron.cpp + +linear.o: linear.cpp linear.h + $(CXX) $(CFLAGS) -c -o linear.o linear.cpp + +blas/blas.a: + cd blas; make OPTFLAGS='$(CFLAGS)' CC='$(CC)'; + +clean: + cd blas; make clean + rm -f *~ tron.o linear.o train predict diff --git a/Makefile.win b/Makefile.win new file mode 100644 index 0000000..fdd3ba7 --- /dev/null +++ b/Makefile.win @@ -0,0 +1,27 @@ +#You must ensure nmake.exe, cl.exe, link.exe are in system path. +#VCVARS32.bat +#Under dosbox prompt +#nmake -f Makefile.win + +########################################## +CXXC = cl.exe +CFLAGS = -nologo -O2 -EHsc -I. -D __WIN32__ -D _CRT_SECURE_NO_DEPRECATE +TARGET = windows + +all: $(TARGET)\train.exe $(TARGET)\predict.exe + +$(TARGET)\train.exe: tron.obj linear.obj train.c blas\*.c + $(CXX) $(CFLAGS) -Fe$(TARGET)\train.exe tron.obj linear.obj train.c blas\*.c + +$(TARGET)\predict.exe: tron.obj linear.obj predict.c blas\*.c + $(CXX) $(CFLAGS) -Fe$(TARGET)\predict.exe tron.obj linear.obj predict.c blas\*.c + +linear.obj: linear.cpp linear.h + $(CXX) $(CFLAGS) -c linear.cpp + +tron.obj: tron.cpp tron.h + $(CXX) $(CFLAGS) -c tron.cpp + +clean: + -erase /Q *.obj $(TARGET)\. + diff --git a/README b/README new file mode 100644 index 0000000..2440161 --- /dev/null +++ b/README @@ -0,0 +1,411 @@ +LIBLINEAR is a simple package for solving large-scale regularized +linear classification. It currently supports L2-regularized logistic +regression, L2-loss support vector machines, and L1-loss support +vector machines. This document explains the usage of LIBLINEAR. + +To get started, please read the ``Quick Start'' section first. +For developers, please check the ``Library Usage'' section to learn +how to integrate LIBLINEAR in your software. + +Table of Contents +================= + +- When to use LIBLINEAR but not LIBSVM +- Quick Start +- Installation +- `train' Usage +- `predict' Usage +- Examples +- Library Usage +- Building Windows Binaries +- Additional Information +- MATLAB/OCTAVE interface + +When to use LIBLINEAR but not LIBSVM +==================================== + +There are some large data for which with/without nonlinear mappings +gives similar performances. Without using kernels, one can +efficiently train a much larger set via a linear classifier. These +data usually have a large number of features. Document classification +is an example. + +Warning: While generally liblinear is very fast, its default solver +may be slow under certain situations (e.g., data not scaled or C is +large). See Appendix B of our SVM guide about how to handle such +cases. +http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf + +Warning: If you are a beginner and your data sets are not large, you +should consider LIBSVM first. + +LIBSVM page: +http://www.csie.ntu.edu.tw/~cjlin/libsvm + + +Quick Start +=========== + +See the section ``Installation'' for installing LIBLINEAR. + +After installation, there are programs `train' and `predict' for +training and testing, respectively. + +About the data format, please check the README file of LIBSVM. Note +that feature index must start from 1 (but not 0). + +A sample classification data included in this package is `heart_scale'. + +Type `train heart_scale', and the program will read the training +data and output the model file `heart_scale.model'. If you have a test +set called heart_scale.t, then type `predict heart_scale.t +heart_scale.model output' to see the prediction accuracy. The `output' +file contains the predicted class labels. + +For more information about `train' and `predict', see the sections +`train' Usage and `predict' Usage. + +To obtain good performances, sometimes one needs to scale the +data. Please check the program `svm-scale' of LIBSVM. For large and +sparse data, use `-l 0' to keep the sparsity. + +Installation +============ + +On Unix systems, type `make' to build the `train' and `predict' +programs. Run them without arguments to show the usages. + +On other systems, consult `Makefile' to build them (e.g., see +'Building Windows binaries' in this file) or use the pre-built +binaries (Windows binaries are in the directory `windows'). + +This software uses some level-1 BLAS subroutines. The needed functions are +included in this package. If a BLAS library is available on your +machine, you may use it by modifying the Makefile: Unmark the following line + + #LIBS ?= -lblas + +and mark + + LIBS ?= blas/blas.a + +`train' Usage +============= + +Usage: train [options] training_set_file [model_file] +options: +-s type : set type of solver (default 1) + 0 -- L2-regularized logistic regression + 1 -- L2-loss support vector machines (dual) + 2 -- L2-loss support vector machines (primal) + 3 -- L1-loss support vector machines (dual) + 4 -- multi-class support vector machines by Crammer and Singer +-c cost : set the parameter C (default 1) +-e epsilon : set tolerance of termination criterion + -s 0 and 2 + |f'(w)|_2 <= eps*min(pos,neg)/l*|f'(w0)|_2, + where f is the primal function, (default 0.01) + -s 1, 3, and 4 + Dual maximal violation <= eps; similar to libsvm (default 0.1) +-B bias : if bias >= 0, instance x becomes [x; bias]; if < 0, no bias term added (default 1) +-wi weight: weights adjust the parameter C of different classes (see README for details) +-v n: n-fold cross validation mode + +Option -v randomly splits the data into n parts and calculates cross +validation accuracy on them. + +Formulations: + +For L2-regularized logistic regression (-s 0), we solve + +min_w w^Tw/2 + C \sum log(1 + exp(-y_i w^Tx_i)) + +For L2-loss SVM dual (-s 1), we solve + +min_alpha 0.5(alpha^T (Q + I/2/C) alpha) - e^T alpha + s.t. 0 <= alpha_i, + +For L2-loss SVM (-s 2), we solve + +min_w w^Tw/2 + C \sum max(0, 1- y_i w^Tx_i)^2 + +For L1-loss SVM dual (-s 3), we solve + +min_alpha 0.5(alpha^T Q alpha) - e^T alpha + s.t. 0 <= alpha_i <= C, + +where + +Q is a matrix with Q_ij = y_i y_j x_i^T x_j. + +If bias >= 0, w becomes [w; w_{n+1}] and x becomes [x; bias]. + +The primal-dual relationship implies that -s 1 and -s 2 gives the same +model. + +We implement 1-vs-the rest multi-class strategy. In training i +vs. non_i, their C parameters are (weight from -wi)*C and C, +respectively. If there are only two classes, we train only one +model. Thus weight1*C vs. weight2*C is used. See examples below. + +We also implement multi-class SVM by Crammer and Singer (-s 4): + +min_{w_m, \xi_i} 0.5 \sum_m ||w_m||^2 + C \sum_i \xi_i + s.t. w^T_{y_i} x_i - w^T_m x_i >= \e^m_i - \xi_i \forall m,i + +where e^m_i = 0 if y_i = m, + e^m_i = 1 if y_i != m, + +Here we solve the dual problem: + +min_{\alpha} 0.5 \sum_m ||w_m(\alpha)||^2 + \sum_i \sum_m e^m_i alpha^m_i + s.t. \alpha^m_i <= C^m_i \forall m,i , \sum_m \alpha^m_i=0 \forall i + +where w_m(\alpha) = \sum_i \alpha^m_i x_i, +and C^m_i = C if m = y_i, + C^m_i = 0 if m != y_i. + +`predict' Usage +=============== + +Usage: predict [options] test_file model_file output_file +options: +-b probability_estimates: whether to predict probability estimates, 0 or 1 (default 0) + +Examples +======== + +> train data_file + +Train linear SVM with L2-loss function. + +> train -s 0 data_file + +Train a logistic regression model. + +> train -v 5 -e 0.001 data_file + +Do five-fold cross-validation using L2-loss svm. +Use a smaller stopping tolerance 0.001 than the default +0.1 if you want more accurate solutions. + +> train -c 10 -w1 2 -w2 5 -w3 2 four_class_data_file + +Train four classifiers: +positive negative Cp Cn +class 1 class 2,3,4. 20 10 +class 2 class 1,3,4. 50 10 +class 3 class 1,2,4. 20 10 +class 4 class 1,2,3. 10 10 + +> train -c 10 -w3 1 -w2 5 two_class_data_file + +If there are only two classes, we train ONE model. +The C values for the two classes are 10 and 50. + +> predict -b 1 test_file data_file.model output_file + +Output probability estimates (for logistic regression only). + +Library Usage +============= + +- Function: model* train(const struct problem *prob, + const struct parameter *param); + + This function constructs and returns a linear classification model + according to the given training data and parameters. + + struct problem describes the problem: + + struct problem + { + int l, n; + int *y; + struct feature_node **x; + double bias; + }; + + where `l' is the number of training data. If bias >= 0, we assume + that one additional feature is added to the end of each data + instance. `n' is the number of feature (including the bias feature + if bias >= 0). `y' is an array containing the target values. And + `x' is an array of pointers, + each of which points to a sparse representation (array of feature_node) of one + training vector. + + For example, if we have the following training data: + + LABEL ATTR1 ATTR2 ATTR3 ATTR4 ATTR5 + ----- ----- ----- ----- ----- ----- + 1 0 0.1 0.2 0 0 + 2 0 0.1 0.3 -1.2 0 + 1 0.4 0 0 0 0 + 2 0 0.1 0 1.4 0.5 + 3 -0.1 -0.2 0.1 1.1 0.1 + + and bias = 1, then the components of problem are: + + l = 5 + n = 6 + + y -> 1 2 1 2 3 + + x -> [ ] -> (2,0.1) (3,0.2) (6,1) (-1,?) + [ ] -> (2,0.1) (3,0.3) (4,-1.2) (6,1) (-1,?) + [ ] -> (1,0.4) (6,1) (-1,?) + [ ] -> (2,0.1) (4,1.4) (5,0.5) (6,1) (-1,?) + [ ] -> (1,-0.1) (2,-0.2) (3,0.1) (4,1.1) (5,0.1) (6,1) (-1,?) + + struct parameter describes the parameters of a linear classification model: + + struct parameter + { + int solver_type; + + /* these are for training only */ + double eps; /* stopping criteria */ + double C; + int nr_weight; + int *weight_label; + double* weight; + }; + + solver_type can be one of L2_LR, L2LOSS_SVM_DUAL, L2LOSS_SVM, L1LOSS_SVM_DUAL, MCSVM_CS. + + L2_LR L2-regularized logistic regression + L2LOSS_SVM_DUAL L2-loss support vector machines (dual) + L2LOSS_SVM L2-loss support vector machines (primal) + L1LOSS_SVM_DUAL L1-loss support vector machines (dual) + MCSVM_CS multi-class support vector machines by Crammer and Singer + + C is the cost of constraints violation. + eps is the stopping criterion. + + nr_weight, weight_label, and weight are used to change the penalty + for some classes (If the weight for a class is not changed, it is + set to 1). This is useful for training classifier using unbalanced + input data or with asymmetric misclassification cost. + + nr_weight is the number of elements in the array weight_label and + weight. Each weight[i] corresponds to weight_label[i], meaning that + the penalty of class weight_label[i] is scaled by a factor of weight[i]. + + If you do not want to change penalty for any of the classes, + just set nr_weight to 0. + + *NOTE* To avoid wrong parameters, check_parameter() should be + called before train(). + +- Function: void cross_validation(const problem *prob, const parameter *param, int nr_fold, int *target); + + This function conducts cross validation. Data are separated to + nr_fold folds. Under given parameters, sequentially each fold is + validated using the model from training the remaining. Predicted + labels in the validation process are stored in the array called + target. + + The format of prob is same as that for train(). + +- Function: int predict(const model *model_, const feature_node *x); + + This functions classifies a test vector using the given + model. The predicted label is returned. + +- Function: int predict_values(const struct model *model_, + const struct feature_node *x, double* dec_values); + + This function gives nr_w decision values in the array + dec_values. nr_w is 1 if there are two classes except multi-class + svm by Crammer and Singer (-s 4), and is the number of classes otherwise. + + We implement one-vs-the rest multi-class strategy (-s 0,1,2,3) and + multi-class svm by Crammer and Singer (-s 4) for multi-class SVM. + The class with the highest decision value is returned. + +- Function: int predict_probability(const struct model *model_, + const struct feature_node *x, double* prob_estimates); + + This function gives nr_class probability estimates in the array + prob_estimates. nr_class can be obtained from the function + get_nr_class. The class with the highest probability is + returned. Currently, we support only the probability outputs of + logistic regression. + +- Function: int get_nr_feature(const model *model_); + + The function gives the number of attributes of the model. + +- Function: int get_nr_class(const model *model_); + + The function gives the number of classes of the model. + +- Function: void get_labels(const model *model_, int* label); + + This function outputs the name of labels into an array called label. + +- Function: const char *check_parameter(const struct problem *prob, + const struct parameter *param); + + This function checks whether the parameters are within the feasible + range of the problem. This function should be called before calling + train() and cross_validation(). It returns NULL if the + parameters are feasible, otherwise an error message is returned. + +- Function: int save_model(const char *model_file_name, + const struct model *model_); + + This function saves a model to a file; returns 0 on success, or -1 + if an error occurs. + +- Function: struct model *load_model(const char *model_file_name); + + This function returns a pointer to the model read from the file, + or a null pointer if the model could not be loaded. + +- Function: void destroy_model(struct model *model_); + + This function frees the memory used by a model. + +- Function: void destroy_param(struct parameter *param); + + This function frees the memory used by a parameter set. + +Building Windows Binaries +========================= + +Windows binaries are in the directory `windows'. To build them via +Visual C++, use the following steps: + +1. Open a dos command box and change to liblinear directory. If +environment variables of VC++ have not been set, type + +"C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" + +You may have to modify the above according which version of VC++ or +where it is installed. + +2. Type + +nmake -f Makefile.win clean all + + +MATLAB/OCTAVE Interface +======================= + +Please check the file README in the directory `matlab'. + +Additional Information +====================== + +If you find LIBLINEAR helpful, please cite it as + +R.-E. Fan, K.-W. Chang, C.-J. Hsieh, X.-R. Wang, and C.-J. Lin. +LIBLINEAR: A Library for Large Linear Classification, Journal of +Machine Learning Research 9(2008), 1871-1874. Software available at +http://www.csie.ntu.edu.tw/~cjlin/liblinear + +For any questions and comments, please send your email to +cjlin@csie.ntu.edu.tw + + diff --git a/blas/Makefile b/blas/Makefile new file mode 100644 index 0000000..2be0186 --- /dev/null +++ b/blas/Makefile @@ -0,0 +1,22 @@ +AR = ar rcv +RANLIB = ranlib + +HEADERS = blas.h blas.h blasp.h +FILES = dnrm2.o daxpy.o ddot.o dscal.o + +CFLAGS = $(OPTFLAGS) +FFLAGS = $(OPTFLAGS) + +blas: $(FILES) $(HEADERS) + $(AR) blas.a $(FILES) + $(RANLIB) blas.a + +clean: + - rm -f *.o + - rm -f *.a + - rm -f *~ + +.c.o: + $(CC) $(CFLAGS) -c $*.c + + diff --git a/blas/blas.h b/blas/blas.h new file mode 100644 index 0000000..558893a --- /dev/null +++ b/blas/blas.h @@ -0,0 +1,25 @@ +/* blas.h -- C header file for BLAS Ver 1.0 */ +/* Jesse Bennett March 23, 2000 */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef BLAS_INCLUDE +#define BLAS_INCLUDE + +/* Data types specific to BLAS implementation */ +typedef struct { float r, i; } fcomplex; +typedef struct { double r, i; } dcomplex; +typedef int blasbool; + +#include "blasp.h" /* Prototypes for all BLAS functions */ + +#define FALSE 0 +#define TRUE 1 + +/* Macro functions */ +#define MIN(a,b) ((a) <= (b) ? (a) : (b)) +#define MAX(a,b) ((a) >= (b) ? (a) : (b)) + +#endif diff --git a/blas/blasp.h b/blas/blasp.h new file mode 100644 index 0000000..745836d --- /dev/null +++ b/blas/blasp.h @@ -0,0 +1,430 @@ +/* blasp.h -- C prototypes for BLAS Ver 1.0 */ +/* Jesse Bennett March 23, 2000 */ + +/* Functions listed in alphabetical order */ + +#ifdef F2C_COMPAT + +void cdotc_(fcomplex *dotval, int *n, fcomplex *cx, int *incx, + fcomplex *cy, int *incy); + +void cdotu_(fcomplex *dotval, int *n, fcomplex *cx, int *incx, + fcomplex *cy, int *incy); + +double sasum_(int *n, float *sx, int *incx); + +double scasum_(int *n, fcomplex *cx, int *incx); + +double scnrm2_(int *n, fcomplex *x, int *incx); + +double sdot_(int *n, float *sx, int *incx, float *sy, int *incy); + +double snrm2_(int *n, float *x, int *incx); + +void zdotc_(dcomplex *dotval, int *n, dcomplex *cx, int *incx, + dcomplex *cy, int *incy); + +void zdotu_(dcomplex *dotval, int *n, dcomplex *cx, int *incx, + dcomplex *cy, int *incy); + +#else + +fcomplex cdotc_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy); + +fcomplex cdotu_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy); + +float sasum_(int *n, float *sx, int *incx); + +float scasum_(int *n, fcomplex *cx, int *incx); + +float scnrm2_(int *n, fcomplex *x, int *incx); + +float sdot_(int *n, float *sx, int *incx, float *sy, int *incy); + +float snrm2_(int *n, float *x, int *incx); + +dcomplex zdotc_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy); + +dcomplex zdotu_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy); + +#endif + +/* Remaining functions listed in alphabetical order */ + +int caxpy_(int *n, fcomplex *ca, fcomplex *cx, int *incx, fcomplex *cy, + int *incy); + +int ccopy_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy); + +int cgbmv_(char *trans, int *m, int *n, int *kl, int *ku, + fcomplex *alpha, fcomplex *a, int *lda, fcomplex *x, int *incx, + fcomplex *beta, fcomplex *y, int *incy); + +int cgemm_(char *transa, char *transb, int *m, int *n, int *k, + fcomplex *alpha, fcomplex *a, int *lda, fcomplex *b, int *ldb, + fcomplex *beta, fcomplex *c, int *ldc); + +int cgemv_(char *trans, int *m, int *n, fcomplex *alpha, fcomplex *a, + int *lda, fcomplex *x, int *incx, fcomplex *beta, fcomplex *y, + int *incy); + +int cgerc_(int *m, int *n, fcomplex *alpha, fcomplex *x, int *incx, + fcomplex *y, int *incy, fcomplex *a, int *lda); + +int cgeru_(int *m, int *n, fcomplex *alpha, fcomplex *x, int *incx, + fcomplex *y, int *incy, fcomplex *a, int *lda); + +int chbmv_(char *uplo, int *n, int *k, fcomplex *alpha, fcomplex *a, + int *lda, fcomplex *x, int *incx, fcomplex *beta, fcomplex *y, + int *incy); + +int chemm_(char *side, char *uplo, int *m, int *n, fcomplex *alpha, + fcomplex *a, int *lda, fcomplex *b, int *ldb, fcomplex *beta, + fcomplex *c, int *ldc); + +int chemv_(char *uplo, int *n, fcomplex *alpha, fcomplex *a, int *lda, + fcomplex *x, int *incx, fcomplex *beta, fcomplex *y, int *incy); + +int cher_(char *uplo, int *n, float *alpha, fcomplex *x, int *incx, + fcomplex *a, int *lda); + +int cher2_(char *uplo, int *n, fcomplex *alpha, fcomplex *x, int *incx, + fcomplex *y, int *incy, fcomplex *a, int *lda); + +int cher2k_(char *uplo, char *trans, int *n, int *k, fcomplex *alpha, + fcomplex *a, int *lda, fcomplex *b, int *ldb, float *beta, + fcomplex *c, int *ldc); + +int cherk_(char *uplo, char *trans, int *n, int *k, float *alpha, + fcomplex *a, int *lda, float *beta, fcomplex *c, int *ldc); + +int chpmv_(char *uplo, int *n, fcomplex *alpha, fcomplex *ap, fcomplex *x, + int *incx, fcomplex *beta, fcomplex *y, int *incy); + +int chpr_(char *uplo, int *n, float *alpha, fcomplex *x, int *incx, + fcomplex *ap); + +int chpr2_(char *uplo, int *n, fcomplex *alpha, fcomplex *x, int *incx, + fcomplex *y, int *incy, fcomplex *ap); + +int crotg_(fcomplex *ca, fcomplex *cb, float *c, fcomplex *s); + +int cscal_(int *n, fcomplex *ca, fcomplex *cx, int *incx); + +int csscal_(int *n, float *sa, fcomplex *cx, int *incx); + +int cswap_(int *n, fcomplex *cx, int *incx, fcomplex *cy, int *incy); + +int csymm_(char *side, char *uplo, int *m, int *n, fcomplex *alpha, + fcomplex *a, int *lda, fcomplex *b, int *ldb, fcomplex *beta, + fcomplex *c, int *ldc); + +int csyr2k_(char *uplo, char *trans, int *n, int *k, fcomplex *alpha, + fcomplex *a, int *lda, fcomplex *b, int *ldb, fcomplex *beta, + fcomplex *c, int *ldc); + +int csyrk_(char *uplo, char *trans, int *n, int *k, fcomplex *alpha, + fcomplex *a, int *lda, fcomplex *beta, fcomplex *c, int *ldc); + +int ctbmv_(char *uplo, char *trans, char *diag, int *n, int *k, + fcomplex *a, int *lda, fcomplex *x, int *incx); + +int ctbsv_(char *uplo, char *trans, char *diag, int *n, int *k, + fcomplex *a, int *lda, fcomplex *x, int *incx); + +int ctpmv_(char *uplo, char *trans, char *diag, int *n, fcomplex *ap, + fcomplex *x, int *incx); + +int ctpsv_(char *uplo, char *trans, char *diag, int *n, fcomplex *ap, + fcomplex *x, int *incx); + +int ctrmm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, fcomplex *alpha, fcomplex *a, int *lda, fcomplex *b, + int *ldb); + +int ctrmv_(char *uplo, char *trans, char *diag, int *n, fcomplex *a, + int *lda, fcomplex *x, int *incx); + +int ctrsm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, fcomplex *alpha, fcomplex *a, int *lda, fcomplex *b, + int *ldb); + +int ctrsv_(char *uplo, char *trans, char *diag, int *n, fcomplex *a, + int *lda, fcomplex *x, int *incx); + +int daxpy_(int *n, double *sa, double *sx, int *incx, double *sy, + int *incy); + +int dcopy_(int *n, double *sx, int *incx, double *sy, int *incy); + +int dgbmv_(char *trans, int *m, int *n, int *kl, int *ku, + double *alpha, double *a, int *lda, double *x, int *incx, + double *beta, double *y, int *incy); + +int dgemm_(char *transa, char *transb, int *m, int *n, int *k, + double *alpha, double *a, int *lda, double *b, int *ldb, + double *beta, double *c, int *ldc); + +int dgemv_(char *trans, int *m, int *n, double *alpha, double *a, + int *lda, double *x, int *incx, double *beta, double *y, + int *incy); + +int dger_(int *m, int *n, double *alpha, double *x, int *incx, + double *y, int *incy, double *a, int *lda); + +int drot_(int *n, double *sx, int *incx, double *sy, int *incy, + double *c, double *s); + +int drotg_(double *sa, double *sb, double *c, double *s); + +int dsbmv_(char *uplo, int *n, int *k, double *alpha, double *a, + int *lda, double *x, int *incx, double *beta, double *y, + int *incy); + +int dscal_(int *n, double *sa, double *sx, int *incx); + +int dspmv_(char *uplo, int *n, double *alpha, double *ap, double *x, + int *incx, double *beta, double *y, int *incy); + +int dspr_(char *uplo, int *n, double *alpha, double *x, int *incx, + double *ap); + +int dspr2_(char *uplo, int *n, double *alpha, double *x, int *incx, + double *y, int *incy, double *ap); + +int dswap_(int *n, double *sx, int *incx, double *sy, int *incy); + +int dsymm_(char *side, char *uplo, int *m, int *n, double *alpha, + double *a, int *lda, double *b, int *ldb, double *beta, + double *c, int *ldc); + +int dsymv_(char *uplo, int *n, double *alpha, double *a, int *lda, + double *x, int *incx, double *beta, double *y, int *incy); + +int dsyr_(char *uplo, int *n, double *alpha, double *x, int *incx, + double *a, int *lda); + +int dsyr2_(char *uplo, int *n, double *alpha, double *x, int *incx, + double *y, int *incy, double *a, int *lda); + +int dsyr2k_(char *uplo, char *trans, int *n, int *k, double *alpha, + double *a, int *lda, double *b, int *ldb, double *beta, + double *c, int *ldc); + +int dsyrk_(char *uplo, char *trans, int *n, int *k, double *alpha, + double *a, int *lda, double *beta, double *c, int *ldc); + +int dtbmv_(char *uplo, char *trans, char *diag, int *n, int *k, + double *a, int *lda, double *x, int *incx); + +int dtbsv_(char *uplo, char *trans, char *diag, int *n, int *k, + double *a, int *lda, double *x, int *incx); + +int dtpmv_(char *uplo, char *trans, char *diag, int *n, double *ap, + double *x, int *incx); + +int dtpsv_(char *uplo, char *trans, char *diag, int *n, double *ap, + double *x, int *incx); + +int dtrmm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, double *alpha, double *a, int *lda, double *b, + int *ldb); + +int dtrmv_(char *uplo, char *trans, char *diag, int *n, double *a, + int *lda, double *x, int *incx); + +int dtrsm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, double *alpha, double *a, int *lda, double *b, + int *ldb); + +int dtrsv_(char *uplo, char *trans, char *diag, int *n, double *a, + int *lda, double *x, int *incx); + + +int saxpy_(int *n, float *sa, float *sx, int *incx, float *sy, int *incy); + +int scopy_(int *n, float *sx, int *incx, float *sy, int *incy); + +int sgbmv_(char *trans, int *m, int *n, int *kl, int *ku, + float *alpha, float *a, int *lda, float *x, int *incx, + float *beta, float *y, int *incy); + +int sgemm_(char *transa, char *transb, int *m, int *n, int *k, + float *alpha, float *a, int *lda, float *b, int *ldb, + float *beta, float *c, int *ldc); + +int sgemv_(char *trans, int *m, int *n, float *alpha, float *a, + int *lda, float *x, int *incx, float *beta, float *y, + int *incy); + +int sger_(int *m, int *n, float *alpha, float *x, int *incx, + float *y, int *incy, float *a, int *lda); + +int srot_(int *n, float *sx, int *incx, float *sy, int *incy, + float *c, float *s); + +int srotg_(float *sa, float *sb, float *c, float *s); + +int ssbmv_(char *uplo, int *n, int *k, float *alpha, float *a, + int *lda, float *x, int *incx, float *beta, float *y, + int *incy); + +int sscal_(int *n, float *sa, float *sx, int *incx); + +int sspmv_(char *uplo, int *n, float *alpha, float *ap, float *x, + int *incx, float *beta, float *y, int *incy); + +int sspr_(char *uplo, int *n, float *alpha, float *x, int *incx, + float *ap); + +int sspr2_(char *uplo, int *n, float *alpha, float *x, int *incx, + float *y, int *incy, float *ap); + +int sswap_(int *n, float *sx, int *incx, float *sy, int *incy); + +int ssymm_(char *side, char *uplo, int *m, int *n, float *alpha, + float *a, int *lda, float *b, int *ldb, float *beta, + float *c, int *ldc); + +int ssymv_(char *uplo, int *n, float *alpha, float *a, int *lda, + float *x, int *incx, float *beta, float *y, int *incy); + +int ssyr_(char *uplo, int *n, float *alpha, float *x, int *incx, + float *a, int *lda); + +int ssyr2_(char *uplo, int *n, float *alpha, float *x, int *incx, + float *y, int *incy, float *a, int *lda); + +int ssyr2k_(char *uplo, char *trans, int *n, int *k, float *alpha, + float *a, int *lda, float *b, int *ldb, float *beta, + float *c, int *ldc); + +int ssyrk_(char *uplo, char *trans, int *n, int *k, float *alpha, + float *a, int *lda, float *beta, float *c, int *ldc); + +int stbmv_(char *uplo, char *trans, char *diag, int *n, int *k, + float *a, int *lda, float *x, int *incx); + +int stbsv_(char *uplo, char *trans, char *diag, int *n, int *k, + float *a, int *lda, float *x, int *incx); + +int stpmv_(char *uplo, char *trans, char *diag, int *n, float *ap, + float *x, int *incx); + +int stpsv_(char *uplo, char *trans, char *diag, int *n, float *ap, + float *x, int *incx); + +int strmm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, float *alpha, float *a, int *lda, float *b, + int *ldb); + +int strmv_(char *uplo, char *trans, char *diag, int *n, float *a, + int *lda, float *x, int *incx); + +int strsm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, float *alpha, float *a, int *lda, float *b, + int *ldb); + +int strsv_(char *uplo, char *trans, char *diag, int *n, float *a, + int *lda, float *x, int *incx); + +int zaxpy_(int *n, dcomplex *ca, dcomplex *cx, int *incx, dcomplex *cy, + int *incy); + +int zcopy_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy); + +int zdscal_(int *n, double *sa, dcomplex *cx, int *incx); + +int zgbmv_(char *trans, int *m, int *n, int *kl, int *ku, + dcomplex *alpha, dcomplex *a, int *lda, dcomplex *x, int *incx, + dcomplex *beta, dcomplex *y, int *incy); + +int zgemm_(char *transa, char *transb, int *m, int *n, int *k, + dcomplex *alpha, dcomplex *a, int *lda, dcomplex *b, int *ldb, + dcomplex *beta, dcomplex *c, int *ldc); + +int zgemv_(char *trans, int *m, int *n, dcomplex *alpha, dcomplex *a, + int *lda, dcomplex *x, int *incx, dcomplex *beta, dcomplex *y, + int *incy); + +int zgerc_(int *m, int *n, dcomplex *alpha, dcomplex *x, int *incx, + dcomplex *y, int *incy, dcomplex *a, int *lda); + +int zgeru_(int *m, int *n, dcomplex *alpha, dcomplex *x, int *incx, + dcomplex *y, int *incy, dcomplex *a, int *lda); + +int zhbmv_(char *uplo, int *n, int *k, dcomplex *alpha, dcomplex *a, + int *lda, dcomplex *x, int *incx, dcomplex *beta, dcomplex *y, + int *incy); + +int zhemm_(char *side, char *uplo, int *m, int *n, dcomplex *alpha, + dcomplex *a, int *lda, dcomplex *b, int *ldb, dcomplex *beta, + dcomplex *c, int *ldc); + +int zhemv_(char *uplo, int *n, dcomplex *alpha, dcomplex *a, int *lda, + dcomplex *x, int *incx, dcomplex *beta, dcomplex *y, int *incy); + +int zher_(char *uplo, int *n, double *alpha, dcomplex *x, int *incx, + dcomplex *a, int *lda); + +int zher2_(char *uplo, int *n, dcomplex *alpha, dcomplex *x, int *incx, + dcomplex *y, int *incy, dcomplex *a, int *lda); + +int zher2k_(char *uplo, char *trans, int *n, int *k, dcomplex *alpha, + dcomplex *a, int *lda, dcomplex *b, int *ldb, double *beta, + dcomplex *c, int *ldc); + +int zherk_(char *uplo, char *trans, int *n, int *k, double *alpha, + dcomplex *a, int *lda, double *beta, dcomplex *c, int *ldc); + +int zhpmv_(char *uplo, int *n, dcomplex *alpha, dcomplex *ap, dcomplex *x, + int *incx, dcomplex *beta, dcomplex *y, int *incy); + +int zhpr_(char *uplo, int *n, double *alpha, dcomplex *x, int *incx, + dcomplex *ap); + +int zhpr2_(char *uplo, int *n, dcomplex *alpha, dcomplex *x, int *incx, + dcomplex *y, int *incy, dcomplex *ap); + +int zrotg_(dcomplex *ca, dcomplex *cb, double *c, dcomplex *s); + +int zscal_(int *n, dcomplex *ca, dcomplex *cx, int *incx); + +int zswap_(int *n, dcomplex *cx, int *incx, dcomplex *cy, int *incy); + +int zsymm_(char *side, char *uplo, int *m, int *n, dcomplex *alpha, + dcomplex *a, int *lda, dcomplex *b, int *ldb, dcomplex *beta, + dcomplex *c, int *ldc); + +int zsyr2k_(char *uplo, char *trans, int *n, int *k, dcomplex *alpha, + dcomplex *a, int *lda, dcomplex *b, int *ldb, dcomplex *beta, + dcomplex *c, int *ldc); + +int zsyrk_(char *uplo, char *trans, int *n, int *k, dcomplex *alpha, + dcomplex *a, int *lda, dcomplex *beta, dcomplex *c, int *ldc); + +int ztbmv_(char *uplo, char *trans, char *diag, int *n, int *k, + dcomplex *a, int *lda, dcomplex *x, int *incx); + +int ztbsv_(char *uplo, char *trans, char *diag, int *n, int *k, + dcomplex *a, int *lda, dcomplex *x, int *incx); + +int ztpmv_(char *uplo, char *trans, char *diag, int *n, dcomplex *ap, + dcomplex *x, int *incx); + +int ztpsv_(char *uplo, char *trans, char *diag, int *n, dcomplex *ap, + dcomplex *x, int *incx); + +int ztrmm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, dcomplex *alpha, dcomplex *a, int *lda, dcomplex *b, + int *ldb); + +int ztrmv_(char *uplo, char *trans, char *diag, int *n, dcomplex *a, + int *lda, dcomplex *x, int *incx); + +int ztrsm_(char *side, char *uplo, char *transa, char *diag, int *m, + int *n, dcomplex *alpha, dcomplex *a, int *lda, dcomplex *b, + int *ldb); + +int ztrsv_(char *uplo, char *trans, char *diag, int *n, dcomplex *a, + int *lda, dcomplex *x, int *incx); diff --git a/blas/daxpy.c b/blas/daxpy.c new file mode 100644 index 0000000..58f345a --- /dev/null +++ b/blas/daxpy.c @@ -0,0 +1,49 @@ +#include "blas.h" + +int daxpy_(int *n, double *sa, double *sx, int *incx, double *sy, + int *incy) +{ + long int i, m, ix, iy, nn, iincx, iincy; + register double ssa; + + /* constant times a vector plus a vector. + uses unrolled loop for increments equal to one. + jack dongarra, linpack, 3/11/78. + modified 12/3/93, array(1) declarations changed to array(*) */ + + /* Dereference inputs */ + nn = *n; + ssa = *sa; + iincx = *incx; + iincy = *incy; + + if( nn > 0 && ssa != 0.0 ) + { + if (iincx == 1 && iincy == 1) /* code for both increments equal to 1 */ + { + m = nn-3; + for (i = 0; i < m; i += 4) + { + sy[i] += ssa * sx[i]; + sy[i+1] += ssa * sx[i+1]; + sy[i+2] += ssa * sx[i+2]; + sy[i+3] += ssa * sx[i+3]; + } + for ( ; i < nn; ++i) /* clean-up loop */ + sy[i] += ssa * sx[i]; + } + else /* code for unequal increments or equal increments not equal to 1 */ + { + ix = iincx >= 0 ? 0 : (1 - nn) * iincx; + iy = iincy >= 0 ? 0 : (1 - nn) * iincy; + for (i = 0; i < nn; i++) + { + sy[iy] += ssa * sx[ix]; + ix += iincx; + iy += iincy; + } + } + } + + return 0; +} /* daxpy_ */ diff --git a/blas/ddot.c b/blas/ddot.c new file mode 100644 index 0000000..a64a280 --- /dev/null +++ b/blas/ddot.c @@ -0,0 +1,50 @@ +#include "blas.h" + +double ddot_(int *n, double *sx, int *incx, double *sy, int *incy) +{ + long int i, m, nn, iincx, iincy; + double stemp; + long int ix, iy; + + /* forms the dot product of two vectors. + uses unrolled loops for increments equal to one. + jack dongarra, linpack, 3/11/78. + modified 12/3/93, array(1) declarations changed to array(*) */ + + /* Dereference inputs */ + nn = *n; + iincx = *incx; + iincy = *incy; + + stemp = 0.0; + if (nn > 0) + { + if (iincx == 1 && iincy == 1) /* code for both increments equal to 1 */ + { + m = nn-4; + for (i = 0; i < m; i += 5) + stemp += sx[i] * sy[i] + sx[i+1] * sy[i+1] + sx[i+2] * sy[i+2] + + sx[i+3] * sy[i+3] + sx[i+4] * sy[i+4]; + + for ( ; i < nn; i++) /* clean-up loop */ + stemp += sx[i] * sy[i]; + } + else /* code for unequal increments or equal increments not equal to 1 */ + { + ix = 0; + iy = 0; + if (iincx < 0) + ix = (1 - nn) * iincx; + if (iincy < 0) + iy = (1 - nn) * iincy; + for (i = 0; i < nn; i++) + { + stemp += sx[ix] * sy[iy]; + ix += iincx; + iy += iincy; + } + } + } + + return stemp; +} /* ddot_ */ diff --git a/blas/dnrm2.c b/blas/dnrm2.c new file mode 100644 index 0000000..e50cdf7 --- /dev/null +++ b/blas/dnrm2.c @@ -0,0 +1,62 @@ +#include /* Needed for fabs() and sqrt() */ +#include "blas.h" + +double dnrm2_(int *n, double *x, int *incx) +{ + long int ix, nn, iincx; + double norm, scale, absxi, ssq, temp; + +/* DNRM2 returns the euclidean norm of a vector via the function + name, so that + + DNRM2 := sqrt( x'*x ) + + -- This version written on 25-October-1982. + Modified on 14-October-1993 to inline the call to SLASSQ. + Sven Hammarling, Nag Ltd. */ + + /* Dereference inputs */ + nn = *n; + iincx = *incx; + + if( nn > 0 && iincx > 0 ) + { + if (nn == 1) + { + norm = fabs(x[0]); + } + else + { + scale = 0.0; + ssq = 1.0; + + /* The following loop is equivalent to this call to the LAPACK + auxiliary routine: CALL SLASSQ( N, X, INCX, SCALE, SSQ ) */ + + for (ix=(nn-1)*iincx; ix>=0; ix-=iincx) + { + if (x[ix] != 0.0) + { + absxi = fabs(x[ix]); + if (scale < absxi) + { + temp = scale / absxi; + ssq = ssq * (temp * temp) + 1.0; + scale = absxi; + } + else + { + temp = absxi / scale; + ssq += temp * temp; + } + } + } + norm = scale * sqrt(ssq); + } + } + else + norm = 0.0; + + return norm; + +} /* dnrm2_ */ diff --git a/blas/dscal.c b/blas/dscal.c new file mode 100644 index 0000000..a0eca0c --- /dev/null +++ b/blas/dscal.c @@ -0,0 +1,44 @@ +#include "blas.h" + +int dscal_(int *n, double *sa, double *sx, int *incx) +{ + long int i, m, nincx, nn, iincx; + double ssa; + + /* scales a vector by a constant. + uses unrolled loops for increment equal to 1. + jack dongarra, linpack, 3/11/78. + modified 3/93 to return if incx .le. 0. + modified 12/3/93, array(1) declarations changed to array(*) */ + + /* Dereference inputs */ + nn = *n; + iincx = *incx; + ssa = *sa; + + if (nn > 0 && iincx > 0) + { + if (iincx == 1) /* code for increment equal to 1 */ + { + m = nn-4; + for (i = 0; i < m; i += 5) + { + sx[i] = ssa * sx[i]; + sx[i+1] = ssa * sx[i+1]; + sx[i+2] = ssa * sx[i+2]; + sx[i+3] = ssa * sx[i+3]; + sx[i+4] = ssa * sx[i+4]; + } + for ( ; i < nn; ++i) /* clean-up loop */ + sx[i] = ssa * sx[i]; + } + else /* code for increment not equal to 1 */ + { + nincx = nn * iincx; + for (i = 0; i < nincx; i += iincx) + sx[i] = ssa * sx[i]; + } + } + + return 0; +} /* dscal_ */ diff --git a/heart_scale b/heart_scale new file mode 100644 index 0000000..23bac94 --- /dev/null +++ b/heart_scale @@ -0,0 +1,270 @@ ++1 1:0.708333 2:1 3:1 4:-0.320755 5:-0.105023 6:-1 7:1 8:-0.419847 9:-1 10:-0.225806 12:1 13:-1 +-1 1:0.583333 2:-1 3:0.333333 4:-0.603774 5:1 6:-1 7:1 8:0.358779 9:-1 10:-0.483871 12:-1 13:1 ++1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1 +-1 1:0.458333 2:1 3:1 4:-0.358491 5:-0.374429 6:-1 7:-1 8:-0.480916 9:1 10:-0.935484 12:-0.333333 13:1 +-1 1:0.875 2:-1 3:-0.333333 4:-0.509434 5:-0.347032 6:-1 7:1 8:-0.236641 9:1 10:-0.935484 11:-1 12:-0.333333 13:-1 +-1 1:0.5 2:1 3:1 4:-0.509434 5:-0.767123 6:-1 7:-1 8:0.0534351 9:-1 10:-0.870968 11:-1 12:-1 13:1 ++1 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5 ++1 1:0.25 2:1 3:1 4:-0.698113 5:-0.484018 6:-1 7:1 8:0.0839695 9:1 10:-0.612903 12:-0.333333 13:1 ++1 1:0.291667 2:1 3:1 4:-0.132075 5:-0.237443 6:-1 7:1 8:0.51145 9:-1 10:-0.612903 12:0.333333 13:1 ++1 1:0.416667 2:-1 3:1 4:0.0566038 5:0.283105 6:-1 7:1 8:0.267176 9:-1 10:0.290323 12:1 13:1 +-1 1:0.25 2:1 3:1 4:-0.226415 5:-0.506849 6:-1 7:-1 8:0.374046 9:-1 10:-0.83871 12:-1 13:1 +-1 2:1 3:1 4:-0.0943396 5:-0.543379 6:-1 7:1 8:-0.389313 9:1 10:-1 11:-1 12:-1 13:1 +-1 1:-0.375 2:1 3:0.333333 4:-0.132075 5:-0.502283 6:-1 7:1 8:0.664122 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1 +-1 1:0.166667 2:-1 3:1 4:-0.358491 5:-0.191781 6:-1 7:1 8:0.343511 9:-1 10:-1 11:-1 12:-0.333333 13:-1 +-1 1:0.75 2:-1 3:1 4:-0.660377 5:-0.894977 6:-1 7:-1 8:-0.175573 9:-1 10:-0.483871 12:-1 13:-1 ++1 1:-0.291667 2:1 3:1 4:-0.132075 5:-0.155251 6:-1 7:-1 8:-0.251908 9:1 10:-0.419355 12:0.333333 13:1 ++1 2:1 3:1 4:-0.132075 5:-0.648402 6:1 7:1 8:0.282443 9:1 11:1 12:-1 13:1 +-1 1:0.458333 2:1 3:-1 4:-0.698113 5:-0.611872 6:-1 7:1 8:0.114504 9:1 10:-0.419355 12:-1 13:-1 +-1 1:-0.541667 2:1 3:-1 4:-0.132075 5:-0.666667 6:-1 7:-1 8:0.633588 9:1 10:-0.548387 11:-1 12:-1 13:1 ++1 1:0.583333 2:1 3:1 4:-0.509434 5:-0.52968 6:-1 7:1 8:-0.114504 9:1 10:-0.16129 12:0.333333 13:1 +-1 1:-0.208333 2:1 3:-0.333333 4:-0.320755 5:-0.456621 6:-1 7:1 8:0.664122 9:-1 10:-0.935484 12:-1 13:-1 +-1 1:-0.416667 2:1 3:1 4:-0.603774 5:-0.191781 6:-1 7:-1 8:0.679389 9:-1 10:-0.612903 12:-1 13:-1 +-1 1:-0.25 2:1 3:1 4:-0.660377 5:-0.643836 6:-1 7:-1 8:0.0992366 9:-1 10:-0.967742 11:-1 12:-1 13:-1 +-1 1:0.0416667 2:-1 3:-0.333333 4:-0.283019 5:-0.260274 6:1 7:1 8:0.343511 9:1 10:-1 11:-1 12:-0.333333 13:-1 +-1 1:-0.208333 2:-1 3:0.333333 4:-0.320755 5:-0.319635 6:-1 7:-1 8:0.0381679 9:-1 10:-0.935484 11:-1 12:-1 13:-1 +-1 1:-0.291667 2:-1 3:1 4:-0.169811 5:-0.465753 6:-1 7:1 8:0.236641 9:1 10:-1 12:-1 13:-1 +-1 1:-0.0833333 2:-1 3:0.333333 4:-0.509434 5:-0.228311 6:-1 7:1 8:0.312977 9:-1 10:-0.806452 11:-1 12:-1 13:-1 ++1 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1 +-1 1:0.75 2:-1 3:0.333333 4:-0.698113 5:-0.365297 6:1 7:1 8:-0.0992366 9:-1 10:-1 11:-1 12:-0.333333 13:-1 ++1 1:0.166667 2:1 3:0.333333 4:-0.358491 5:-0.52968 6:-1 7:1 8:0.206107 9:-1 10:-0.870968 12:-0.333333 13:1 +-1 1:0.541667 2:1 3:1 4:0.245283 5:-0.534247 6:-1 7:1 8:0.0229008 9:-1 10:-0.258065 11:-1 12:-1 13:0.5 +-1 1:-0.666667 2:-1 3:0.333333 4:-0.509434 5:-0.593607 6:-1 7:-1 8:0.51145 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.25 2:1 3:1 4:0.433962 5:-0.086758 6:-1 7:1 8:0.0534351 9:1 10:0.0967742 11:1 12:-1 13:1 ++1 1:-0.125 2:1 3:1 4:-0.0566038 5:-0.6621 6:-1 7:1 8:-0.160305 9:1 10:-0.709677 12:-1 13:1 ++1 1:-0.208333 2:1 3:1 4:-0.320755 5:-0.406393 6:1 7:1 8:0.206107 9:1 10:-1 11:-1 12:0.333333 13:1 ++1 1:0.333333 2:1 3:1 4:-0.132075 5:-0.630137 6:-1 7:1 8:0.0229008 9:1 10:-0.387097 11:-1 12:-0.333333 13:1 ++1 1:0.25 2:1 3:-1 4:0.245283 5:-0.328767 6:-1 7:1 8:-0.175573 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.458333 2:1 3:0.333333 4:-0.320755 5:-0.753425 6:-1 7:-1 8:0.206107 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.208333 2:1 3:1 4:-0.471698 5:-0.561644 6:-1 7:1 8:0.755725 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:-0.541667 2:1 3:1 4:0.0943396 5:-0.557078 6:-1 7:-1 8:0.679389 9:-1 10:-1 11:-1 12:-1 13:1 +-1 1:0.375 2:-1 3:1 4:-0.433962 5:-0.621005 6:-1 7:-1 8:0.40458 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.375 2:1 3:0.333333 4:-0.320755 5:-0.511416 6:-1 7:-1 8:0.648855 9:1 10:-0.870968 11:-1 12:-1 13:-1 +-1 1:-0.291667 2:1 3:-0.333333 4:-0.867925 5:-0.675799 6:1 7:-1 8:0.29771 9:-1 10:-1 11:-1 12:-1 13:1 ++1 1:0.25 2:1 3:0.333333 4:-0.396226 5:-0.579909 6:1 7:-1 8:-0.0381679 9:-1 10:-0.290323 12:-0.333333 13:0.5 +-1 1:0.208333 2:1 3:0.333333 4:-0.132075 5:-0.611872 6:1 7:1 8:0.435115 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:-0.166667 2:1 3:0.333333 4:-0.54717 5:-0.894977 6:-1 7:1 8:-0.160305 9:-1 10:-0.741935 11:-1 12:1 13:-1 ++1 1:-0.375 2:1 3:1 4:-0.698113 5:-0.675799 6:-1 7:1 8:0.618321 9:-1 10:-1 11:-1 12:-0.333333 13:-1 ++1 1:0.541667 2:1 3:-0.333333 4:0.245283 5:-0.452055 6:-1 7:-1 8:-0.251908 9:1 10:-1 12:1 13:0.5 ++1 1:0.5 2:-1 3:1 4:0.0566038 5:-0.547945 6:-1 7:1 8:-0.343511 9:-1 10:-0.677419 12:1 13:1 ++1 1:-0.458333 2:1 3:1 4:-0.207547 5:-0.136986 6:-1 7:-1 8:-0.175573 9:1 10:-0.419355 12:-1 13:0.5 +-1 1:-0.0416667 2:1 3:-0.333333 4:-0.358491 5:-0.639269 6:1 7:-1 8:0.725191 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:0.5 2:-1 3:0.333333 4:-0.132075 5:0.328767 6:1 7:1 8:0.312977 9:-1 10:-0.741935 11:-1 12:-0.333333 13:-1 +-1 1:0.416667 2:-1 3:-0.333333 4:-0.132075 5:-0.684932 6:-1 7:-1 8:0.648855 9:-1 10:-1 11:-1 12:0.333333 13:-1 +-1 1:-0.333333 2:-1 3:-0.333333 4:-0.320755 5:-0.506849 6:-1 7:1 8:0.587786 9:-1 10:-0.806452 12:-1 13:-1 +-1 1:-0.5 2:-1 3:-0.333333 4:-0.792453 5:-0.671233 6:-1 7:-1 8:0.480916 9:-1 10:-1 11:-1 12:-0.333333 13:-1 ++1 1:0.333333 2:1 3:1 4:-0.169811 5:-0.817352 6:-1 7:1 8:-0.175573 9:1 10:0.16129 12:-0.333333 13:-1 +-1 1:0.291667 2:-1 3:0.333333 4:-0.509434 5:-0.762557 6:1 7:-1 8:-0.618321 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.25 2:-1 3:1 4:0.509434 5:-0.438356 6:-1 7:-1 8:0.0992366 9:1 10:-1 12:-1 13:-1 ++1 1:0.375 2:1 3:-0.333333 4:-0.509434 5:-0.292237 6:-1 7:1 8:-0.51145 9:-1 10:-0.548387 12:-0.333333 13:1 +-1 1:0.166667 2:1 3:0.333333 4:0.0566038 5:-1 6:1 7:-1 8:0.557252 9:-1 10:-0.935484 11:-1 12:-0.333333 13:1 ++1 1:-0.0833333 2:-1 3:1 4:-0.320755 5:-0.182648 6:-1 7:-1 8:0.0839695 9:1 10:-0.612903 12:-1 13:1 +-1 1:-0.375 2:1 3:0.333333 4:-0.509434 5:-0.543379 6:-1 7:-1 8:0.496183 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:0.291667 2:-1 3:-1 4:0.0566038 5:-0.479452 6:-1 7:-1 8:0.526718 9:-1 10:-0.709677 11:-1 12:-1 13:-1 +-1 1:0.416667 2:1 3:-1 4:-0.0377358 5:-0.511416 6:1 7:1 8:0.206107 9:-1 10:-0.258065 11:1 12:-1 13:0.5 ++1 1:0.166667 2:1 3:1 4:0.0566038 5:-0.315068 6:-1 7:1 8:-0.374046 9:1 10:-0.806452 12:-0.333333 13:0.5 +-1 1:-0.0833333 2:1 3:1 4:-0.132075 5:-0.383562 6:-1 7:1 8:0.755725 9:1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.208333 2:-1 3:-0.333333 4:-0.207547 5:-0.118721 6:1 7:1 8:0.236641 9:-1 10:-1 11:-1 12:0.333333 13:-1 +-1 1:-0.375 2:-1 3:0.333333 4:-0.54717 5:-0.47032 6:-1 7:-1 8:0.19084 9:-1 10:-0.903226 12:-0.333333 13:-1 ++1 1:-0.25 2:1 3:0.333333 4:-0.735849 5:-0.465753 6:-1 7:-1 8:0.236641 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.333333 2:1 3:1 4:-0.509434 5:-0.388128 6:-1 7:-1 8:0.0534351 9:1 10:0.16129 12:-0.333333 13:1 +-1 1:0.166667 2:-1 3:1 4:-0.509434 5:0.0410959 6:-1 7:-1 8:0.40458 9:1 10:-0.806452 11:-1 12:-1 13:-1 +-1 1:0.708333 2:1 3:-0.333333 4:0.169811 5:-0.456621 6:-1 7:1 8:0.0992366 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:0.958333 2:-1 3:0.333333 4:-0.132075 5:-0.675799 6:-1 8:-0.312977 9:-1 10:-0.645161 12:-1 13:-1 +-1 1:0.583333 2:-1 3:1 4:-0.773585 5:-0.557078 6:-1 7:-1 8:0.0839695 9:-1 10:-0.903226 11:-1 12:0.333333 13:-1 ++1 1:-0.333333 2:1 3:1 4:-0.0943396 5:-0.164384 6:-1 7:1 8:0.160305 9:1 10:-1 12:1 13:1 +-1 1:-0.333333 2:1 3:1 4:-0.811321 5:-0.625571 6:-1 7:1 8:0.175573 9:1 10:-0.0322581 12:-1 13:-1 +-1 1:-0.583333 2:-1 3:0.333333 4:-1 5:-0.666667 6:-1 7:-1 8:0.648855 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.458333 2:-1 3:0.333333 4:-0.509434 5:-0.621005 6:-1 7:-1 8:0.557252 9:-1 10:-1 12:-1 13:-1 +-1 1:0.125 2:1 3:-0.333333 4:-0.509434 5:-0.497717 6:-1 7:-1 8:0.633588 9:-1 10:-0.741935 11:-1 12:-1 13:-1 ++1 1:0.208333 2:1 3:1 4:-0.0188679 5:-0.579909 6:-1 7:-1 8:-0.480916 9:-1 10:-0.354839 12:-0.333333 13:1 ++1 1:-0.75 2:1 3:1 4:-0.509434 5:-0.671233 6:-1 7:-1 8:-0.0992366 9:1 10:-0.483871 12:-1 13:1 ++1 1:0.208333 2:1 3:1 4:0.0566038 5:-0.342466 6:-1 7:1 8:-0.389313 9:1 10:-0.741935 11:-1 12:-1 13:1 +-1 1:-0.5 2:1 3:0.333333 4:-0.320755 5:-0.598174 6:-1 7:1 8:0.480916 9:-1 10:-0.354839 12:-1 13:-1 +-1 1:0.166667 2:1 3:1 4:-0.698113 5:-0.657534 6:-1 7:-1 8:-0.160305 9:1 10:-0.516129 12:-1 13:0.5 +-1 1:-0.458333 2:1 3:-1 4:0.0188679 5:-0.461187 6:-1 7:1 8:0.633588 9:-1 10:-0.741935 11:-1 12:0.333333 13:-1 +-1 1:0.375 2:1 3:-0.333333 4:-0.358491 5:-0.625571 6:1 7:1 8:0.0534351 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:0.25 2:1 3:-1 4:0.584906 5:-0.342466 6:-1 7:1 8:0.129771 9:-1 10:0.354839 11:1 12:-1 13:1 +-1 1:-0.5 2:-1 3:-0.333333 4:-0.396226 5:-0.178082 6:-1 7:-1 8:0.40458 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:-0.125 2:1 3:1 4:0.0566038 5:-0.465753 6:-1 7:1 8:-0.129771 9:-1 10:-0.16129 12:-1 13:1 +-1 1:0.25 2:1 3:-0.333333 4:-0.132075 5:-0.56621 6:-1 7:-1 8:0.419847 9:1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.333333 2:-1 3:1 4:-0.320755 5:-0.0684932 6:-1 7:1 8:0.496183 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.0416667 2:1 3:1 4:-0.433962 5:-0.360731 6:-1 7:1 8:-0.419847 9:1 10:-0.290323 12:-0.333333 13:1 ++1 1:0.0416667 2:1 3:1 4:-0.698113 5:-0.634703 6:-1 7:1 8:-0.435115 9:1 10:-1 12:-0.333333 13:-1 ++1 1:-0.0416667 2:1 3:1 4:-0.415094 5:-0.607306 6:-1 7:-1 8:0.480916 9:-1 10:-0.677419 11:-1 12:0.333333 13:1 ++1 1:-0.25 2:1 3:1 4:-0.698113 5:-0.319635 6:-1 7:1 8:-0.282443 9:1 10:-0.677419 12:-0.333333 13:-1 +-1 1:0.541667 2:1 3:1 4:-0.509434 5:-0.196347 6:-1 7:1 8:0.221374 9:-1 10:-0.870968 12:-1 13:-1 ++1 1:0.208333 2:1 3:1 4:-0.886792 5:-0.506849 6:-1 7:-1 8:0.29771 9:-1 10:-0.967742 11:-1 12:-0.333333 13:1 +-1 1:0.458333 2:-1 3:0.333333 4:-0.132075 5:-0.146119 6:-1 7:-1 8:-0.0534351 9:-1 10:-0.935484 11:-1 12:-1 13:1 +-1 1:-0.125 2:-1 3:-0.333333 4:-0.509434 5:-0.461187 6:-1 7:-1 8:0.389313 9:-1 10:-0.645161 11:-1 12:-1 13:-1 +-1 1:-0.375 2:-1 3:0.333333 4:-0.735849 5:-0.931507 6:-1 7:-1 8:0.587786 9:-1 10:-0.806452 12:-1 13:-1 ++1 1:0.583333 2:1 3:1 4:-0.509434 5:-0.493151 6:-1 7:-1 8:-1 9:-1 10:-0.677419 12:-1 13:-1 +-1 1:-0.166667 2:-1 3:1 4:-0.320755 5:-0.347032 6:-1 7:-1 8:0.40458 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.166667 2:1 3:1 4:0.339623 5:-0.255708 6:1 7:1 8:-0.19084 9:-1 10:-0.677419 12:1 13:1 ++1 1:0.416667 2:1 3:1 4:-0.320755 5:-0.415525 6:-1 7:1 8:0.160305 9:-1 10:-0.548387 12:-0.333333 13:1 ++1 1:-0.208333 2:1 3:1 4:-0.433962 5:-0.324201 6:-1 7:1 8:0.450382 9:-1 10:-0.83871 12:-1 13:1 +-1 1:-0.0833333 2:1 3:0.333333 4:-0.886792 5:-0.561644 6:-1 7:-1 8:0.0992366 9:1 10:-0.612903 12:-1 13:-1 ++1 1:0.291667 2:-1 3:1 4:0.0566038 5:-0.39726 6:-1 7:1 8:0.312977 9:-1 10:-0.16129 12:0.333333 13:1 ++1 1:0.25 2:1 3:1 4:-0.132075 5:-0.767123 6:-1 7:-1 8:0.389313 9:1 10:-1 11:-1 12:-0.333333 13:1 +-1 1:-0.333333 2:-1 3:-0.333333 4:-0.660377 5:-0.844749 6:-1 7:-1 8:0.0229008 9:-1 10:-1 12:-1 13:-1 ++1 1:0.0833333 2:-1 3:1 4:0.622642 5:-0.0821918 6:-1 8:-0.29771 9:1 10:0.0967742 12:-1 13:-1 +-1 1:-0.5 2:1 3:-0.333333 4:-0.698113 5:-0.502283 6:-1 7:-1 8:0.251908 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.291667 2:-1 3:1 4:0.207547 5:-0.182648 6:-1 7:1 8:0.374046 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:0.0416667 2:-1 3:0.333333 4:-0.226415 5:-0.187215 6:1 7:-1 8:0.51145 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.458333 2:1 3:-0.333333 4:-0.509434 5:-0.228311 6:-1 7:-1 8:0.389313 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.166667 2:-1 3:-0.333333 4:-0.245283 5:-0.3379 6:-1 7:-1 8:0.389313 9:-1 10:-1 12:-1 13:-1 ++1 1:-0.291667 2:1 3:1 4:-0.509434 5:-0.438356 6:-1 7:1 8:0.114504 9:-1 10:-0.741935 11:-1 12:-1 13:1 ++1 1:0.125 2:-1 3:1 4:1 5:-0.260274 6:1 7:1 8:-0.0534351 9:1 10:0.290323 11:1 12:0.333333 13:1 +-1 1:0.541667 2:-1 3:-1 4:0.0566038 5:-0.543379 6:-1 7:-1 8:-0.343511 9:-1 10:-0.16129 11:1 12:-1 13:-1 ++1 1:0.125 2:1 3:1 4:-0.320755 5:-0.283105 6:1 7:1 8:-0.51145 9:1 10:-0.483871 11:1 12:-1 13:1 ++1 1:-0.166667 2:1 3:0.333333 4:-0.509434 5:-0.716895 6:-1 7:-1 8:0.0381679 9:-1 10:-0.354839 12:1 13:1 ++1 1:0.0416667 2:1 3:1 4:-0.471698 5:-0.269406 6:-1 7:1 8:-0.312977 9:1 10:0.0322581 12:0.333333 13:-1 ++1 1:0.166667 2:1 3:1 4:0.0943396 5:-0.324201 6:-1 7:-1 8:-0.740458 9:1 10:-0.612903 12:-0.333333 13:1 +-1 1:0.5 2:-1 3:0.333333 4:0.245283 5:0.0684932 6:-1 7:1 8:0.221374 9:-1 10:-0.741935 11:-1 12:-1 13:-1 +-1 1:0.0416667 2:1 3:0.333333 4:-0.415094 5:-0.328767 6:-1 7:1 8:0.236641 9:-1 10:-0.83871 11:1 12:-0.333333 13:-1 +-1 1:0.0416667 2:-1 3:0.333333 4:0.245283 5:-0.657534 6:-1 7:-1 8:0.40458 9:-1 10:-1 11:-1 12:-0.333333 13:-1 ++1 1:0.375 2:1 3:1 4:-0.509434 5:-0.356164 6:-1 7:-1 8:-0.572519 9:1 10:-0.419355 12:0.333333 13:1 +-1 1:-0.0416667 2:-1 3:0.333333 4:-0.207547 5:-0.680365 6:-1 7:1 8:0.496183 9:-1 10:-0.967742 12:-1 13:-1 +-1 1:-0.0416667 2:1 3:-0.333333 4:-0.245283 5:-0.657534 6:-1 7:-1 8:0.328244 9:-1 10:-0.741935 11:-1 12:-0.333333 13:-1 ++1 1:0.291667 2:1 3:1 4:-0.566038 5:-0.525114 6:1 7:-1 8:0.358779 9:1 10:-0.548387 11:-1 12:0.333333 13:1 ++1 1:0.416667 2:-1 3:1 4:-0.735849 5:-0.347032 6:-1 7:-1 8:0.496183 9:1 10:-0.419355 12:0.333333 13:-1 ++1 1:0.541667 2:1 3:1 4:-0.660377 5:-0.607306 6:-1 7:1 8:-0.0687023 9:1 10:-0.967742 11:-1 12:-0.333333 13:-1 +-1 1:-0.458333 2:1 3:1 4:-0.132075 5:-0.543379 6:-1 7:-1 8:0.633588 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.458333 2:1 3:1 4:-0.509434 5:-0.452055 6:-1 7:1 8:-0.618321 9:1 10:-0.290323 11:1 12:-0.333333 13:-1 +-1 1:0.0416667 2:1 3:0.333333 4:0.0566038 5:-0.515982 6:-1 7:1 8:0.435115 9:-1 10:-0.483871 11:-1 12:-1 13:1 +-1 1:-0.291667 2:-1 3:0.333333 4:-0.0943396 5:-0.767123 6:-1 7:1 8:0.358779 9:1 10:-0.548387 11:1 12:-1 13:-1 +-1 1:0.583333 2:-1 3:0.333333 4:0.0943396 5:-0.310502 6:-1 7:-1 8:0.541985 9:-1 10:-1 11:-1 12:-0.333333 13:-1 ++1 1:0.125 2:1 3:1 4:-0.415094 5:-0.438356 6:1 7:1 8:0.114504 9:1 10:-0.612903 12:-0.333333 13:-1 +-1 1:-0.791667 2:-1 3:-0.333333 4:-0.54717 5:-0.616438 6:-1 7:-1 8:0.847328 9:-1 10:-0.774194 11:-1 12:-1 13:-1 +-1 1:0.166667 2:1 3:1 4:-0.283019 5:-0.630137 6:-1 7:-1 8:0.480916 9:1 10:-1 11:-1 12:-1 13:1 ++1 1:0.458333 2:1 3:1 4:-0.0377358 5:-0.607306 6:-1 7:1 8:-0.0687023 9:-1 10:-0.354839 12:0.333333 13:0.5 +-1 1:0.25 2:1 3:1 4:-0.169811 5:-0.3379 6:-1 7:1 8:0.694656 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:-0.125 2:1 3:0.333333 4:-0.132075 5:-0.511416 6:-1 7:-1 8:0.40458 9:-1 10:-0.806452 12:-0.333333 13:1 +-1 1:-0.0833333 2:1 3:-1 4:-0.415094 5:-0.60274 6:-1 7:1 8:-0.175573 9:1 10:-0.548387 11:-1 12:-0.333333 13:-1 ++1 1:0.0416667 2:1 3:-0.333333 4:0.849057 5:-0.283105 6:-1 7:1 8:0.89313 9:-1 10:-1 11:-1 12:-0.333333 13:1 ++1 2:1 3:1 4:-0.45283 5:-0.287671 6:-1 7:-1 8:-0.633588 9:1 10:-0.354839 12:0.333333 13:1 ++1 1:-0.0416667 2:1 3:1 4:-0.660377 5:-0.525114 6:-1 7:-1 8:0.358779 9:-1 10:-1 11:-1 12:-0.333333 13:-1 ++1 1:-0.541667 2:1 3:1 4:-0.698113 5:-0.812785 6:-1 7:1 8:-0.343511 9:1 10:-0.354839 12:-1 13:1 ++1 1:0.208333 2:1 3:0.333333 4:-0.283019 5:-0.552511 6:-1 7:1 8:0.557252 9:-1 10:0.0322581 11:-1 12:0.333333 13:1 +-1 1:-0.5 2:-1 3:0.333333 4:-0.660377 5:-0.351598 6:-1 7:1 8:0.541985 9:1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.5 2:1 3:0.333333 4:-0.660377 5:-0.43379 6:-1 7:-1 8:0.648855 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.125 2:-1 3:0.333333 4:-0.509434 5:-0.575342 6:-1 7:-1 8:0.328244 9:-1 10:-0.483871 12:-1 13:-1 +-1 1:0.0416667 2:-1 3:0.333333 4:-0.735849 5:-0.356164 6:-1 7:1 8:0.465649 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:0.458333 2:-1 3:1 4:-0.320755 5:-0.191781 6:-1 7:-1 8:-0.221374 9:-1 10:-0.354839 12:0.333333 13:-1 +-1 1:-0.0833333 2:-1 3:0.333333 4:-0.320755 5:-0.406393 6:-1 7:1 8:0.19084 9:-1 10:-0.83871 11:-1 12:-1 13:-1 +-1 1:-0.291667 2:-1 3:-0.333333 4:-0.792453 5:-0.643836 6:-1 7:-1 8:0.541985 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.0833333 2:1 3:1 4:-0.132075 5:-0.584475 6:-1 7:-1 8:-0.389313 9:1 10:0.806452 11:1 12:-1 13:1 +-1 1:-0.333333 2:1 3:-0.333333 4:-0.358491 5:-0.16895 6:-1 7:1 8:0.51145 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:0.125 2:1 3:-1 4:-0.509434 5:-0.694064 6:-1 7:1 8:0.389313 9:-1 10:-0.387097 12:-1 13:1 ++1 1:0.541667 2:-1 3:1 4:0.584906 5:-0.534247 6:1 7:-1 8:0.435115 9:1 10:-0.677419 12:0.333333 13:1 ++1 1:-0.625 2:1 3:-1 4:-0.509434 5:-0.520548 6:-1 7:-1 8:0.694656 9:1 10:0.225806 12:-1 13:1 ++1 1:0.375 2:-1 3:1 4:0.0566038 5:-0.461187 6:-1 7:-1 8:0.267176 9:1 10:-0.548387 12:-1 13:-1 +-1 1:0.0833333 2:1 3:-0.333333 4:-0.320755 5:-0.378995 6:-1 7:-1 8:0.282443 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.208333 2:1 3:1 4:-0.358491 5:-0.392694 6:-1 7:1 8:-0.0992366 9:1 10:-0.0322581 12:0.333333 13:1 +-1 1:-0.416667 2:1 3:1 4:-0.698113 5:-0.611872 6:-1 7:-1 8:0.374046 9:-1 10:-1 11:-1 12:-1 13:1 +-1 1:0.458333 2:-1 3:1 4:0.622642 5:-0.0913242 6:-1 7:-1 8:0.267176 9:1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.125 2:-1 3:1 4:-0.698113 5:-0.415525 6:-1 7:1 8:0.343511 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 2:1 3:0.333333 4:-0.320755 5:-0.675799 6:1 7:1 8:0.236641 9:-1 10:-0.612903 11:1 12:-1 13:-1 +-1 1:-0.333333 2:-1 3:1 4:-0.169811 5:-0.497717 6:-1 7:1 8:0.236641 9:1 10:-0.935484 12:-1 13:-1 ++1 1:0.5 2:1 3:-1 4:-0.169811 5:-0.287671 6:1 7:1 8:0.572519 9:-1 10:-0.548387 12:-0.333333 13:-1 +-1 1:0.666667 2:1 3:-1 4:0.245283 5:-0.506849 6:1 7:1 8:-0.0839695 9:-1 10:-0.967742 12:-0.333333 13:-1 ++1 1:0.666667 2:1 3:0.333333 4:-0.132075 5:-0.415525 6:-1 7:1 8:0.145038 9:-1 10:-0.354839 12:1 13:1 ++1 1:0.583333 2:1 3:1 4:-0.886792 5:-0.210046 6:-1 7:1 8:-0.175573 9:1 10:-0.709677 12:0.333333 13:-1 +-1 1:0.625 2:-1 3:0.333333 4:-0.509434 5:-0.611872 6:-1 7:1 8:-0.328244 9:-1 10:-0.516129 12:-1 13:-1 +-1 1:-0.791667 2:1 3:-1 4:-0.54717 5:-0.744292 6:-1 7:1 8:0.572519 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.375 2:-1 3:1 4:-0.169811 5:-0.232877 6:1 7:-1 8:-0.465649 9:-1 10:-0.387097 12:1 13:-1 ++1 1:-0.0833333 2:1 3:1 4:-0.132075 5:-0.214612 6:-1 7:-1 8:-0.221374 9:1 10:0.354839 12:1 13:1 ++1 1:-0.291667 2:1 3:0.333333 4:0.0566038 5:-0.520548 6:-1 7:-1 8:0.160305 9:-1 10:0.16129 12:-1 13:-1 ++1 1:0.583333 2:1 3:1 4:-0.415094 5:-0.415525 6:1 7:-1 8:0.40458 9:-1 10:-0.935484 12:0.333333 13:1 +-1 1:-0.125 2:1 3:0.333333 4:-0.339623 5:-0.680365 6:-1 7:-1 8:0.40458 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.458333 2:1 3:0.333333 4:-0.509434 5:-0.479452 6:1 7:-1 8:0.877863 9:-1 10:-0.741935 11:1 12:-1 13:1 ++1 1:0.125 2:-1 3:1 4:-0.245283 5:0.292237 6:-1 7:1 8:0.206107 9:1 10:-0.387097 12:0.333333 13:1 ++1 1:-0.5 2:1 3:1 4:-0.698113 5:-0.789954 6:-1 7:1 8:0.328244 9:-1 10:-1 11:-1 12:-1 13:1 +-1 1:-0.458333 2:-1 3:1 4:-0.849057 5:-0.365297 6:-1 7:1 8:-0.221374 9:-1 10:-0.806452 12:-1 13:-1 +-1 2:1 3:0.333333 4:-0.320755 5:-0.452055 6:1 7:1 8:0.557252 9:-1 10:-1 11:-1 12:1 13:-1 +-1 1:-0.416667 2:1 3:0.333333 4:-0.320755 5:-0.136986 6:-1 7:-1 8:0.389313 9:-1 10:-0.387097 11:-1 12:-0.333333 13:-1 ++1 1:0.125 2:1 3:1 4:-0.283019 5:-0.73516 6:-1 7:1 8:-0.480916 9:1 10:-0.322581 12:-0.333333 13:0.5 +-1 1:-0.0416667 2:1 3:1 4:-0.735849 5:-0.511416 6:1 7:-1 8:0.160305 9:-1 10:-0.967742 11:-1 12:1 13:1 +-1 1:0.375 2:-1 3:1 4:-0.132075 5:0.223744 6:-1 7:1 8:0.312977 9:-1 10:-0.612903 12:-1 13:-1 ++1 1:0.708333 2:1 3:0.333333 4:0.245283 5:-0.347032 6:-1 7:-1 8:-0.374046 9:1 10:-0.0645161 12:-0.333333 13:1 +-1 1:0.0416667 2:1 3:1 4:-0.132075 5:-0.484018 6:-1 7:-1 8:0.358779 9:-1 10:-0.612903 11:-1 12:-1 13:-1 ++1 1:0.708333 2:1 3:1 4:-0.0377358 5:-0.780822 6:-1 7:-1 8:-0.175573 9:1 10:-0.16129 11:1 12:-1 13:1 +-1 1:0.0416667 2:1 3:-0.333333 4:-0.735849 5:-0.164384 6:-1 7:-1 8:0.29771 9:-1 10:-1 11:-1 12:-1 13:1 ++1 1:-0.75 2:1 3:1 4:-0.396226 5:-0.287671 6:-1 7:1 8:0.29771 9:1 10:-1 11:-1 12:-1 13:1 +-1 1:-0.208333 2:1 3:0.333333 4:-0.433962 5:-0.410959 6:1 7:-1 8:0.587786 9:-1 10:-1 11:-1 12:0.333333 13:-1 +-1 1:0.0833333 2:-1 3:-0.333333 4:-0.226415 5:-0.43379 6:-1 7:1 8:0.374046 9:-1 10:-0.548387 12:-1 13:-1 +-1 1:0.208333 2:-1 3:1 4:-0.886792 5:-0.442922 6:-1 7:1 8:-0.221374 9:-1 10:-0.677419 12:-1 13:-1 +-1 1:0.0416667 2:-1 3:0.333333 4:-0.698113 5:-0.598174 6:-1 7:-1 8:0.328244 9:-1 10:-0.483871 12:-1 13:-1 +-1 1:0.666667 2:-1 3:-1 4:-0.132075 5:-0.484018 6:-1 7:-1 8:0.221374 9:-1 10:-0.419355 11:-1 12:0.333333 13:-1 ++1 1:1 2:1 3:1 4:-0.415094 5:-0.187215 6:-1 7:1 8:0.389313 9:1 10:-1 11:-1 12:1 13:-1 +-1 1:0.625 2:1 3:0.333333 4:-0.54717 5:-0.310502 6:-1 7:-1 8:0.221374 9:-1 10:-0.677419 11:-1 12:-0.333333 13:1 ++1 1:0.208333 2:1 3:1 4:-0.415094 5:-0.205479 6:-1 7:1 8:0.526718 9:-1 10:-1 11:-1 12:0.333333 13:1 ++1 1:0.291667 2:1 3:1 4:-0.415094 5:-0.39726 6:-1 7:1 8:0.0687023 9:1 10:-0.0967742 12:-0.333333 13:1 ++1 1:-0.0833333 2:1 3:1 4:-0.132075 5:-0.210046 6:-1 7:-1 8:0.557252 9:1 10:-0.483871 11:-1 12:-1 13:1 ++1 1:0.0833333 2:1 3:1 4:0.245283 5:-0.255708 6:-1 7:1 8:0.129771 9:1 10:-0.741935 12:-0.333333 13:1 +-1 1:-0.0416667 2:1 3:-1 4:0.0943396 5:-0.214612 6:1 7:-1 8:0.633588 9:-1 10:-0.612903 12:-1 13:1 +-1 1:0.291667 2:-1 3:0.333333 4:-0.849057 5:-0.123288 6:-1 7:-1 8:0.358779 9:-1 10:-1 11:-1 12:-0.333333 13:-1 +-1 1:0.208333 2:1 3:0.333333 4:-0.792453 5:-0.479452 6:-1 7:1 8:0.267176 9:1 10:-0.806452 12:-1 13:1 ++1 1:0.458333 2:1 3:0.333333 4:-0.415094 5:-0.164384 6:-1 7:-1 8:-0.0839695 9:1 10:-0.419355 12:-1 13:1 +-1 1:-0.666667 2:1 3:0.333333 4:-0.320755 5:-0.43379 6:-1 7:-1 8:0.770992 9:-1 10:0.129032 11:1 12:-1 13:-1 ++1 1:0.25 2:1 3:-1 4:0.433962 5:-0.260274 6:-1 7:1 8:0.343511 9:-1 10:-0.935484 12:-1 13:1 +-1 1:-0.0833333 2:1 3:0.333333 4:-0.415094 5:-0.456621 6:1 7:1 8:0.450382 9:-1 10:-0.225806 12:-1 13:-1 +-1 1:-0.416667 2:-1 3:0.333333 4:-0.471698 5:-0.60274 6:-1 7:-1 8:0.435115 9:-1 10:-0.935484 12:-1 13:-1 ++1 1:0.208333 2:1 3:1 4:-0.358491 5:-0.589041 6:-1 7:1 8:-0.0839695 9:1 10:-0.290323 12:1 13:1 +-1 1:-1 2:1 3:-0.333333 4:-0.320755 5:-0.643836 6:-1 7:1 8:1 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.5 2:-1 3:-0.333333 4:-0.320755 5:-0.643836 6:-1 7:1 8:0.541985 9:-1 10:-0.548387 11:-1 12:-1 13:-1 +-1 1:0.416667 2:-1 3:0.333333 4:-0.226415 5:-0.424658 6:-1 7:1 8:0.541985 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.0833333 2:1 3:0.333333 4:-1 5:-0.538813 6:-1 7:-1 8:0.267176 9:1 10:-1 11:-1 12:-0.333333 13:1 +-1 1:0.0416667 2:1 3:0.333333 4:-0.509434 5:-0.39726 6:-1 7:1 8:0.160305 9:-1 10:-0.870968 12:-1 13:1 +-1 1:-0.375 2:1 3:-0.333333 4:-0.509434 5:-0.570776 6:-1 7:-1 8:0.51145 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.0416667 2:1 3:1 4:-0.698113 5:-0.484018 6:-1 7:-1 8:-0.160305 9:1 10:-0.0967742 12:-0.333333 13:1 ++1 1:0.5 2:1 3:1 4:-0.226415 5:-0.415525 6:-1 7:1 8:-0.145038 9:-1 10:-0.0967742 12:-0.333333 13:1 +-1 1:0.166667 2:1 3:0.333333 4:0.0566038 5:-0.808219 6:-1 7:-1 8:0.572519 9:-1 10:-0.483871 11:-1 12:-1 13:-1 ++1 1:0.416667 2:1 3:1 4:-0.320755 5:-0.0684932 6:1 7:1 8:-0.0687023 9:1 10:-0.419355 11:-1 12:1 13:1 +-1 1:-0.75 2:-1 3:1 4:-0.169811 5:-0.739726 6:-1 7:-1 8:0.694656 9:-1 10:-0.548387 11:-1 12:-1 13:-1 +-1 1:-0.5 2:1 3:-0.333333 4:-0.226415 5:-0.648402 6:-1 7:-1 8:-0.0687023 9:-1 10:-1 12:-1 13:0.5 ++1 1:0.375 2:-1 3:0.333333 4:-0.320755 5:-0.374429 6:-1 7:-1 8:-0.603053 9:-1 10:-0.612903 12:-0.333333 13:1 ++1 1:-0.416667 2:-1 3:1 4:-0.283019 5:-0.0182648 6:1 7:1 8:-0.00763359 9:1 10:-0.0322581 12:-1 13:1 +-1 1:0.208333 2:-1 3:-1 4:0.0566038 5:-0.283105 6:1 7:1 8:0.389313 9:-1 10:-0.677419 11:-1 12:-1 13:-1 +-1 1:-0.0416667 2:1 3:-1 4:-0.54717 5:-0.726027 6:-1 7:1 8:0.816794 9:-1 10:-1 12:-1 13:0.5 ++1 1:0.333333 2:-1 3:1 4:-0.0377358 5:-0.173516 6:-1 7:1 8:0.145038 9:1 10:-0.677419 12:-1 13:1 ++1 1:-0.583333 2:1 3:1 4:-0.54717 5:-0.575342 6:-1 7:-1 8:0.0534351 9:-1 10:-0.612903 12:-1 13:1 +-1 1:-0.333333 2:1 3:1 4:-0.603774 5:-0.388128 6:-1 7:1 8:0.740458 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:-0.0416667 2:1 3:1 4:-0.358491 5:-0.410959 6:-1 7:-1 8:0.374046 9:1 10:-1 11:-1 12:-0.333333 13:1 +-1 1:0.375 2:1 3:0.333333 4:-0.320755 5:-0.520548 6:-1 7:-1 8:0.145038 9:-1 10:-0.419355 12:1 13:1 ++1 1:0.375 2:-1 3:1 4:0.245283 5:-0.826484 6:-1 7:1 8:0.129771 9:-1 10:1 11:1 12:1 13:1 +-1 2:-1 3:1 4:-0.169811 5:-0.506849 6:-1 7:1 8:0.358779 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:-0.416667 2:1 3:1 4:-0.509434 5:-0.767123 6:-1 7:1 8:-0.251908 9:1 10:-0.193548 12:-1 13:1 +-1 1:-0.25 2:1 3:0.333333 4:-0.169811 5:-0.401826 6:-1 7:1 8:0.29771 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.0416667 2:1 3:-0.333333 4:-0.509434 5:-0.0913242 6:-1 7:-1 8:0.541985 9:-1 10:-0.935484 11:-1 12:-1 13:-1 ++1 1:0.625 2:1 3:0.333333 4:0.622642 5:-0.324201 6:1 7:1 8:0.206107 9:1 10:-0.483871 12:-1 13:1 +-1 1:-0.583333 2:1 3:0.333333 4:-0.132075 5:-0.109589 6:-1 7:1 8:0.694656 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 2:-1 3:1 4:-0.320755 5:-0.369863 6:-1 7:1 8:0.0992366 9:-1 10:-0.870968 12:-1 13:-1 ++1 1:0.375 2:-1 3:1 4:-0.132075 5:-0.351598 6:-1 7:1 8:0.358779 9:-1 10:0.16129 11:1 12:0.333333 13:-1 +-1 1:-0.0833333 2:-1 3:0.333333 4:-0.132075 5:-0.16895 6:-1 7:1 8:0.0839695 9:-1 10:-0.516129 11:-1 12:-0.333333 13:-1 ++1 1:0.291667 2:1 3:1 4:-0.320755 5:-0.420091 6:-1 7:-1 8:0.114504 9:1 10:-0.548387 11:-1 12:-0.333333 13:1 ++1 1:0.5 2:1 3:1 4:-0.698113 5:-0.442922 6:-1 7:1 8:0.328244 9:-1 10:-0.806452 11:-1 12:0.333333 13:0.5 +-1 1:0.5 2:-1 3:0.333333 4:0.150943 5:-0.347032 6:-1 7:-1 8:0.175573 9:-1 10:-0.741935 11:-1 12:-1 13:-1 ++1 1:0.291667 2:1 3:0.333333 4:-0.132075 5:-0.730594 6:-1 7:1 8:0.282443 9:-1 10:-0.0322581 12:-1 13:-1 ++1 1:0.291667 2:1 3:1 4:-0.0377358 5:-0.287671 6:-1 7:1 8:0.0839695 9:1 10:-0.0967742 12:0.333333 13:1 ++1 1:0.0416667 2:1 3:1 4:-0.509434 5:-0.716895 6:-1 7:-1 8:-0.358779 9:-1 10:-0.548387 12:-0.333333 13:1 +-1 1:-0.375 2:1 3:-0.333333 4:-0.320755 5:-0.575342 6:-1 7:1 8:0.78626 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:-0.375 2:1 3:1 4:-0.660377 5:-0.251142 6:-1 7:1 8:0.251908 9:-1 10:-1 11:-1 12:-0.333333 13:-1 +-1 1:-0.0833333 2:1 3:0.333333 4:-0.698113 5:-0.776256 6:-1 7:-1 8:-0.206107 9:-1 10:-0.806452 11:-1 12:-1 13:-1 +-1 1:0.25 2:1 3:0.333333 4:0.0566038 5:-0.607306 6:1 7:-1 8:0.312977 9:-1 10:-0.483871 11:-1 12:-1 13:-1 +-1 1:0.75 2:-1 3:-0.333333 4:0.245283 5:-0.196347 6:-1 7:-1 8:0.389313 9:-1 10:-0.870968 11:-1 12:0.333333 13:-1 +-1 1:0.333333 2:1 3:0.333333 4:0.0566038 5:-0.465753 6:1 7:-1 8:0.00763359 9:1 10:-0.677419 12:-1 13:-1 ++1 1:0.0833333 2:1 3:1 4:-0.283019 5:0.0365297 6:-1 7:-1 8:-0.0687023 9:1 10:-0.612903 12:-0.333333 13:1 ++1 1:0.458333 2:1 3:0.333333 4:-0.132075 5:-0.0456621 6:-1 7:-1 8:0.328244 9:-1 10:-1 11:-1 12:-1 13:-1 +-1 1:-0.416667 2:1 3:1 4:0.0566038 5:-0.447489 6:-1 7:-1 8:0.526718 9:-1 10:-0.516129 11:-1 12:-1 13:-1 +-1 1:0.208333 2:-1 3:0.333333 4:-0.509434 5:-0.0228311 6:-1 7:-1 8:0.541985 9:-1 10:-1 11:-1 12:-1 13:-1 ++1 1:0.291667 2:1 3:1 4:-0.320755 5:-0.634703 6:-1 7:1 8:-0.0687023 9:1 10:-0.225806 12:0.333333 13:1 ++1 1:0.208333 2:1 3:-0.333333 4:-0.509434 5:-0.278539 6:-1 7:1 8:0.358779 9:-1 10:-0.419355 12:-1 13:-1 +-1 1:-0.166667 2:1 3:-0.333333 4:-0.320755 5:-0.360731 6:-1 7:-1 8:0.526718 9:-1 10:-0.806452 11:-1 12:-1 13:-1 ++1 1:-0.208333 2:1 3:-0.333333 4:-0.698113 5:-0.52968 6:-1 7:-1 8:0.480916 9:-1 10:-0.677419 11:1 12:-1 13:1 +-1 1:-0.0416667 2:1 3:0.333333 4:0.471698 5:-0.666667 6:1 7:-1 8:0.389313 9:-1 10:-0.83871 11:-1 12:-1 13:1 +-1 1:-0.375 2:1 3:-0.333333 4:-0.509434 5:-0.374429 6:-1 7:-1 8:0.557252 9:-1 10:-1 11:-1 12:-1 13:1 +-1 1:0.125 2:-1 3:-0.333333 4:-0.132075 5:-0.232877 6:-1 7:1 8:0.251908 9:-1 10:-0.580645 12:-1 13:-1 +-1 1:0.166667 2:1 3:1 4:-0.132075 5:-0.69863 6:-1 7:-1 8:0.175573 9:-1 10:-0.870968 12:-1 13:0.5 ++1 1:0.583333 2:1 3:1 4:0.245283 5:-0.269406 6:-1 7:1 8:-0.435115 9:1 10:-0.516129 12:1 13:-1 diff --git a/linear.cpp b/linear.cpp new file mode 100644 index 0000000..22373ed --- /dev/null +++ b/linear.cpp @@ -0,0 +1,1446 @@ +#include +#include +#include +#include +#include +#include "linear.h" +#include "tron.h" +typedef signed char schar; +template inline void swap(T& x, T& y) { T t=x; x=y; y=t; } +#ifndef min +template inline T min(T x,T y) { return (x inline T max(T x,T y) { return (x>y)?x:y; } +#endif +template inline void clone(T*& dst, S* src, int n) +{ + dst = new T[n]; + memcpy((void *)dst,(void *)src,sizeof(T)*n); +} +#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) +#define INF HUGE_VAL + +#if 1 +static void info(const char *fmt,...) +{ + va_list ap; + va_start(ap,fmt); + vprintf(fmt,ap); + va_end(ap); +} +static void info_flush() +{ + fflush(stdout); +} +#else +static void info(char *fmt,...) {} +static void info_flush() {} +#endif + +class l2_lr_fun : public function +{ +public: + l2_lr_fun(const problem *prob, double Cp, double Cn); + ~l2_lr_fun(); + + double fun(double *w); + void grad(double *w, double *g); + void Hv(double *s, double *Hs); + + int get_nr_variable(void); + +private: + void Xv(double *v, double *Xv); + void XTv(double *v, double *XTv); + + double *C; + double *z; + double *D; + const problem *prob; +}; + +l2_lr_fun::l2_lr_fun(const problem *prob, double Cp, double Cn) +{ + int i; + int l=prob->l; + int *y=prob->y; + + this->prob = prob; + + z = new double[l]; + D = new double[l]; + C = new double[l]; + + for (i=0; iy; + int l=prob->l; + int n=prob->n; + + Xv(w, z); + for(i=0;i= 0) + f += C[i]*log(1 + exp(-yz)); + else + f += C[i]*(-yz+log(1 + exp(yz))); + } + f = 2*f; + for(i=0;iy; + int l=prob->l; + int n=prob->n; + + for(i=0;in; +} + +void l2_lr_fun::Hv(double *s, double *Hs) +{ + int i; + int l=prob->l; + int n=prob->n; + double *wa = new double[l]; + + Xv(s, wa); + for(i=0;il; + feature_node **x=prob->x; + + for(i=0;iindex!=-1) + { + Xv[i]+=v[s->index-1]*s->value; + s++; + } + } +} + +void l2_lr_fun::XTv(double *v, double *XTv) +{ + int i; + int l=prob->l; + int n=prob->n; + feature_node **x=prob->x; + + for(i=0;iindex!=-1) + { + XTv[s->index-1]+=v[i]*s->value; + s++; + } + } +} + +class l2loss_svm_fun : public function +{ +public: + l2loss_svm_fun(const problem *prob, double Cp, double Cn); + ~l2loss_svm_fun(); + + double fun(double *w); + void grad(double *w, double *g); + void Hv(double *s, double *Hs); + + int get_nr_variable(void); + +private: + void Xv(double *v, double *Xv); + void subXv(double *v, double *Xv); + void subXTv(double *v, double *XTv); + + double *C; + double *z; + double *D; + int *I; + int sizeI; + const problem *prob; +}; + +l2loss_svm_fun::l2loss_svm_fun(const problem *prob, double Cp, double Cn) +{ + int i; + int l=prob->l; + int *y=prob->y; + + this->prob = prob; + + z = new double[l]; + D = new double[l]; + C = new double[l]; + I = new int[l]; + + for (i=0; iy; + int l=prob->l; + int n=prob->n; + + Xv(w, z); + for(i=0;i 0) + f += C[i]*d*d; + } + f = 2*f; + for(i=0;iy; + int l=prob->l; + int n=prob->n; + + sizeI = 0; + for (i=0;in; +} + +void l2loss_svm_fun::Hv(double *s, double *Hs) +{ + int i; + int l=prob->l; + int n=prob->n; + double *wa = new double[l]; + + subXv(s, wa); + for(i=0;il; + feature_node **x=prob->x; + + for(i=0;iindex!=-1) + { + Xv[i]+=v[s->index-1]*s->value; + s++; + } + } +} + +void l2loss_svm_fun::subXv(double *v, double *Xv) +{ + int i; + feature_node **x=prob->x; + + for(i=0;iindex!=-1) + { + Xv[i]+=v[s->index-1]*s->value; + s++; + } + } +} + +void l2loss_svm_fun::subXTv(double *v, double *XTv) +{ + int i; + int n=prob->n; + feature_node **x=prob->x; + + for(i=0;iindex!=-1) + { + XTv[s->index-1]+=v[i]*s->value; + s++; + } + } +} + +// A coordinate descent algorithm for +// multi-class support vector machines by Crammer and Singer +// +// min_{\alpha} 0.5 \sum_m ||w_m(\alpha)||^2 + \sum_i \sum_m e^m_i alpha^m_i +// s.t. \alpha^m_i <= C^m_i \forall m,i , \sum_m \alpha^m_i=0 \forall i +// +// where e^m_i = 0 if y_i = m, +// e^m_i = 1 if y_i != m, +// C^m_i = C if m = y_i, +// C^m_i = 0 if m != y_i, +// and w_m(\alpha) = \sum_i \alpha^m_i x_i +// +// Given: +// x, y, C +// eps is the stopping tolerance +// +// solution will be put in w +class Solver_MCSVM_CS +{ + public: + Solver_MCSVM_CS(const problem *prob, int nr_class, double *C, double eps=0.1, int max_iter=100000); + ~Solver_MCSVM_CS(); + void Solve(double *w); + private: + void solve_sub_problem(double A_i, int yi, double C_yi, int active_i, double *alpha_new); + bool be_shrunk(int m, int yi, double alpha_i, double minG); + double *B, *C, *G; + int n, l; + int nr_class; + int max_iter; + double eps; + const problem *prob; +}; + +Solver_MCSVM_CS::Solver_MCSVM_CS(const problem *prob, int nr_class, double *C, double eps, int max_iter) +{ + this->n = prob->n; + this->l = prob->l; + this->nr_class = nr_class; + this->eps = eps; + this->max_iter = max_iter; + this->prob = prob; + this->C = C; + this->B = new double[nr_class]; + this->G = new double[nr_class]; +} + +Solver_MCSVM_CS::~Solver_MCSVM_CS() +{ + delete[] B; + delete[] G; +} + +int compare_double(const void *a, const void *b) +{ + if(*(double *)a > *(double *)b) + return -1; + if(*(double *)a < *(double *)b) + return 1; + return 0; +} + +void Solver_MCSVM_CS::solve_sub_problem(double A_i, int yi, double C_yi, int active_i, double *alpha_new) +{ + int r; + double *D; + + clone(D, B, active_i); + if(yi < active_i) + D[yi] += A_i*C_yi; + qsort(D, active_i, sizeof(double), compare_double); + + double beta = D[0] - A_i*C_yi; + for(r=1;rx[i]; + QD[i] = 0; + while(xi->index != -1) + { + QD[i] += (xi->value)*(xi->value); + xi++; + } + active_size_i[i] = nr_class; + y_index[i] = prob->y[i]; + index[i] = i; + } + + while(iter < max_iter) + { + double stopping = -INF; + for(i=0;i 0) + { + for(m=0;mx[i]; + while(xi->index!= -1) + { + double *w_i = &w[(xi->index-1)*nr_class]; + for(m=0;mvalue); + xi++; + } + + double minG = INF; + double maxG = -INF; + for(m=0;m maxG) + maxG = G[m]; + } + if(y_index[i] < active_size_i[i]) + if(alpha_i[prob->y[i]] < C[prob->y[i]] && G[y_index[i]] < minG) + minG = G[y_index[i]]; + + for(m=0;mm) + { + if(!be_shrunk(active_size_i[i], y_index[i], + alpha_i[alpha_index_i[active_size_i[i]]], minG)) + { + swap(alpha_index_i[m], alpha_index_i[active_size_i[i]]); + swap(G[m], G[active_size_i[i]]); + if(y_index[i] == active_size_i[i]) + y_index[i] = m; + else if(y_index[i] == m) + y_index[i] = active_size_i[i]; + break; + } + active_size_i[i]--; + } + } + } + + if(active_size_i[i] <= 1) + { + active_size--; + swap(index[s], index[active_size]); + s--; + continue; + } + + if(maxG-minG <= 1e-12) + continue; + else + stopping = max(maxG - minG, stopping); + + for(m=0;my[i]], active_size_i[i], alpha_new); + int nz_d = 0; + for(m=0;m= 1e-12) + { + d_ind[nz_d] = alpha_index_i[m]; + d_val[nz_d] = d; + nz_d++; + } + } + + xi = prob->x[i]; + while(xi->index != -1) + { + double *w_i = &w[(xi->index-1)*nr_class]; + for(m=0;mvalue; + xi++; + } + } + } + + iter++; + if(iter % 10 == 0) + { + info("."); + info_flush(); + } + + if(stopping < eps_shrink) + { + if(stopping < eps && start_from_all == true) + break; + else + { + active_size = l; + for(i=0;i= max_iter) + info("Warning: reaching max number of iterations\n"); + + // calculate objective value + double v = 0; + int nSV = 0; + for(i=0;i 0) + nSV++; + } + for(i=0;iy[i]]; + info("Objective value = %lf\n",v); + info("nSV = %d\n",nSV); + + delete [] alpha; + delete [] alpha_new; + delete [] index; + delete [] QD; + delete [] d_ind; + delete [] d_val; + delete [] alpha_index; + delete [] y_index; + delete [] active_size_i; +} + +// A coordinate descent algorithm for +// L1-loss and L2-loss SVM dual problems +// +// min_\alpha 0.5(\alpha^T (Q + D)\alpha) - e^T \alpha, +// s.t. 0 <= alpha_i <= upper_bound_i, +// +// where Qij = yi yj xi^T xj and +// D is a diagonal matrix +// +// In L1-SVM case: +// upper_bound_i = Cp if y_i = 1 +// upper_bound_i = Cn if y_i = -1 +// D_ii = 0 +// In L2-Svm case: +// upper_bound_i = INF +// D_ii = 1/(2*Cp) if y_i = 1 +// D_ii = 1/(2*Cn) if y_i = -1 +// +// Given: +// x, y, Cp, Cn +// eps is the stopping tolerance +// +// solution will be put in w + +static void solve_linear_c_svc( + const problem *prob, double *w, double eps, + double Cp, double Cn, int solver_type) +{ + int l = prob->l; + int n = prob->n; + int i, s, iter = 0; + double C, d, G; + double *QD = new double[l]; + int max_iter = 20000; + int *index = new int[l]; + double *alpha = new double[l]; + schar *y = new schar[l]; + int active_size = l; + + // PG: projected gradient, for shrinking and stopping + double PG; + double PGmax_old = INF; + double PGmin_old = -INF; + double PGmax_new, PGmin_new; + + // default solver_type: L2LOSS_SVM_DUAL + double diag_p = 0.5/Cp, diag_n = 0.5/Cn; + double upper_bound_p = INF, upper_bound_n = INF; + if(solver_type == L1LOSS_SVM_DUAL) + { + diag_p = 0; diag_n = 0; + upper_bound_p = Cp; upper_bound_n = Cn; + } + + for(i=0; iy[i] > 0) + { + y[i] = +1; + QD[i] = diag_p; + } + else + { + y[i] = -1; + QD[i] = diag_n; + } + + feature_node *xi = prob->x[i]; + while (xi->index != -1) + { + QD[i] += (xi->value)*(xi->value); + xi++; + } + index[i] = i; + } + + while (iter < max_iter) + { + PGmax_new = -INF; + PGmin_new = INF; + + for (i=0; ix[i]; + while(xi->index!= -1) + { + G += w[xi->index-1]*(xi->value); + xi++; + } + G = G*yi-1; + + if(yi == 1) + { + C = upper_bound_p; + G += alpha[i]*diag_p; + } + else + { + C = upper_bound_n; + G += alpha[i]*diag_n; + } + + PG = 0; + if (alpha[i] == 0) + { + if (G > PGmax_old) + { + active_size--; + swap(index[s], index[active_size]); + s--; + continue; + } + else if (G < 0) + PG = G; + } + else if (alpha[i] == C) + { + if (G < PGmin_old) + { + active_size--; + swap(index[s], index[active_size]); + s--; + continue; + } + else if (G > 0) + PG = G; + } + else + PG = G; + + PGmax_new = max(PGmax_new, PG); + PGmin_new = min(PGmin_new, PG); + + if(fabs(PG) > 1.0e-12) + { + double alpha_old = alpha[i]; + alpha[i] = min(max(alpha[i] - G/QD[i], 0.0), C); + d = (alpha[i] - alpha_old)*yi; + xi = prob->x[i]; + while (xi->index != -1) + { + w[xi->index-1] += d*xi->value; + xi++; + } + } + } + + iter++; + if(iter % 10 == 0) + { + info("."); + info_flush(); + } + + if(PGmax_new - PGmin_new <= eps) + { + if(active_size == l) + break; + else + { + active_size = l; + info("*"); info_flush(); + PGmax_old = INF; + PGmin_old = -INF; + continue; + } + } + PGmax_old = PGmax_new; + PGmin_old = PGmin_new; + if (PGmax_old <= 0) + PGmax_old = INF; + if (PGmin_old >= 0) + PGmin_old = -INF; + } + + info("\noptimization finished, #iter = %d\n",iter); + if (iter >= max_iter) + info("Warning: reaching max number of iterations\n"); + + // calculate objective value + + double v = 0; + int nSV = 0; + for(i=0; i 0) + ++nSV; + } + info("Objective value = %lf\n",v/2); + info("nSV = %d\n",nSV); + + delete [] QD; + delete [] alpha; + delete [] y; + delete [] index; +} + +// label: label name, start: begin of each class, count: #data of classes, perm: indices to the original data +// perm, length l, must be allocated before calling this subroutine +void group_classes(const problem *prob, int *nr_class_ret, int **label_ret, int **start_ret, int **count_ret, int *perm) +{ + int l = prob->l; + int max_nr_class = 16; + 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 i; + + for(i=0;iy[i]; + int j; + for(j=0;jeps; + int pos = 0; + int neg = 0; + for(int i=0;il;i++) + if(prob->y[i]==+1) + pos++; + neg = prob->l - pos; + + function *fun_obj=NULL; + switch(param->solver_type) + { + case L2_LR: + { + fun_obj=new l2_lr_fun(prob, Cp, Cn); + TRON tron_obj(fun_obj, eps*min(pos,neg)/prob->l); + tron_obj.tron(w); + delete fun_obj; + break; + } + case L2LOSS_SVM: + { + fun_obj=new l2loss_svm_fun(prob, Cp, Cn); + TRON tron_obj(fun_obj, eps*min(pos,neg)/prob->l); + tron_obj.tron(w); + delete fun_obj; + break; + } + case L2LOSS_SVM_DUAL: + solve_linear_c_svc(prob, w, eps, Cp, Cn, L2LOSS_SVM_DUAL); + break; + case L1LOSS_SVM_DUAL: + solve_linear_c_svc(prob, w, eps, Cp, Cn, L1LOSS_SVM_DUAL); + break; + default: + fprintf(stderr, "Error: unknown solver_type\n"); + break; + } +} + +// +// Interface functions +// +model* train(const problem *prob, const parameter *param) +{ + int i,j; + int l = prob->l; + int n = prob->n; + model *model_ = Malloc(model,1); + + if(prob->bias>=0) + model_->nr_feature=n-1; + else + model_->nr_feature=n; + model_->param = *param; + model_->bias = prob->bias; + + int nr_class; + int *label = NULL; + int *start = NULL; + int *count = NULL; + int *perm = Malloc(int,l); + + // group training data of the same class + group_classes(prob,&nr_class,&label,&start,&count,perm); + + model_->nr_class=nr_class; + model_->label = Malloc(int,nr_class); + for(i=0;ilabel[i] = label[i]; + + // calculate weighted C + double *weighted_C = Malloc(double, nr_class); + for(i=0;iC; + for(i=0;inr_weight;i++) + { + for(j=0;jweight_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]); + else + weighted_C[j] *= param->weight[i]; + } + + // constructing the subproblem + feature_node **x = Malloc(feature_node *,l); + for(i=0;ix[perm[i]]; + + int k; + problem sub_prob; + sub_prob.l = l; + sub_prob.n = n; + sub_prob.x = Malloc(feature_node *,sub_prob.l); + sub_prob.y = Malloc(int,sub_prob.l); + + for(k=0; ksolver_type == MCSVM_CS) + { + model_->w=Malloc(double, n*nr_class); + for(i=0;ieps); + Solver.Solve(model_->w); + } + else + { + if(nr_class == 2) + { + model_->w=Malloc(double, n); + + int e0 = start[0]+count[0]; + k=0; + for(; kw[0], weighted_C[0], weighted_C[1]); + } + else + { + model_->w=Malloc(double, n*nr_class); + double *w=Malloc(double, n); + for(i=0;iC); + + for(int j=0;jw[j*nr_class+i] = w[j]; + } + free(w); + } + + } + + free(x); + free(label); + free(start); + free(count); + free(perm); + free(sub_prob.x); + free(sub_prob.y); + free(weighted_C); + return model_; +} + +void destroy_model(struct model *model_) +{ + if(model_->w != NULL) + free(model_->w); + if(model_->label != NULL) + free(model_->label); + free(model_); +} + +const char *solver_type_table[]= +{ + "L2_LR", "L2LOSS_SVM_DUAL", "L2LOSS_SVM","L1LOSS_SVM_DUAL","MCSVM_CS", NULL +}; + +int save_model(const char *model_file_name, const struct model *model_) +{ + int i; + int nr_feature=model_->nr_feature; + int n; + const parameter& param = model_->param; + + if(model_->bias>=0) + n=nr_feature+1; + else + n=nr_feature; + FILE *fp = fopen(model_file_name,"w"); + if(fp==NULL) return -1; + + int nr_w; + if(model_->nr_class==2 && model_->param.solver_type != MCSVM_CS) + nr_w=1; + else + nr_w=model_->nr_class; + + fprintf(fp, "solver_type %s\n", solver_type_table[param.solver_type]); + fprintf(fp, "nr_class %d\n", model_->nr_class); + fprintf(fp, "label"); + for(i=0; inr_class; i++) + fprintf(fp, " %d", model_->label[i]); + fprintf(fp, "\n"); + + fprintf(fp, "nr_feature %d\n", nr_feature); + + fprintf(fp, "bias %.16g\n", model_->bias); + + fprintf(fp, "w\n"); + for(i=0; iw[i*nr_w+j]); + fprintf(fp, "\n"); + } + + if (ferror(fp) != 0 || fclose(fp) != 0) return -1; + else return 0; +} + +struct model *load_model(const char *model_file_name) +{ + FILE *fp = fopen(model_file_name,"r"); + if(fp==NULL) return NULL; + + int i; + int nr_feature; + int n; + int nr_class; + double bias; + model *model_ = Malloc(model,1); + parameter& param = model_->param; + + model_->label = NULL; + + char cmd[81]; + while(1) + { + fscanf(fp,"%80s",cmd); + if(strcmp(cmd,"solver_type")==0) + { + fscanf(fp,"%80s",cmd); + int i; + for(i=0;solver_type_table[i];i++) + { + if(strcmp(solver_type_table[i],cmd)==0) + { + param.solver_type=i; + break; + } + } + if(solver_type_table[i] == NULL) + { + fprintf(stderr,"unknown solver type.\n"); + free(model_->label); + free(model_); + return NULL; + } + } + else if(strcmp(cmd,"nr_class")==0) + { + fscanf(fp,"%d",&nr_class); + model_->nr_class=nr_class; + } + else if(strcmp(cmd,"nr_feature")==0) + { + fscanf(fp,"%d",&nr_feature); + model_->nr_feature=nr_feature; + } + else if(strcmp(cmd,"bias")==0) + { + fscanf(fp,"%lf",&bias); + model_->bias=bias; + } + else if(strcmp(cmd,"w")==0) + { + break; + } + else if(strcmp(cmd,"label")==0) + { + int nr_class = model_->nr_class; + model_->label = Malloc(int,nr_class); + for(int i=0;ilabel[i]); + } + else + { + fprintf(stderr,"unknown text in model file: [%s]\n",cmd); + free(model_); + return NULL; + } + } + + nr_feature=model_->nr_feature; + if(model_->bias>=0) + n=nr_feature+1; + else + n=nr_feature; + + int nr_w; + if(nr_class==2 && param.solver_type != MCSVM_CS) + nr_w = 1; + else + nr_w = nr_class; + + model_->w=Malloc(double, n*nr_w); + for(i=0; iw[i*nr_w+j]); + fscanf(fp, "\n"); + } + if (ferror(fp) != 0 || fclose(fp) != 0) return NULL; + + return model_; +} + +int predict_values(const struct model *model_, const struct feature_node *x, double *dec_values) +{ + int idx; + int n; + if(model_->bias>=0) + n=model_->nr_feature+1; + else + n=model_->nr_feature; + double *w=model_->w; + int nr_class=model_->nr_class; + int i; + int nr_w; + if(nr_class==2 && model_->param.solver_type != MCSVM_CS) + nr_w = 1; + else + nr_w = nr_class; + + const feature_node *lx=x; + for(i=0;iindex)!=-1; lx++) + { + // the dimension of testing data may exceed that of training + if(idx<=n) + for(i=0;ivalue; + } + + if(nr_class==2) + return (dec_values[0]>0)?model_->label[0]:model_->label[1]; + else + { + int dec_max_idx = 0; + for(i=1;i dec_values[dec_max_idx]) + dec_max_idx = i; + } + return model_->label[dec_max_idx]; + } +} + +int predict(const model *model_, const feature_node *x) +{ + double *dec_values = Malloc(double, model_->nr_class); + int label=predict_values(model_, x, dec_values); + free(dec_values); + return label; +} + +int predict_probability(const struct model *model_, const struct feature_node *x, double* prob_estimates) +{ + if(model_->param.solver_type==L2_LR) + { + int i; + int nr_class=model_->nr_class; + int nr_w; + if(nr_class==2) + nr_w = 1; + else + nr_w = nr_class; + + int label=predict_values(model_, x, prob_estimates); + for(i=0;iweight_label != NULL) + free(param->weight_label); + if(param->weight != NULL) + free(param->weight); +} + +const char *check_parameter(const problem *prob, const parameter *param) +{ + if(param->eps <= 0) + return "eps <= 0"; + + if(param->C <= 0) + return "C <= 0"; + + if(param->solver_type != L2_LR + && param->solver_type != L2LOSS_SVM_DUAL + && param->solver_type != L2LOSS_SVM + && param->solver_type != L1LOSS_SVM_DUAL + && param->solver_type != MCSVM_CS) + return "unknown solver type"; + + return NULL; +} + +void cross_validation(const problem *prob, const parameter *param, int nr_fold, int *target) +{ + int i; + int *fold_start = Malloc(int,nr_fold+1); + int l = prob->l; + int *perm = Malloc(int,l); + + for(i=0;ibias; + subprob.n = prob->n; + subprob.l = l-(end-begin); + subprob.x = Malloc(struct feature_node*,subprob.l); + subprob.y = Malloc(int,subprob.l); + + k=0; + for(j=0;jx[perm[j]]; + subprob.y[k] = prob->y[perm[j]]; + ++k; + } + for(j=end;jx[perm[j]]; + subprob.y[k] = prob->y[perm[j]]; + ++k; + } + struct model *submodel = train(&subprob,param); + for(j=begin;jx[perm[j]]); + destroy_model(submodel); + free(subprob.x); + free(subprob.y); + } + free(fold_start); + free(perm); +} + +int get_nr_feature(const model *model_) +{ + return model_->nr_feature; +} + +int get_nr_class(const model *model_) +{ + return model_->nr_class; +} + +void get_labels(const model *model_, int* label) +{ + if (model_->label != NULL) + for(int i=0;inr_class;i++) + label[i] = model_->label[i]; +} + diff --git a/linear.h b/linear.h new file mode 100644 index 0000000..5031d5a --- /dev/null +++ b/linear.h @@ -0,0 +1,69 @@ +#ifndef _LIBLINEAR_H +#define _LIBLINEAR_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct feature_node +{ + int index; + double value; +}; + +struct problem +{ + int l, n; + int *y; + struct feature_node **x; + double bias; /* < 0 if no bias term */ +}; + +enum { L2_LR, L2LOSS_SVM_DUAL, L2LOSS_SVM, L1LOSS_SVM_DUAL, MCSVM_CS }; /* solver_type */ + +struct parameter +{ + int solver_type; + + /* these are for training only */ + double eps; /* stopping criteria */ + double C; + int nr_weight; + int *weight_label; + double* weight; +}; + +struct model +{ + struct parameter param; + int nr_class; /* number of classes */ + int nr_feature; + double *w; + int *label; /* label of each class (label[n]) */ + double bias; +}; + +struct model* train(const struct problem *prob, const struct parameter *param); +void cross_validation(const struct problem *prob, const struct parameter *param, int nr_fold, int *target); + +int predict_values(const struct model *model_, const struct feature_node *x, double* dec_values); +int predict(const struct model *model_, const struct feature_node *x); +int predict_probability(const struct model *model_, const struct feature_node *x, double* prob_estimates); + +int save_model(const char *model_file_name, const struct model *model_); +struct model *load_model(const char *model_file_name); + +int get_nr_feature(const struct model *model_); +int get_nr_class(const struct model *model_); +void get_labels(const struct model *model_, int* label); + +void destroy_model(struct model *model_); +void destroy_param(struct parameter *param); +const char *check_parameter(const struct problem *prob, const struct parameter *param); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBLINEAR_H */ + diff --git a/matlab/Makefile b/matlab/Makefile new file mode 100644 index 0000000..e44cd1e --- /dev/null +++ b/matlab/Makefile @@ -0,0 +1,58 @@ +# This Makefile is used under Linux + +MATLABDIR ?= /usr/local/matlab +CXX ?= g++ +#CXX = g++-3.3 +CC ?= gcc +CFLAGS = -Wall -Wconversion -O3 -fPIC -I$(MATLABDIR)/extern/include -I.. + +MEX = $(MATLABDIR)/bin/mex +MEX_OPTION = CC\#$(CXX) CXX\#$(CXX) CFLAGS\#"$(CFLAGS)" CXXFLAGS\#"$(CFLAGS)" +# comment the following line if you use MATLAB on a 32-bit computer +MEX_OPTION += -largeArrayDims +MEX_EXT = $(shell $(MATLABDIR)/bin/mexext) + +OCTAVEDIR ?= /usr/include/octave +OCTAVE_MEX = env CC=$(CXX) mkoctfile +OCTAVE_MEX_OPTION = --mex +OCTAVE_MEX_EXT = mex +OCTAVE_CFLAGS = -Wall -O3 -fPIC -I$(OCTAVEDIR) -I.. + +all: matlab + +matlab: binary + +octave: + @make MEX="$(OCTAVE_MEX)" MEX_OPTION="$(OCTAVE_MEX_OPTION)" \ + MEX_EXT="$(OCTAVE_MEX_EXT)" CFLAGS="$(OCTAVE_CFLAGS)" \ + binary + +binary: train.$(MEX_EXT) predict.$(MEX_EXT) libsvmread.$(MEX_EXT) libsvmwrite.$(MEX_EXT) + +train.$(MEX_EXT): train.c ../linear.h tron.o linear.o linear_model_matlab.o ../blas/blas.a + $(MEX) $(MEX_OPTION) train.c tron.o linear.o linear_model_matlab.o ../blas/blas.a + +predict.$(MEX_EXT): predict.c ../linear.h tron.o linear.o linear_model_matlab.o ../blas/blas.a + $(MEX) $(MEX_OPTION) predict.c tron.o linear.o linear_model_matlab.o ../blas/blas.a + +libsvmread.$(MEX_EXT): libsvmread.c + $(MEX) $(MEX_OPTION) libsvmread.c + +libsvmwrite.$(MEX_EXT): libsvmwrite.c + $(MEX) $(MEX_OPTION) libsvmwrite.c + +linear_model_matlab.o: linear_model_matlab.c ../linear.h + $(CXX) $(CFLAGS) -c linear_model_matlab.c + +linear.o: ../linear.cpp ../linear.h + $(CXX) $(CFLAGS) -c ../linear.cpp + +tron.o: ../tron.cpp ../tron.h + $(CXX) $(CFLAGS) -c ../tron.cpp + +../blas/blas.a: + cd ../blas; make OPTFLAGS='$(CFLAGS)' CC='$(CC)'; + +clean: + cd ../blas; make clean + rm -f *~ *.o *.mex* *.obj diff --git a/matlab/README b/matlab/README new file mode 100644 index 0000000..d20884c --- /dev/null +++ b/matlab/README @@ -0,0 +1,184 @@ +-------------------------------------------- +--- MATLAB/OCTAVE interface of LIBLINEAR --- +-------------------------------------------- + +Table of Contents +================= + +- Introduction +- Installation +- Usage +- Returned Model Structure +- Examples +- Other Utilities +- Additional Information + + +Introduction +============ + +This tool provides a simple interface to LIBLINEAR, a library for +large-scale regularized linear classification +(http://www.csie.ntu.edu.tw/~cjlin/liblinear). It is very easy to use +as the usage and the way of specifying parameters are the same as that +of LIBLINEAR. + +Installation +============ + +On Unix systems, we recommend using GNU g++ as your compiler and type +'make' to build 'train.mexglx' and 'predict.mexglx'. Note that we +assume your MATLAB is installed in '/usr/local/matlab', if not, please +change MATLABDIR in Makefile. + +Example: + linux> make + +To use Octave, type 'make octave': + +Example: + linux> make octave + +On Windows systems, pre-built 'train.mexw32' and 'predict.mexw32' are +included in this package (in ..\windows), so no need to conduct +installation unless you run 64 bit windows. If you have modified the +sources and would like to re-build the package, type 'mex -setup' in +MATLAB to choose a compiler for mex first. Then type 'make' to start +the installation. + +Example: + matlab> mex -setup + (ps: MATLAB will show the following messages to setup default compiler.) + Please choose your compiler for building external interface (MEX) files: + Would you like mex to locate installed compilers [y]/n? y + Select a compiler: + [1] Microsoft Visual C/C++ 2005 in C:\Program Files\Microsoft Visual Studio 8 + [0] None + Compiler: 1 + Please verify your choices: + Compiler: Microsoft Visual C/C++ 2005 + Location: C:\Program Files\Microsoft Visual Studio 8 + Are these correct?([y]/n): y + + matlab> make + +Under 64-bit Windows, Visual Studio 2005 user will need "X64 Compiler and Tools". +The package won't be installed by default, but you can find it in customized +installation options. + +For list of supported/compatible compilers for MATLAB, please check the +following page: + +http://www.mathworks.com/support/compilers/current_release/ + +Usage +===== + +matlab> model = train(training_label_vector, training_instance_matrix [,'liblinear_options', 'col']); + + -training_label_vector: + An m by 1 vector of training labels. (type must be double) + -training_instance_matrix: + An m by n matrix of m training instances with n features. + It must be a sparse matrix. (type must be double) + -liblinear_options: + A string of training options in the same format as that of LIBLINEAR. + -col: + if 'col' is set, each column of training_instance_matrix is a data instance. Otherwise each row is a data instance. + +matlab> [predicted_label, accuracy, decision_values/prob_estimates] = predict(testing_label_vector, testing_instance_matrix, model [, 'liblinear_options', 'col']); + + -testing_label_vector: + An m by 1 vector of prediction labels. If labels of test + data are unknown, simply use any random values. (type must be double) + -testing_instance_matrix: + An m by n matrix of m testing instances with n features. + It must be a sparse matrix. (type must be double) + -model: + The output of train. + -liblinear_options: + A string of testing options in the same format as that of LIBLINEAR. + -col: + if 'col' is set, each column of testing_instance_matrix is a data instance. Otherwise each row is a data instance. + +Returned Model Structure +======================== + +The 'train' function returns a model which can be used for future +prediction. It is a structure and is organized as [Parameters, nr_class, +nr_feature, bias, Label, w]: + + -Parameters: Parameters + -nr_class: number of classes + -nr_feature: number of features in training data (without including the bias term) + -bias: If >= 0, we assume one additional feature is added to the end + of each data instance. + -Label: label of each class + -w: a nr_w-by-n matrix for the weights, where n is nr_feature + or nr_feature+1 depending on the existence of the bias term. + nr_w is 1 if nr_class=2 and -s is not 4 (i.e., not + multi-class svm by Crammer and Singer). It is + nr_class otherwise. + +If the '-v' option is specified, cross validation is conducted and the +returned model is just a scalar: cross-validation accuracy. + +Result of Prediction +==================== + +The function 'predict' has three outputs. The first one, +predicted_label, is a vector of predicted labels. +The second output is a scalar meaning accuracy. +The third is a matrix containing decision values or probability +estimates (if '-b 1' is specified). If k is the number of classes +and k' is the number of classifiers (k'=1 if k=2, otherwise k'=k), for decision values, +each row includes results of k' binary linear classifiers. For probabilities, +each row contains k values indicating the probability that the testing instance is in +each class. Note that the order of classes here is the same as 'Label' +field in the model structure. + +Examples +======== + +Train and test on the provided data heart_scale: + +matlab> [heart_scale_label, heart_scale_inst] = libsvmread('../heart_scale'); +matlab> model = train(heart_scale_label, heart_scale_inst, '-c 1'); +matlab> [predict_label, accuracy, dec_values] = predict(heart_scale_label, heart_scale_inst, model); % test the training data + +Note that for testing, you can put anything in the testing_label_vector. + +For probability estimates, you need '-b 1' for training and testing: + +matlab> [predict_label, accuracy, prob_estimates] = predict(heart_scale_label, heart_scale_inst, model, '-b 1'); + +Other Utilities +=============== + +A matlab function libsvmread reads files in LIBSVM format: + +[label_vector, instance_matrix] = libsvmread('data.txt'); + +Two outputs are labels and instances, which can then be used as inputs +of svmtrain or svmpredict. + +A matlab function libsvmwrite writes Matlab matrix to a file in LIBSVM format: + +libsvmwrite('data.txt', label_vector, instance_matrix] + +The instance_matrix must be a sparse matrix. (type must be double) +These codes are prepared by Rong-En Fan and Kai-Wei Chang from National +Taiwan University. + +Additional Information +====================== + +Please cite LIBLINEAR as follows + +R.-E. Fan, K.-W. Chang, C.-J. Hsieh, X.-R. Wang, and C.-J. Lin. +LIBLINEAR: A Library for Large Linear Classification, Journal of +Machine Learning Research 9(2008), 1871-1874.Software available at +http://www.csie.ntu.edu.tw/~cjlin/liblinear + +For any question, please contact Chih-Jen Lin . + diff --git a/matlab/libsvmread.c b/matlab/libsvmread.c new file mode 120000 index 0000000..1b227d1 --- /dev/null +++ b/matlab/libsvmread.c @@ -0,0 +1 @@ +/home/faculty/cjlin/software/svm/libsvm/libsvm-matlab/libsvmread.c \ No newline at end of file diff --git a/matlab/libsvmwrite.c b/matlab/libsvmwrite.c new file mode 120000 index 0000000..5fcd858 --- /dev/null +++ b/matlab/libsvmwrite.c @@ -0,0 +1 @@ +/home/faculty/cjlin/software/svm/libsvm/libsvm-matlab/libsvmwrite.c \ No newline at end of file diff --git a/matlab/linear_model_matlab.c b/matlab/linear_model_matlab.c new file mode 100644 index 0000000..d330fb7 --- /dev/null +++ b/matlab/linear_model_matlab.c @@ -0,0 +1,168 @@ +#include +#include +#include "linear.h" + +#include "mex.h" + +#if MX_API_VER < 0x07030000 +typedef int mwIndex; +#endif + +#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) + +#define NUM_OF_RETURN_FIELD 6 + +static const char *field_names[] = { + "Parameters", + "nr_class", + "nr_feature", + "bias", + "Label", + "w", +}; + +const char *model_to_matlab_structure(mxArray *plhs[], struct model *model_) +{ + int i; + int nr_w; + double *ptr; + mxArray *return_model, **rhs; + int out_id = 0; + int n; + + rhs = (mxArray **)mxMalloc(sizeof(mxArray *)*NUM_OF_RETURN_FIELD); + + // Parameters + // for now, only solver_type is needed + rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); + ptr = mxGetPr(rhs[out_id]); + ptr[0] = model_->param.solver_type; + out_id++; + + // nr_class + rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); + ptr = mxGetPr(rhs[out_id]); + ptr[0] = model_->nr_class; + out_id++; + + if(model_->nr_class==2 && model_->param.solver_type != MCSVM_CS) + nr_w=1; + else + nr_w=model_->nr_class; + + // nr_feature + rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); + ptr = mxGetPr(rhs[out_id]); + ptr[0] = model_->nr_feature; + out_id++; + + // bias + rhs[out_id] = mxCreateDoubleMatrix(1, 1, mxREAL); + ptr = mxGetPr(rhs[out_id]); + ptr[0] = model_->bias; + out_id++; + + if(model_->bias>=0) + n=model_->nr_feature+1; + else + n=model_->nr_feature; + + // Label + if(model_->label) + { + rhs[out_id] = mxCreateDoubleMatrix(model_->nr_class, 1, mxREAL); + ptr = mxGetPr(rhs[out_id]); + for(i = 0; i < model_->nr_class; i++) + ptr[i] = model_->label[i]; + } + else + rhs[out_id] = mxCreateDoubleMatrix(0, 0, mxREAL); + out_id++; + + // w + rhs[out_id] = mxCreateDoubleMatrix(nr_w, n, mxREAL); + ptr = mxGetPr(rhs[out_id]); + for(i = 0; i < n*nr_w; i++) + ptr[i]=model_->w[i]; + out_id++; + + /* Create a struct matrix contains NUM_OF_RETURN_FIELD fields */ + return_model = mxCreateStructMatrix(1, 1, NUM_OF_RETURN_FIELD, field_names); + + /* Fill struct matrix with input arguments */ + for(i = 0; i < NUM_OF_RETURN_FIELD; i++) + mxSetField(return_model,0,field_names[i],mxDuplicateArray(rhs[i])); + /* return */ + plhs[0] = return_model; + mxFree(rhs); + + return NULL; +} + +const char *matlab_matrix_to_model(struct model *model_, const mxArray *matlab_struct) +{ + int i, num_of_fields; + int nr_w; + double *ptr; + int id = 0; + int n; + mxArray **rhs; + + num_of_fields = mxGetNumberOfFields(matlab_struct); + rhs = (mxArray **) mxMalloc(sizeof(mxArray *)*num_of_fields); + + for(i=0;inr_class=0; + nr_w=0; + model_->nr_feature=0; + model_->w=NULL; + model_->label=NULL; + + // Parameters + ptr = mxGetPr(rhs[id]); + model_->param.solver_type = (int)ptr[0]; + id++; + + // nr_class + ptr = mxGetPr(rhs[id]); + model_->nr_class = (int)ptr[0]; + id++; + + if(model_->nr_class==2 && model_->param.solver_type != MCSVM_CS) + nr_w=1; + else + nr_w=model_->nr_class; + + // nr_feature + ptr = mxGetPr(rhs[id]); + model_->nr_feature = (int)ptr[0]; + id++; + + // bias + ptr = mxGetPr(rhs[id]); + model_->bias = (int)ptr[0]; + id++; + + if(model_->bias>=0) + n=model_->nr_feature+1; + else + n=model_->nr_feature; + + ptr = mxGetPr(rhs[id]); + model_->label=Malloc(int, model_->nr_class); + for(i=0; inr_class; i++) + model_->label[i]=(int)ptr[i]; + id++; + + ptr = mxGetPr(rhs[id]); + model_->w=Malloc(double, nr_w*n); + for(i = 0; i < n*nr_w; i++) + model_->w[i]=ptr[i]; + id++; + mxFree(rhs); + + return NULL; +} + diff --git a/matlab/linear_model_matlab.h b/matlab/linear_model_matlab.h new file mode 100644 index 0000000..2d1b16a --- /dev/null +++ b/matlab/linear_model_matlab.h @@ -0,0 +1,2 @@ +const char *model_to_matlab_structure(mxArray *plhs[], struct model *model_); +const char *matlab_matrix_to_model(struct model *model_, const mxArray *matlab_struct); diff --git a/matlab/make.m b/matlab/make.m new file mode 100644 index 0000000..1258e13 --- /dev/null +++ b/matlab/make.m @@ -0,0 +1,10 @@ +% This make.m is used under Windows + +mex -O -largeArrayDims -c ..\blas\*.c -outdir ..\blas +mex -O -largeArrayDims -c ..\linear.cpp +mex -O -largeArrayDims -c ..\tron.cpp +mex -O -largeArrayDims -c linear_model_matlab.c -I..\ +mex -O -largeArrayDims train.c -I..\ tron.obj linear.obj linear_model_matlab.obj ..\blas\*.obj +mex -O -largeArrayDims predict.c -I..\ tron.obj linear.obj linear_model_matlab.obj ..\blas\*.obj +mex -O -largeArrayDims libsvmread.c +mex -O -largeArrayDims libsvmwrite.c diff --git a/matlab/predict.c b/matlab/predict.c new file mode 100644 index 0000000..7bd9027 --- /dev/null +++ b/matlab/predict.c @@ -0,0 +1,300 @@ +#include +#include +#include +#include "linear.h" + +#include "mex.h" +#include "linear_model_matlab.h" + +#if MX_API_VER < 0x07030000 +typedef int mwIndex; +#endif + +#define CMD_LEN 2048 + +#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) + +int col_format_flag; + +void read_sparse_instance(const mxArray *prhs, int index, struct feature_node *x, int feature_number, double bias) +{ + int i, j, low, high; + mwIndex *ir, *jc; + double *samples; + + ir = mxGetIr(prhs); + jc = mxGetJc(prhs); + samples = mxGetPr(prhs); + + // each column is one instance + j = 0; + low = (int) jc[index], high = (int) jc[index+1]; + for(i=low; i=0) + { + x[j].index = feature_number+1; + x[j].value = bias; + j++; + } + x[j].index = -1; +} + +static void fake_answer(mxArray *plhs[]) +{ + plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL); + plhs[1] = mxCreateDoubleMatrix(0, 0, mxREAL); + plhs[2] = mxCreateDoubleMatrix(0, 0, mxREAL); +} + +void do_predict(mxArray *plhs[], const mxArray *prhs[], struct model *model_, const int predict_probability_flag) +{ + int label_vector_row_num, label_vector_col_num; + int feature_number, testing_instance_number; + int instance_index; + double *ptr_instance, *ptr_label, *ptr_predict_label; + double *ptr_prob_estimates, *ptr_dec_values, *ptr; + struct feature_node *x; + mxArray *pplhs[1]; // instance sparse matrix in row format + + int correct = 0; + int total = 0; + + int nr_class=get_nr_class(model_); + int nr_w; + double *prob_estimates=NULL; + + if(nr_class==2 && model_->param.solver_type!=MCSVM_CS) + nr_w=1; + else + nr_w=nr_class; + + // prhs[1] = testing instance matrix + feature_number = get_nr_feature(model_); + testing_instance_number = (int) mxGetM(prhs[1]); + if(col_format_flag) + { + feature_number = (int) mxGetM(prhs[1]); + testing_instance_number = (int) mxGetN(prhs[1]); + } + + label_vector_row_num = (int) mxGetM(prhs[0]); + label_vector_col_num = (int) mxGetN(prhs[0]); + + if(label_vector_row_num!=testing_instance_number) + { + mexPrintf("Length of label vector does not match # of instances.\n"); + fake_answer(plhs); + return; + } + if(label_vector_col_num!=1) + { + mexPrintf("label (1st argument) should be a vector (# of column is 1).\n"); + fake_answer(plhs); + return; + } + + ptr_instance = mxGetPr(prhs[1]); + ptr_label = mxGetPr(prhs[0]); + + // transpose instance matrix + if(mxIsSparse(prhs[1])) + { + if(col_format_flag) + { + pplhs[0] = (mxArray *)prhs[1]; + } + else + { + mxArray *pprhs[1]; + pprhs[0] = mxDuplicateArray(prhs[1]); + if(mexCallMATLAB(1, pplhs, 1, pprhs, "transpose")) + { + mexPrintf("Error: cannot transpose testing instance matrix\n"); + fake_answer(plhs); + return; + } + } + } + else + mexPrintf("Testing_instance_matrix must be sparse\n"); + + + prob_estimates = Malloc(double, nr_class); + + plhs[0] = mxCreateDoubleMatrix(testing_instance_number, 1, mxREAL); + if(predict_probability_flag) + plhs[2] = mxCreateDoubleMatrix(testing_instance_number, nr_class, mxREAL); + else + plhs[2] = mxCreateDoubleMatrix(testing_instance_number, nr_w, mxREAL); + + ptr_predict_label = mxGetPr(plhs[0]); + ptr_prob_estimates = mxGetPr(plhs[2]); + ptr_dec_values = mxGetPr(plhs[2]); + x = Malloc(struct feature_node, feature_number+2); + for(instance_index=0;instance_indexbias); + + if(predict_probability_flag) + { + v = predict_probability(model_, x, prob_estimates); + ptr_predict_label[instance_index] = v; + for(i=0;i 5 || nrhs < 3) + { + exit_with_help(); + fake_answer(plhs); + return; + } + if(nrhs == 5) + { + mxGetString(prhs[4], cmd, mxGetN(prhs[4])+1); + if(strcmp(cmd, "col") == 0) + { + col_format_flag = 1; + } + } + + if(!mxIsDouble(prhs[0]) || !mxIsDouble(prhs[1])) { + mexPrintf("Error: label vector and instance matrix must be double\n"); + fake_answer(plhs); + return; + } + + if(mxIsStruct(prhs[2])) + { + const char *error_msg; + + // parse options + if(nrhs>=4) + { + int i, argc = 1; + char *argv[CMD_LEN/2]; + + // put options in argv[] + mxGetString(prhs[3], cmd, mxGetN(prhs[3]) + 1); + if((argv[argc] = strtok(cmd, " ")) != NULL) + while((argv[++argc] = strtok(NULL, " ")) != NULL) + ; + + for(i=1;i=argc) + { + exit_with_help(); + fake_answer(plhs); + return; + } + switch(argv[i-1][1]) + { + case 'b': + prob_estimate_flag = atoi(argv[i]); + break; + default: + mexPrintf("unknown option\n"); + exit_with_help(); + fake_answer(plhs); + return; + } + } + } + + model_ = Malloc(struct model, 1); + error_msg = matlab_matrix_to_model(model_, prhs[2]); + if(error_msg) + { + mexPrintf("Error: can't read model: %s\n", error_msg); + destroy_model(model_); + fake_answer(plhs); + return; + } + + if(prob_estimate_flag) + { + if(model_->param.solver_type!=L2_LR) + { + mexPrintf("probability output is only supported for logistic regression\n"); + prob_estimate_flag=0; + } + } + + if(mxIsSparse(prhs[1])) + do_predict(plhs, prhs, model_, prob_estimate_flag); + else + { + mexPrintf("Testing_instance_matrix must be sparse\n"); + fake_answer(plhs); + } + + // destroy model_ + destroy_model(model_); + } + else + { + mexPrintf("model file should be a struct array\n"); + fake_answer(plhs); + } + + return; +} diff --git a/matlab/run.m b/matlab/run.m new file mode 100644 index 0000000..8dc7d32 --- /dev/null +++ b/matlab/run.m @@ -0,0 +1,4 @@ +[y,xt] = libsvmread('../heart_scale'); +model=train(y, xt) +[l,a]=predict(y, xt, model); + diff --git a/matlab/train.c b/matlab/train.c new file mode 100644 index 0000000..58ac729 --- /dev/null +++ b/matlab/train.c @@ -0,0 +1,334 @@ +#include +#include +#include +#include +#include +#include "linear.h" + +#include "mex.h" +#include "linear_model_matlab.h" + +#if MX_API_VER < 0x07030000 +typedef int mwIndex; +#endif + +#define CMD_LEN 2048 +#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) +#define INF HUGE_VAL + +void exit_with_help() +{ + mexPrintf( + "Usage: model = train(training_label_vector, training_instance_matrix, 'liblinear_options', 'col');\n" + "liblinear_options:\n" + "-s type : set type of solver (default 1)\n" + " 0 -- L2 logistic regression\n" + " 1 -- L2-loss support vector machines (dual)\n" + " 2 -- L2-loss support vector machines (primal)\n" + " 3 -- L1-loss support vector machines (dual)\n" + " 4 -- multi-class support vector machines from Crammer and Singer\n" + "-c cost : set the parameter C (default 1)\n" + "-e epsilon : set tolerance of termination criterion\n" + " -s 0 and 2\n" + " |f'(w)|_2 <= eps*min(pos,neg)/l*|f'(w0)|_2,\n" + " where f is the primal function, (default 0.01)\n" + " -s 1, 3, and 4\n" + " Dual maximal violation <= eps; similar to libsvm (default 0.1)\n" + "-B bias : if bias >= 0, instance x becomes [x; bias]; if < 0, no bias term added (default 1)\n" + "-wi weight: weights adjust the parameter C of different classes (see README for details)\n" + "-v n: n-fold cross validation mode\n" + "col:\n" + " if 'col' is setted, training_instance_matrix is parsed in column format, otherwise is in row format\n" + ); +} + +// liblinear arguments +struct parameter param; // set by parse_command_line +struct problem prob; // set by read_problem +struct model *model_; +struct feature_node *x_space; +int cross_validation_flag; +int col_format_flag; +int nr_fold; +double bias; + +double do_cross_validation() +{ + int i; + int total_correct = 0; + int *target = Malloc(int,prob.l); + double retval = 0.0; + + cross_validation(&prob,¶m,nr_fold,target); + + for(i=0;i 2) + { + mxGetString(prhs[2], cmd, mxGetN(prhs[2]) + 1); + if((argv[argc] = strtok(cmd, " ")) != NULL) + while((argv[++argc] = strtok(NULL, " ")) != NULL) + ; + } + + // parse options + for(i=1;i=argc) + return 1; + switch(argv[i-1][1]) + { + case 's': + param.solver_type = atoi(argv[i]); + break; + case 'c': + param.C = atof(argv[i]); + break; + case 'e': + param.eps = atof(argv[i]); + break; + case 'B': + bias = atof(argv[i]); + break; + case 'v': + cross_validation_flag = 1; + nr_fold = atoi(argv[i]); + if(nr_fold < 2) + { + mexPrintf("n-fold cross validation: n must >= 2\n"); + return 1; + } + break; + case 'w': + ++param.nr_weight; + param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); + param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); + param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); + param.weight[param.nr_weight-1] = atof(argv[i]); + break; + default: + mexPrintf("unknown option\n"); + return 1; + } + } + + if(param.eps == INF) + { + if(param.solver_type == L2_LR || param.solver_type == L2LOSS_SVM) + param.eps = 0.01; + else if(param.solver_type == L2LOSS_SVM_DUAL || param.solver_type == L1LOSS_SVM_DUAL || param.solver_type == MCSVM_CS) + param.eps = 0.1; + } + return 0; +} + +static void fake_answer(mxArray *plhs[]) +{ + plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL); +} + +int read_problem_sparse(const mxArray *label_vec, const mxArray *instance_mat) +{ + int i, j, k, low, high; + mwIndex *ir, *jc; + int elements, max_index, num_samples, label_vector_row_num; + double *samples, *labels; + mxArray *instance_mat_col; // instance sparse matrix in column format + + prob.x = NULL; + prob.y = NULL; + x_space = NULL; + + if(col_format_flag) + instance_mat_col = (mxArray *)instance_mat; + else + { + // transpose instance matrix + mxArray *prhs[1], *plhs[1]; + prhs[0] = mxDuplicateArray(instance_mat); + if(mexCallMATLAB(1, plhs, 1, prhs, "transpose")) + { + mexPrintf("Error: cannot transpose training instance matrix\n"); + return -1; + } + instance_mat_col = plhs[0]; + mxDestroyArray(prhs[0]); + } + + // the number of instance + prob.l = (int) mxGetN(instance_mat_col); + label_vector_row_num = (int) mxGetM(label_vec); + + if(label_vector_row_num!=prob.l) + { + mexPrintf("Length of label vector does not match # of instances.\n"); + return -1; + } + + // each column is one instance + labels = mxGetPr(label_vec); + samples = mxGetPr(instance_mat_col); + ir = mxGetIr(instance_mat_col); + jc = mxGetJc(instance_mat_col); + + num_samples = (int) mxGetNzmax(instance_mat_col); + + elements = num_samples + prob.l*2; + max_index = (int) mxGetM(instance_mat_col); + + prob.y = Malloc(int, prob.l); + prob.x = Malloc(struct feature_node*, prob.l); + x_space = Malloc(struct feature_node, elements); + + prob.bias=bias; + + j = 0; + for(i=0;i=0) + { + x_space[j].index = max_index+1; + x_space[j].value = prob.bias; + j++; + } + x_space[j++].index = -1; + } + + if(prob.bias>=0) + prob.n = max_index+1; + else + prob.n = max_index; + + return 0; +} + +// Interface function of matlab +// now assume prhs[0]: label prhs[1]: features +void mexFunction( int nlhs, mxArray *plhs[], + int nrhs, const mxArray *prhs[] ) +{ + const char *error_msg; + // fix random seed to have same results for each run + // (for cross validation) + srand(1); + + // Transform the input Matrix to libsvm format + if(nrhs > 0 && nrhs < 5) + { + int err=0; + + if(!mxIsDouble(prhs[0]) || !mxIsDouble(prhs[1])) { + mexPrintf("Error: label vector and instance matrix must be double\n"); + fake_answer(plhs); + return; + } + + if(parse_command_line(nrhs, prhs, NULL)) + { + exit_with_help(); + destroy_param(¶m); + fake_answer(plhs); + return; + } + + if(mxIsSparse(prhs[1])) + err = read_problem_sparse(prhs[0], prhs[1]); + else + { + mexPrintf("Training_instance_matrix must be sparse\n"); + destroy_param(¶m); + fake_answer(plhs); + return; + } + + // train's original code + error_msg = check_parameter(&prob, ¶m); + + if(err || error_msg) + { + if (error_msg != NULL) + mexPrintf("Error: %s\n", error_msg); + destroy_param(¶m); + free(prob.y); + free(prob.x); + free(x_space); + fake_answer(plhs); + return; + } + + if(cross_validation_flag) + { + double *ptr; + plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); + ptr = mxGetPr(plhs[0]); + ptr[0] = do_cross_validation(); + } + else + { + const char *error_msg; + + model_ = train(&prob, ¶m); + error_msg = model_to_matlab_structure(plhs, model_); + if(error_msg) + mexPrintf("Error: can't convert libsvm model to matrix structure: %s\n", error_msg); + destroy_model(model_); + } + destroy_param(¶m); + free(prob.y); + free(prob.x); + free(x_space); + } + else + { + exit_with_help(); + fake_answer(plhs); + return; + } +} diff --git a/predict.c b/predict.c new file mode 100644 index 0000000..9772f72 --- /dev/null +++ b/predict.c @@ -0,0 +1,215 @@ +#include +#include +#include +#include +#include +#include "linear.h" + +struct feature_node *x; +int max_nr_attr = 64; + +struct model* model_; +int flag_predict_probability=0; + +void exit_input_error(int line_num) +{ + fprintf(stderr,"Wrong input format at line %d\n", line_num); + exit(1); +} + +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; +} + +void do_predict(FILE *input, FILE *output, struct model* model_) +{ + int correct = 0; + int total = 0; + + int nr_class=get_nr_class(model_); + double *prob_estimates=NULL; + int j, n; + int nr_feature=get_nr_feature(model_); + if(model_->bias>=0) + n=nr_feature+1; + else + n=nr_feature; + + if(flag_predict_probability) + { + int *labels; + + if(model_->param.solver_type!=L2_LR) + { + fprintf(stderr, "probability output is only supported for logistic regression\n"); + exit(1); + } + + labels=(int *) malloc(nr_class*sizeof(int)); + get_labels(model_,labels); + prob_estimates = (double *) malloc(nr_class*sizeof(double)); + fprintf(output,"labels"); + for(j=0;j=max_nr_attr-2) // need one more for index = -1 + { + max_nr_attr *= 2; + x = (struct feature_node *) realloc(x,max_nr_attr*sizeof(struct feature_node)); + } + + idx = strtok(NULL,":"); + val = strtok(NULL," \t"); + + if(val == NULL) + break; + errno = 0; + x[i].index = (int) strtol(idx,&endptr,10); + if(endptr == idx || errno != 0 || *endptr != '\0' || x[i].index <= inst_max_index) + exit_input_error(total+1); + else + inst_max_index = x[i].index; + + errno = 0; + x[i].value = strtod(val,&endptr); + if(endptr == val || errno != 0 || (*endptr != '\0' && !isspace(*endptr))) + exit_input_error(total+1); + + // feature indices larger than those in training are not used + if(x[i].index <= nr_feature) + ++i; + } + + if(model_->bias>=0) + { + x[i].index = n; + x[i].value = model_->bias; + i++; + } + x[i].index = -1; + + if(flag_predict_probability) + { + int j; + predict_label = predict_probability(model_,x,prob_estimates); + fprintf(output,"%d",predict_label); + for(j=0;jnr_class;j++) + fprintf(output," %g",prob_estimates[j]); + fprintf(output,"\n"); + } + else + { + predict_label = predict(model_,x); + fprintf(output,"%d\n",predict_label); + } + + if(predict_label == target_label) + ++correct; + ++total; + } + printf("Accuracy = %g%% (%d/%d)\n",(double) correct/total*100,correct,total); + if(flag_predict_probability) + free(prob_estimates); +} + +void exit_with_help() +{ + printf( + "Usage: predict [options] test_file model_file output_file\n" + "options:\n" + "-b probability_estimates: whether to output probability estimates, 0 or 1 (default 0)\n" + ); + exit(1); +} + +int main(int argc, char **argv) +{ + FILE *input, *output; + int i; + + // parse options + for(i=1;i=argc) + exit_with_help(); + + input = fopen(argv[i],"r"); + if(input == NULL) + { + fprintf(stderr,"can't open input file %s\n",argv[i]); + exit(1); + } + + output = fopen(argv[i+2],"w"); + if(output == NULL) + { + fprintf(stderr,"can't open output file %s\n",argv[i+2]); + exit(1); + } + + if((model_=load_model(argv[i+1]))==0) + { + fprintf(stderr,"can't open model file %s\n",argv[i+1]); + exit(1); + } + + x = (struct feature_node *) malloc(max_nr_attr*sizeof(struct feature_node)); + do_predict(input, output, model_); + destroy_model(model_); + free(line); + free(x); + fclose(input); + fclose(output); + return 0; +} + diff --git a/train.c b/train.c new file mode 100644 index 0000000..62a8578 --- /dev/null +++ b/train.c @@ -0,0 +1,313 @@ +#include +#include +#include +#include +#include +#include +#include "linear.h" +#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) +#define INF HUGE_VAL + +void exit_with_help() +{ + printf( + "Usage: train [options] training_set_file [model_file]\n" + "options:\n" + "-s type : set type of solver (default 1)\n" + " 0 -- L2-regularized logistic regression\n" + " 1 -- L2-loss support vector machines (dual)\n" + " 2 -- L2-loss support vector machines (primal)\n" + " 3 -- L1-loss support vector machines (dual)\n" + " 4 -- multi-class support vector machines by Crammer and Singer\n" + "-c cost : set the parameter C (default 1)\n" + "-e epsilon : set tolerance of termination criterion\n" + " -s 0 and 2\n" + " |f'(w)|_2 <= eps*min(pos,neg)/l*|f'(w0)|_2,\n" + " where f is the primal function, (default 0.01)\n" + " -s 1, 3, and 4\n" + " Dual maximal violation <= eps; similar to libsvm (default 0.1)\n" + "-B bias : if bias >= 0, instance x becomes [x; bias]; if < 0, no bias term added (default 1)\n" + "-wi weight: weights adjust the parameter C of different classes (see README for details)\n" + "-v n: n-fold cross validation mode\n" + ); + exit(1); +} + +void exit_input_error(int line_num) +{ + fprintf(stderr,"Wrong input format at line %d\n", line_num); + exit(1); +} + +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; +} + +void parse_command_line(int argc, char **argv, char *input_file_name, char *model_file_name); +void read_problem(const char *filename); +void do_cross_validation(); + +struct feature_node *x_space; +struct parameter param; +struct problem prob; +struct model* model_; +int flag_cross_validation; +int nr_fold; +double bias; + +int main(int argc, char **argv) +{ + char input_file_name[1024]; + char model_file_name[1024]; + const char *error_msg; + + parse_command_line(argc, argv, input_file_name, model_file_name); + read_problem(input_file_name); + error_msg = check_parameter(&prob,¶m); + + if(error_msg) + { + fprintf(stderr,"Error: %s\n",error_msg); + exit(1); + } + + if(flag_cross_validation) + { + do_cross_validation(); + } + else + { + model_=train(&prob, ¶m); + save_model(model_file_name, model_); + destroy_model(model_); + } + destroy_param(¶m); + free(prob.y); + free(prob.x); + free(x_space); + free(line); + + return 0; +} + +void do_cross_validation() +{ + int i; + int total_correct = 0; + int *target = Malloc(int, prob.l); + + cross_validation(&prob,¶m,nr_fold,target); + + for(i=0;i=argc) + exit_with_help(); + switch(argv[i-1][1]) + { + case 's': + param.solver_type = atoi(argv[i]); + break; + + case 'c': + param.C = atof(argv[i]); + break; + + case 'e': + param.eps = atof(argv[i]); + break; + + case 'B': + bias = atof(argv[i]); + break; + + case 'w': + ++param.nr_weight; + param.weight_label = (int *) realloc(param.weight_label,sizeof(int)*param.nr_weight); + param.weight = (double *) realloc(param.weight,sizeof(double)*param.nr_weight); + param.weight_label[param.nr_weight-1] = atoi(&argv[i-1][2]); + param.weight[param.nr_weight-1] = atof(argv[i]); + break; + + case 'v': + flag_cross_validation = 1; + nr_fold = atoi(argv[i]); + if(nr_fold < 2) + { + fprintf(stderr,"n-fold cross validation: n must >= 2\n"); + exit_with_help(); + } + break; + + default: + fprintf(stderr,"unknown option: -%c\n", argv[i-1][1]); + exit_with_help(); + break; + } + } + + // determine filenames + if(i>=argc) + exit_with_help(); + + strcpy(input_file_name, argv[i]); + + if(i max_index) + max_index = inst_max_index; + + if(prob.bias >= 0) + x_space[j++].value = prob.bias; + + x_space[j++].index = -1; + } + + if(prob.bias >= 0) + { + prob.n=max_index+1; + for(i=1;iindex = prob.n; + x_space[j-2].index = prob.n; + } + else + prob.n=max_index; + + fclose(fp); +} diff --git a/tron.cpp b/tron.cpp new file mode 100644 index 0000000..293370a --- /dev/null +++ b/tron.cpp @@ -0,0 +1,214 @@ +#include +#include +#include +#include +#include "tron.h" + +#ifndef min +template inline T min(T x,T y) { return (x inline T max(T x,T y) { return (x>y)?x:y; } +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern double dnrm2_(int *, double *, int *); +extern double ddot_(int *, double *, int *, double *, int *); +extern int daxpy_(int *, double *, double *, int *, double *, int *); +extern int dscal_(int *, double *, double *, int *); + +#ifdef __cplusplus +} +#endif + + +TRON::TRON(const function *fun_obj, double eps, int max_iter) +{ + this->fun_obj=const_cast(fun_obj); + this->eps=eps; + this->max_iter=max_iter; +} + +TRON::~TRON() +{ +} + +void TRON::tron(double *w) +{ + // Parameters for updating the iterates. + double eta0 = 1e-4, eta1 = 0.25, eta2 = 0.75; + + // Parameters for updating the trust region size delta. + double sigma1 = 0.25, sigma2 = 0.5, sigma3 = 4; + + int n = fun_obj->get_nr_variable(); + int i, cg_iter; + double delta, snorm, one=1.0; + double alpha, f, fnew, prered, actred, gs; + int search = 1, iter = 1, inc = 1; + double *s = new double[n]; + double *r = new double[n]; + double *w_new = new double[n]; + double *g = new double[n]; + + for (i=0; ifun(w); + fun_obj->grad(w, g); + delta = dnrm2_(&n, g, &inc); + double gnorm1 = delta; + double gnorm = gnorm1; + + if (gnorm <= eps*gnorm1) + search = 0; + + iter = 1; + + while (iter <= max_iter && search) + { + cg_iter = trcg(delta, g, s, r); + + memcpy(w_new, w, sizeof(double)*n); + daxpy_(&n, &one, s, &inc, w_new, &inc); + + gs = ddot_(&n, g, &inc, s, &inc); + prered = -0.5*(gs-ddot_(&n, s, &inc, r, &inc)); + fnew = fun_obj->fun(w_new); + + // Compute the actual reduction. + actred = f - fnew; + + // On the first iteration, adjust the initial step bound. + snorm = dnrm2_(&n, s, &inc); + if (iter == 1) + delta = min(delta, snorm); + + // Compute prediction alpha*snorm of the step. + if (fnew - f - gs <= 0) + alpha = sigma3; + else + alpha = max(sigma1, -0.5*(gs/(fnew - f - gs))); + + // Update the trust region bound according to the ratio of actual to predicted reduction. + if (actred < eta0*prered) + delta = min(max(alpha, sigma1)*snorm, sigma2*delta); + else if (actred < eta1*prered) + delta = max(sigma1*delta, min(alpha*snorm, sigma2*delta)); + else if (actred < eta2*prered) + delta = max(sigma1*delta, min(alpha*snorm, sigma3*delta)); + else + delta = max(delta, min(alpha*snorm, sigma3*delta)); + + printf("iter %2d act %5.3e pre %5.3e delta %5.3e f %5.3e |g| %5.3e CG %3d\n", iter, actred, prered, delta, f, gnorm, cg_iter); + + if (actred > eta0*prered) + { + iter++; + memcpy(w, w_new, sizeof(double)*n); + f = fnew; + fun_obj->grad(w, g); + + gnorm = dnrm2_(&n, g, &inc); + if (gnorm <= eps*gnorm1) + break; + } + if (f < -1.0e+32) + { + printf("warning: f < -1.0e+32\n"); + break; + } + if (fabs(actred) <= 0 && prered <= 0) + { + printf("warning: actred and prered <= 0\n"); + break; + } + if (fabs(actred) <= 1.0e-12*fabs(f) && + fabs(prered) <= 1.0e-12*fabs(f)) + { + printf("warning: actred and prered too small\n"); + break; + } + } + + delete[] g; + delete[] r; + delete[] w_new; + delete[] s; +} + +int TRON::trcg(double delta, double *g, double *s, double *r) +{ + int i, inc = 1; + int n = fun_obj->get_nr_variable(); + double one = 1; + double *d = new double[n]; + double *Hd = new double[n]; + double rTr, rnewTrnew, alpha, beta, cgtol; + + for (i=0; iHv(d, Hd); + + alpha = rTr/ddot_(&n, d, &inc, Hd, &inc); + daxpy_(&n, &alpha, d, &inc, s, &inc); + if (dnrm2_(&n, s, &inc) > delta) + { + printf("cg reaches trust region boundary\n"); + alpha = -alpha; + daxpy_(&n, &alpha, d, &inc, s, &inc); + + double std = ddot_(&n, s, &inc, d, &inc); + double sts = ddot_(&n, s, &inc, s, &inc); + double dtd = ddot_(&n, d, &inc, d, &inc); + double dsq = delta*delta; + double rad = sqrt(std*std + dtd*(dsq-sts)); + if (std >= 0) + alpha = (dsq - sts)/(std + rad); + else + alpha = (rad - std)/dtd; + daxpy_(&n, &alpha, d, &inc, s, &inc); + alpha = -alpha; + daxpy_(&n, &alpha, Hd, &inc, r, &inc); + break; + } + alpha = -alpha; + daxpy_(&n, &alpha, Hd, &inc, r, &inc); + rnewTrnew = ddot_(&n, r, &inc, r, &inc); + beta = rnewTrnew/rTr; + dscal_(&n, &beta, d, &inc); + daxpy_(&n, &one, r, &inc, d, &inc); + rTr = rnewTrnew; + } + + delete[] d; + delete[] Hd; + + return(cg_iter); +} + +double TRON::norm_inf(int n, double *x) +{ + double dmax = fabs(x[0]); + for (int i=1; i= dmax) + dmax = fabs(x[i]); + return(dmax); +} diff --git a/tron.h b/tron.h new file mode 100644 index 0000000..fe6a96b --- /dev/null +++ b/tron.h @@ -0,0 +1,32 @@ +#ifndef _TRON_H +#define _TRON_H + +class function +{ +public: + virtual double fun(double *w) = 0 ; + virtual void grad(double *w, double *g) = 0 ; + virtual void Hv(double *s, double *Hs) = 0 ; + + virtual int get_nr_variable(void) = 0 ; + virtual ~function(void){} +}; + +class TRON +{ +public: + TRON(const function *fun_obj, double eps = 0.1, int max_iter = 1000); + ~TRON(); + + void tron(double *w); + +private: + int trcg(double delta, double *g, double *s, double *r); + double norm_inf(int n, double *x); + + double eps; + int max_iter; + function *fun_obj; +}; + +#endif diff --git a/windows/predict.exe b/windows/predict.exe new file mode 100755 index 0000000000000000000000000000000000000000..3e066211cc1a514d130f0d3660e6266964c4640e GIT binary patch literal 106496 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

=QPL2ul3{{GxksXaPHy1w4Am#FPPrd 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

M8=nqz2RB_) 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 literal 0 HcmV?d00001 diff --git a/windows/predict.mexw32 b/windows/predict.mexw32 new file mode 100755 index 0000000000000000000000000000000000000000..3980d2785b4b4f3ad7f2ddd49868d8f921800231 GIT binary patch literal 13824 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 literal 0 HcmV?d00001 diff --git a/windows/read_sparse.mexw32 b/windows/read_sparse.mexw32 new file mode 100755 index 0000000000000000000000000000000000000000..0fa2646ff88e13c922aff53c7dd6356b6d132c8e GIT binary patch literal 8192 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 p`H7rcJcb#F{wRP9PJa1UpG!LgdvJX_``tFb5GQ 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 USw^)X! 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 literal 0 HcmV?d00001 diff --git a/windows/train.mexw32 b/windows/train.mexw32 new file mode 100755 index 0000000000000000000000000000000000000000..c1a266ac9e6b50942500f1707982bdc2adb4000b GIT binary patch literal 32256 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 XHW;@UZIB;r#=YR>fByZyO@aRfW!aVl literal 0 HcmV?d00001 -- 2.40.0