B
    VNbm*                 @   s   d dl Z d dlZe je jegej e_ddlT ddlmZ ddlm	Z	m
Z
 ddlT ddlmZ ejd  dk reZd dlmZ dd	 Znd
d	 Zddddge e Zdd Zdd ZdddZdddZdS )    N   )*)__all__)scipysparse   )izipc             C   s   t | tr| dS t| S )Nzutf-8)
isinstanceZunicodeencodestr)s r   -lib/python3.7/site-packages/libsvm/svmutil.py<lambda>       r   c             C   s
   t | dS )Nzutf-8)bytes)r   r   r   r   r      r   svm_load_modelsvm_predictsvm_save_model	svm_trainc             C   s.   t t| }|s"td|   dS t|}|S )zl
    svm_load_model(model_file_name) -> model

    Load a LIBSVM model from model_file_name and return.
    zcan't open model file %sN)libsvmr   _cstrprint	toPyModel)model_file_namemodelr   r   r   r      s    c             C   s   t t| | dS )zn
    svm_save_model(model_file_name, model) -> None

    Save a LIBSVM model to the file model_file_name.
    N)r   r   r   )r   r   r   r   r   r   "   s    c             C   s*  d\}}t | ttfs&tr|t | tjr|t |ttfsNtrJt |tjtjfsNt| ||  }}}t|}t	|||j
