#!/usr/bin/perl

use strict;
use warnings;
use File::Copy;
use Statistics::R;

my $inputData = "E:\\NUS\\Project\\SVM\\Data\\data.txt";
my $path = "E:\\NUS\\Project\\SVM\\Results\\";

open DATA,"<","$inputData" or die "$!";
chomp(my $data = <DATA>);
close DATA;
my @data = split /\t/,$data;
my $total = scalar(@data);
copy("$inputData","$path"."data_$total.txt") or die "$!";

open LOG,">","$path"."log.txt" or die "$!";
my $outputData = "";
while($total > 2){
   my $inputData = "data_"."$total.txt";
#   print LOG "$input:\n";
   open IN,"<","$path"."$inputData" or die "$!";
   my $drop = $total - 1;
   $outputData = "data_"."$drop.txt";
   my %drop_acc = ();
   for my $count (2..$total){
   &drop($count);
   my $R = Statistics::R -> new();
   $R -> startR;
   $R -> send(qq'library(class)');
   $R -> send(qq'library(e1071)');
   $R -> send(qq'svmdata <- read.table(past($path,"$outputData",sep = ""),sep = "\t")');
   $R -> send(qq'n <- length(svmdata)');
   $R -> send(qq'trainset <- svmdata[1:20,2:n]');
   $R -> send(qq'trainlabel <- svmdata[1:20,1]');
   $R -> send(qq'testset <- svmdata[21:30,2:n]');
   $R -> send(qq'testlabel <- svmdata[21:30,1]');
   $R -> send(qq'model <- svm(trainset,trainlabel,type="C-classification")');
   $R -> send(qq'predlabel <- predict(model,testset)');
   $R -> send(qq'result <- table(predlabel,testlabel)');
   $R -> send(qq'acc <- (result[1,1]+result[2,2])/(result[1,1]+result[1,2]+result[2,1]+result[2,2])');
   $R -> send(qq'print(acc)');
   my $read = $R -> read;
   $read =~ s/\[\d\]\s+(\d+)/$1/g;
   $drop_acc{$count} = $read;
   #$R -> send(qq'write.table(acc,"D:/personalfolders/liuyifang/SVM/Results/$read.txt",sep="\t",row.names=F,col.names=F)');
   $R -> stopR();
   }
   #print "$read\n";
   my @keys = sort{$drop_acc{$a} <=> $drop_acc{$b}} keys %drop_acc;
   for(@keys){print LOG "$_ -> $drop_acc{$_}\n";}
   print LOG "drop: $keys[0]\n";
   &drop($keys[0]);
   $total--;
}

sub drop {
    my $drop = shift;
    open OUT,">","$path"."$outputData" or die "$!";
    seek IN,0,0;
    while(<IN>){
           chomp;
           my @data = split /\t/;
           for my $index (0..$total-1){
               print OUT $data[$index],"\t" if $index+1 != $drop;
           }
           print OUT "\n";
    }
    close OUT;
#    system(qq(perl -i".bak" -p -e "~s/\t\n/\n/g" D:\\personalfolders\\liuyifang\\SVM\\Data\\$outputData));
}