tkd}n&t | t	r| }t |tr|}nt|}|dks|dkrtd|j
tkr(x`t|jD ]R}|j| }	|	d j|	d j }
}|
dkrtd|dks||jkrtdqW |jdkrL|jdkrLd|j |_t|j t||}|rvtd	| |jr|j|j }}t|  }t|||| t|jd| |d| \}}}|jt t!gkrt"d
|  t"d|  |S t"d|  |S n t#||}t$|}|j%|_%|S dS )a  
    svm_train(y, x [, options]) -> model | ACC | MSE

    y: a list/tuple/ndarray of l true labels (type must be int/double).

    x: 1. a list/tuple of l training instances. Feature vector of
          each training instance is a list/tuple or dictionary.

       2. an l * n numpy ndarray or scipy spmatrix (n: number of features).

    svm_train(prob [, options]) -> model | ACC | MSE
    svm_train(prob, param) -> model | ACC| MSE

    Train an SVM model from data (y, x) or an svm_problem prob using
    'options' or an svm_parameter param.
    If '-v' is specified in 'options' (i.e., cross validation)
    either accuracy (ACC) or mean-squared error (MSE) is returned.
    options:
        -s svm_type : set type of SVM (default 0)
            0 -- C-SVC        (multi-class classification)
            1 -- nu-SVC        (multi-class classification)
            2 -- one-class SVM
            3 -- epsilon-SVR    (regression)
            4 -- nu-SVR        (regression)
        -t kernel_type : set type of kernel function (default 2)
            0 -- linear: u'*v
            1 -- polynomial: (gamma*u'*v + coef0)^degree
            2 -- radial basis function: exp(-gamma*|u-v|^2)
            3 -- sigmoid: tanh(gamma*u'*v + coef0)
            4 -- precomputed kernel (kernel values in training_set_file)
        -d degree : set degree in kernel function (default 3)
        -g gamma : set gamma in kernel function (default 1/num_features)
        -r coef0 : set coef0 in kernel function (default 0)
        -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
        -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
        -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
        -m cachesize : set cache memory size in MB (default 100)
        -e epsilon : set tolerance of termination criterion (default 0.001)
        -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
        -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
        -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)
        -v n: n-fold cross validation mode
        -q : quiet mode (no outputs)
    )NN)isKernelNzWrong types for the argumentsr   z?Wrong input format: first column must be 0:sample_serial_numberz5Wrong input format: sample_serial_number out of rangeg      ?z	Error: %sz(Cross Validation Mean squared error = %gz5Cross Validation Squared correlation coefficient = %gz Cross Validation Accuracy = %g%%)&r	   listtupler   ndarrayr   spmatrixAssertionErrorZsvm_parameterZsvm_problemkernel_typePRECOMPUTED	TypeErrorrangelxindexvalue
ValueErrornZgammar   Zsvm_set_print_string_functionZ
print_funcZsvm_check_parameterZcross_validationnr_foldc_doubleZsvm_cross_validationevaluationsysvm_typeEPSILON_SVRNU_SVRr   r   r   Zx_space)Zarg1Zarg2Zarg3Zprobparamr/   r'   optionsixiidxvalZerr_msgr&   r,   targetACCMSESCCmr   r   r   r   *   sT    -(




" c             C   s  dd }t r$t|t jr$t |}n:tr>t|tjr>| }n t|ttfs^t	d
t|t| ttfst r|t| t jst	d
t| d}| }d}xT|t|k r|| dkr|d7 }t|| }n|| dkrt}ntd	|d7 }qW | }| }	| }
g }g }t r4t|tjr4|jd }nt|}|r6|	sPtd
|ttgkrr|d|   d}
t|
  }xt|D ]}t rt|tjrt|j| |j|d  }t|j| |j| f|jj t!kd\}}nt|| |jj t!kd\}}t"#|||}|d|
 }||g7 }||g7 }qW n|	rD|d |t$tt%fkrZd}n|
|
d  d }t|  }xt|D ]}t rt|tjrt|j| |j|d  }t|j| |j| f|jj t!kd\}}nt|| |jj t!kd\}}t"&|||}|
dkrdg}n|d| }||g7 }||g7 }q~W t| dkrTdg| } t'| |\}}}|ttgkr|d|  |d|  n"|d|tt(|| d |f  ||||f|fS )a  
    svm_predict(y, x, m [, options]) -> (p_labels, p_acc, p_vals)

    y: a list/tuple/ndarray of l true labels (type must be int/double).
       It is used for calculating the accuracy. Use [] if true labels are
       unavailable.

    x: 1. a list/tuple of l training instances. Feature vector of
          each training instance is a list/tuple or dictionary.

       2. an l * n numpy ndarray or scipy spmatrix (n: number of features).

    Predict data (y, x) with the SVM model m.
    options:
        -b probability_estimates: whether to predict probability estimates,
            0 or 1 (default 0); for one-class SVM only 0 is supported.
        -q : quiet mode (no outputs).

    The return tuple contains
    p_labels: a list of predicted labels
    p_acc: a tuple including  accuracy (for classification), mean-squared
           error, and squared correlation coefficient (for regression).
    p_vals: a list of decision values or probability estimates (if '-b 1'
            is specified). If k is the number of classes, for decision values,
            each element includes results of predicting k(k-1)/2 binary-class
            SVMs. For probabilities, each element 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 'model.label'
            field in the model structure.
    c             S   s   t |  d S )N)r   )r   r   r   r   info   s    zsvm_predict.<locals>.infoz type of x: {0} is not supported!z type of y: {0} is not supported!r   z-br   z-qzWrong optionsz+Model does not support probabiliy estimateszwProb. model for test data: target value = predicted value + z,
z: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma=%g)r   Nz@Model supports probability estimates, but disabled in predicton.   z$Mean squared error = %g (regression)z1Squared correlation coefficient = %g (regression)z(Accuracy = %g%% (%d/%d) (classification)d   ))r   r	   r   Zascontiguousarrayr   r    Ztocsrr   r   r$   formattypesplitlenintZ
print_nullr*   Zget_svm_typeZis_probability_modelZget_nr_classshaper2   r1   Zget_svr_probabilityr-   r%   sliceZindptrZgen_svm_nodearrayindicesdatar3   r"   r#   r   Zsvm_predict_probabilityZ	ONE_CLASSZNU_SVCZsvm_predict_valuesr.   round)r/   r'   r=   r4   r?   Zpredict_probabilityargvr5   r0   Zis_prob_modelZnr_classZpred_labelsZpred_valuesZnr_instanceZprob_estimatesZindslicer6   r7   ZlabelvaluesZnr_classifierZ
dec_valuesr:   r;   r<   r   r   r   r      s     

*

*


")NN)r>   )ossyspathdirnameabspath__file__Zsvmr   Zsvm_allr   r   Z
commonutilZ
common_allversion_infoZxranger%   	itertoolsr   zipr   r   r   r   r   r   r   r   r   <module>   s    

`