亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? psmo_solver.cpp

?? 支持向量分類算法在linux操作系統(tǒng)下的是實(shí)現(xiàn)
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// D. Brugger, december 2006// $Id: psmo_solver.cpp 7 2006-12-16 16:45:32Z beeblbrox $//// Copyright (C) 2006 Dominik Brugger//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.// // This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License along// with this program; if not, write to the Free Software Foundation, Inc.,// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.#include "psmo_solver.h"#define CheckError(n) if(n){printf("line %d, file %s\n",__LINE__,__FILE__);}#define MPIfloat MPI_DOUBLESolver_Parallel_SMO::Solver_Parallel_SMO(int n, int q, MPI_Comm comm){  // Ensure that n,q are even numbers.  this->n = n % 2 == 0 ? n : n-1;   this->n_old = this->n;   this->q = q % 2 == 0 ? q : q-1;   // Ensure sane q  this->q = this->q > this->n ? this->n : this->q;  this->comm = comm;  ierr = MPI_Comm_rank(comm, &this->rank); CheckError(ierr);  ierr = MPI_Comm_size(comm, &this->size); CheckError(ierr);  NEXT_RAND = 1;}unsigned int Solver_Parallel_SMO::next_rand_pos(){  NEXT_RAND = NEXT_RAND*1103515245L + 12345L;  return NEXT_RAND & 0x7fffffff;}Solver_Parallel_SMO_NU::Solver_Parallel_SMO_NU(int n, int q, MPI_Comm comm)  : Solver_Parallel_SMO(n,q,comm){}double Solver_Parallel_SMO_NU::calculate_rho(){  int nr_free1 = 0,nr_free2 = 0;  double ub1 = INF, ub2 = INF;  double lb1 = -INF, lb2 = -INF;  double sum_free1 = 0, sum_free2 = 0;//   printf("alpha = ");//   for(int i=0; i<l; ++i)//     printf(" %g",alpha[i]);//   printf("\n");  for(int i=0;i<active_size;i++)    {      if(y[i]==+1)	{	  if(is_lower_bound(i))	    ub1 = min(ub1,G[i]);	  else if(is_upper_bound(i))	    lb1 = max(lb1,G[i]);	  else	    {	      ++nr_free1;	      sum_free1 += G[i];	    }	}      else	{	  if(is_lower_bound(i))	    ub2 = min(ub2,G[i]);	  else if(is_upper_bound(i))	    lb2 = max(lb2,G[i]);	  else	    {	      ++nr_free2;	      sum_free2 += G[i];	    }	}    }  printf("nr_free1 = %d\n", nr_free1);  printf("sum_free1 = %g\n",sum_free1);  printf("nr_free2 = %d\n", nr_free2);  printf("sum_freee = %g\n",sum_free2);  double r1,r2;  if(nr_free1 > 0)    r1 = sum_free1/nr_free1;  else    r1 = (ub1+lb1)/2;	  if(nr_free2 > 0)    r2 = sum_free2/nr_free2;  else    r2 = (ub2+lb2)/2;	  si->r = (r1+r2)/2;  printf("(r1+r2)/2 = %g\n", (r1+r2)/2);  printf("(r1+r2)/2 = %g\n", (r1-r2)/2);  return (r1-r2)/2;}void Solver_Parallel_SMO_NU::solve_inner(){  Solver_NU sl;  sl.Solve(n, SVQ_No_Cache(Q_bb, QD_b, n), c, a, alpha_b, Cp, Cn, eps,	   si, /* shrinking */ 0);}int Solver_Parallel_SMO_NU::select_working_set(int *work_set, 					       int *not_work_set){  printf("selecting working set...");  // reset work status  n = n_old;  for(int i=0; i<l; ++i)    {      work_status[i] = WORK_N;    }  double Gmin1 = INF; double Gmin2 = INF;  double Gmax1 = -INF; double Gmax2 = -INF;  int min1 = -1; int min2 = -1;  int max1 = -1; int max2 = -1;  for(int t=0; t<l; ++t)    {      if(y[t] == +1)	{	  if(!is_upper_bound(t))	    {	      if(G[t] < Gmin1)		{		  Gmin1 = G[t];		  min1 = t;		}	    }	  if(!is_lower_bound(t))	    {	      if(G[t] > Gmax1)		{		  Gmax1 = G[t];		  max1 = t;		}	    }	}      else	{	  if(!is_upper_bound(t))	    {	      if(G[t] < Gmin2)		{		  Gmin2 = G[t];		  min2 = t;		}	    }	  if(!is_lower_bound(t))	    {	      if(G[t] > Gmax2)		{		  Gmax2 = G[t];		  max2 = t;		}	    }	}    }  // check for optimality, max. violating pair.  printf("max(Gmax1-Gmin1,Gmax2-Gmin2) = %g < %g\n", 	 max(Gmax1-Gmin1,Gmax2-Gmin2),eps);  if(max(Gmax1-Gmin1,Gmax2-Gmin2) < eps)    return 1;  // Sort gradient  double *Gtmp = new double[l];  int *pidx = new int[l];  for(int i=0; i<l; ++i)    {      Gtmp[i] = G[i];      pidx[i] = i;    }  quick_sort(Gtmp, pidx, 0, l-1);//   printf("pidx = ");//   for(int i=0; i<l; ++i)//     printf(" %d", pidx[i]);//   printf("\n");  int top1=l-1; int top2=l-1;  int bot1=0; int bot2=0;  int count=0;  // Select a full set initially  int nselect = iter == 0 ? n : q;  while(count < nselect)    {      if(top1 > bot1)	{ 	  while(!( (is_free(pidx[top1]) || is_upper_bound(pidx[top1])) 		   && y[pidx[top1]] == +1))	    {	      if(top1 <= bot1) break;	      --top1;	    } 	  while(!( (is_free(pidx[bot1]) || is_lower_bound(pidx[bot1])) 		   && y[pidx[bot1]] == +1))	    {	      if(bot1 >= top1) break;	      ++bot1;	    }	}      if(top2 > bot2)	{	  while(!( (is_free(pidx[top2]) || is_upper_bound(pidx[top2]))		   && y[pidx[top2]] == -1))	    {	      if(top2 <= bot2) break;	      --top2;	    }	  while(!( (is_free(pidx[bot2]) || is_lower_bound(pidx[bot2]))		   && y[pidx[bot2]] == -1))	    {	      if(bot2 >= top2) break;	      ++bot2;	    }	}      if(top1 > bot1 && top2 > bot2)	{	  if(G[pidx[top1]]-G[pidx[bot1]] > G[pidx[top2]]-G[pidx[bot2]])	    {	      work_status[pidx[top1]] = WORK_B;	      work_status[pidx[bot1]] = WORK_B;	      --top1;	      ++bot1;	    }	  else	    {	      work_status[pidx[top2]] = WORK_B;	      work_status[pidx[bot2]] = WORK_B;	      --top2;	      ++bot2;	    }	  count += 2;	}      else if(top1 > bot1)	{	  work_status[pidx[top1]] = WORK_B;	  work_status[pidx[bot1]] = WORK_B;	  --top1;	  ++bot1;	  count += 2;	}      else if(top2 > bot2)	{	  work_status[pidx[top2]] = WORK_B;	  work_status[pidx[bot2]] = WORK_B;	  --top2;	  ++bot2;	  count += 2;	}      else	break;    } // while(count < nselect)  if(count < n)    {      // Compute subset of indices in previous working set       // which were not yet selected      int j=0;      int *work_count_subset = new int[l-count];      int *subset = new int[l-count];      int *psubset = new int[l-count];      for(int i=0; i<l; ++i)	{	  if(work_status[i] == WORK_N && work_count[i] > -1)	    {	      work_count_subset[j] = work_count[i];	      subset[j] = i;	      psubset[j] = j;	      ++j;	    }	}      quick_sort(work_count_subset, psubset, 0, j-1);      // Fill up with j \in B, 0 < alpha[j] < C      for(int i=0; i<j; ++i)	{	  if(count == n) break;	  if(is_free(subset[psubset[i]])) 	    {	      work_status[subset[psubset[i]]] = WORK_B;	      ++count;	    }	}      // Fill up with j \in B, alpha[j] = 0      for(int i=0; i<j; ++i)	{	  if(count == n) break;	  if(is_lower_bound(subset[psubset[i]]))	    {	      work_status[subset[psubset[i]]] = WORK_B;	      ++count;	    }	}      // Fill up with j \in B, alpha[j] = C      for(int i=0; i<j; ++i)	{	  if(count == n) break;	  if(is_upper_bound(subset[psubset[i]]))	    {	      work_status[subset[psubset[i]]] = WORK_B;	      ++count;	    }	}      // clean up      delete[] work_count_subset;      delete[] subset;      delete[] psubset;    } // if(count < n)  // Setup work_set and not_work_set  // update work_count  int nnew=0; int i=0; int j=0; n=0;  for(int t=0; t<l; ++t)    {      if(work_status[t] == WORK_B)	{	  if(work_count[t] == -1)	    ++nnew;	  work_set[i] = t; ++i; ++n;	  ++work_count[t];	}      else	{	  not_work_set[j] = t; ++j;	  work_count[t] = -1;	}    }  // Update q  printf("nnew = %d\n", nnew);  int kin = nnew;  nnew = nnew % 2 == 0 ? nnew : nnew-1;  int L = n/10 % 2 == 0 ? n/10 : (n/10)-1;  q = min(q, max( max( 10, L ), nnew ) );  printf("q = %d\n", q);  printf("n = %d\n",n);  if(kin == 0)    {      // 1st: Increase precision of solver.      if(eps > 1e-10)	eps /= 100;      else	{	  info("Error: Unable to select a suitable working set!!!\n");	  return 1;	}    }  // clean up  delete[] Gtmp;  delete[] pidx;  printf("done.\n");  return 0;  }void Solver_Parallel_SMO::solve_inner(){  Solver s;  s.Solve(n, SVQ_No_Cache(Q_bb, QD_b, n), c, a, alpha_b, Cp, Cn, eps,	  si, /* shrinking */ 0);}int Solver_Parallel_SMO::select_working_set(int *work_set, int *not_work_set){  // printf("selecting working set...");  // reset work status  n = n_old;  int *old_work_set = new int[n];  for(int i=0; i<n; ++i)    old_work_set[i] = work_set[i];  for(int i=0; i<l; ++i)      work_status[i] = WORK_N;  double Gmax1 = -INF;		// max { -y_i * grad(f)_i | i in I_up(\alpha) }  double Gmax2 = -INF;		// max { y_i * grad(f)_i | i in I_low(\alpha) }  for(int i=0; i<l; ++i)    {      if(!is_upper_bound(i))	{	  if(y[i] == +1)	    {	      if(-G[i] > Gmax1)		Gmax1 = -G[i];	    }	  else	    {	      if(-G[i] > Gmax2)		Gmax2 = -G[i];	    }	}      if(!is_lower_bound(i))	{	  if(y[i] == +1)	    {	      if(G[i] > Gmax2)		Gmax2 = G[i];	    }	  else	    {	      if(G[i] > Gmax1)		Gmax1 = G[i];	    }	}    }  // check for optimality  //  printf("Gmax1 + Gmax2 = %g < %g\n", Gmax1+Gmax2,eps);  info(" %g\n", Gmax1+Gmax2);  if(Gmax1 + Gmax2 < eps)      return 1;  // Compute yG  double *yG = new double[l];  int *pidx = new int[l];  for(int i=0; i<l; ++i)    {      if(y[i] == +1)	yG[i] = G[i];      else	yG[i] = -G[i];      pidx[i] = i;    }  //  double sort_time = MPI_Wtime();  quick_sort(yG, pidx, 0, l-1);  // printf("sort_time = %g\n", MPI_Wtime() - sort_time);//   printf("yG = ");//   for(int i=0; i<l; ++i)//     printf(" %g",yG[i]);//   printf("\n");//   printf("pidx = ");//   for(int i=0; i<l; ++i)//     printf(" %d",pidx[i]);//   printf("\n");  int top=l-1; int bot=0; int count=0;  // Select a full set initially  int nselect = iter == 0 ? n : q;  while(top > bot && count < nselect)    {      while(!(is_free(pidx[top]) 	      || (is_upper_bound(pidx[top]) && y[pidx[top]] == +1)	      || (is_lower_bound(pidx[top]) && y[pidx[top]] == -1)	      ))	--top;      while(!(is_free(pidx[bot])	      || (is_upper_bound(pidx[bot]) && y[pidx[bot]] == -1)	      || (is_lower_bound(pidx[bot]) && y[pidx[bot]] == +1)	      ))	++bot;      if(top > bot)	{	  count += 2;	  work_status[pidx[top]] = WORK_B;	  work_status[pidx[bot]] = WORK_B;	  --top;	  ++bot;	}    }  if(count < n)    {      // Compute subset of indices in previous working set       // which were not yet selected      int j=0;      int *work_count_subset = new int[l-count];      int *subset = new int[l-count];      int *psubset = new int[l-count];      for(int i=0; i<l; ++i)	{	  if(work_status[i] == WORK_N && work_count[i] > -1)	    {	      work_count_subset[j] = work_count[i];	      subset[j] = i;	      psubset[j] = j;	      ++j;	    }	}      quick_sort(work_count_subset, psubset, 0, j-1);      // Fill up with j \in B, 0 < alpha[j] < C      for(int i=0; i<j; ++i)	{	  if(count == n) break;	  if(is_free(subset[psubset[i]])) 	    {	      work_status[subset[psubset[i]]] = WORK_B;	      ++count;	    }	}      // Fill up with j \in B, alpha[j] = 0      for(int i=0; i<j; ++i)	{	  if(count == n) break;	  if(is_lower_bound(subset[psubset[i]]))	    {	      work_status[subset[psubset[i]]] = WORK_B;	      ++count;	    }	}      // Fill up with j \in B, alpha[j] = C      for(int i=0; i<j; ++i)	{	  if(count == n) break;	  if(is_upper_bound(subset[psubset[i]]))	    {	      work_status[subset[psubset[i]]] = WORK_B;	      ++count;	    }	}      // clean up      delete[] work_count_subset;      delete[] subset;      delete[] psubset;    } // if(count < n)  // Setup work_set and not_work_set  // update work_count  int nnew=0; int i=0; int j=0; n=0;  for(int t=0; t<l; ++t)    {      if(work_status[t] == WORK_B)	{	  if(work_count[t] == -1)	    {	      old_idx[i] = -1;	      ++nnew;	    }	  else	    {	      for(int tt=0; tt<n_old; ++tt)		{		  if(old_work_set[tt] == t)		    {		      old_idx[i] = tt;		      break;		    }		}	    }	  work_set[i] = t; ++i; ++n;	  ++work_count[t];	}      else	{	  not_work_set[j] = t; ++j;	  work_count[t] = -1;	}    }  // Update q  //  printf("nnew = %d\n", nnew);  int kin = nnew;  nnew = nnew % 2 == 0 ? nnew : nnew-1;  int L = n/10 % 2 == 0 ? n/10 : (n/10)-1;  q = min(q, max( max( 10, L ), nnew ) );  //  printf("q = %d\n", q);  //  printf("n = %d\n",n);  if(kin == 0)    {      // 1st: Increase precision of solver.      if(eps > 1e-10)	eps /= 100;      else	{	  info("Error: Unable to select a suitable working set!!!\n");	  return 1;	}    }  // Clean up  delete[] yG;  delete[] pidx;  delete[] old_work_set;  //  printf("done.\n");  return 0;}void Solver_Parallel_SMO::init_working_set(int *work_set, int *not_work_set)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品一区二区| 久久久青草青青国产亚洲免观| 国产精品一区二区不卡| 美女脱光内衣内裤视频久久网站| 亚洲超碰精品一区二区| 亚洲一卡二卡三卡四卡五卡| 亚洲v日本v欧美v久久精品| 亚洲电影视频在线| 日韩精品乱码免费| 精品一区二区日韩| 高清av一区二区| 99精品欧美一区二区三区综合在线| 成人国产精品免费观看动漫 | 亚洲精品免费在线观看| 亚洲欧美中日韩| 亚洲一区二区偷拍精品| 天天综合日日夜夜精品| 麻豆中文一区二区| 国产一区二区三区日韩| 成人短视频下载| 欧美在线观看禁18| 欧美成人乱码一区二区三区| 久久精品人人做人人爽97| 中文字幕一区av| 亚洲成av人在线观看| 成人天堂资源www在线| jvid福利写真一区二区三区| 色婷婷国产精品综合在线观看| 欧美日韩精品福利| 国产日韩亚洲欧美综合| 亚洲最大成人网4388xx| 美女免费视频一区二区| 国产精品一区二区三区乱码| 91黄视频在线| 精品国产一区久久| 亚洲男人都懂的| 久热成人在线视频| 99re66热这里只有精品3直播| 欧美日韩国产另类不卡| 国产免费观看久久| 亚洲国产欧美在线| 99久久精品免费精品国产| 欧美一级理论片| 亚洲免费看黄网站| 国产另类ts人妖一区二区| 欧美日韩国产精选| ...中文天堂在线一区| 麻豆免费看一区二区三区| av中文字幕亚洲| 欧美精品一区二区三区在线 | 欧美日韩不卡视频| 国产精品毛片高清在线完整版| 午夜视频一区在线观看| 91小视频免费看| 久久精品一区二区| 美女精品自拍一二三四| 欧美在线观看18| 国产网站一区二区三区| 蜜臀av一区二区| 欧美日韩一二三| 一区二区三区在线视频观看58| 国产精品影音先锋| 精品国产乱码久久久久久1区2区 | 欧美挠脚心视频网站| 亚洲精品少妇30p| www.爱久久.com| 国产精品福利一区| 高清不卡在线观看| 欧美高清一级片在线观看| 国产在线不卡一区| 精品美女在线播放| 精品午夜久久福利影院| 精品国产凹凸成av人导航| 美国av一区二区| 欧美不卡一区二区三区| 韩国女主播成人在线| 欧美成人精品1314www| 久久成人av少妇免费| 日韩精品在线网站| 精品伊人久久久久7777人| 久久综合网色—综合色88| 国产一区二区三区免费播放| 久久精品在线免费观看| 成人午夜av电影| 精品一二线国产| 久久久久久久精| 成人黄页毛片网站| 亚洲一区二区三区中文字幕在线 | 日韩欧美国产系列| 九色综合狠狠综合久久| 国产日韩在线不卡| 色综合天天综合给合国产| 一区二区免费在线| 日韩一区二区在线看| 国产麻豆视频一区| 国产精品第五页| 欧美日韩在线播放三区四区| 日本少妇一区二区| 国产欧美日韩不卡| 色欧美88888久久久久久影院| 亚洲国产色一区| 久久先锋资源网| 91原创在线视频| 人妖欧美一区二区| 中文av一区特黄| 欧美欧美午夜aⅴ在线观看| 国产一区二区电影| 一区二区三区精品| 2023国产精品自拍| 日本电影亚洲天堂一区| 毛片不卡一区二区| 亚洲伦理在线精品| 精品免费日韩av| 在线观看91精品国产入口| 经典三级在线一区| 亚洲精品成人悠悠色影视| 日韩女优毛片在线| 色偷偷久久人人79超碰人人澡| 蜜桃精品视频在线观看| 亚洲精品精品亚洲| 久久天堂av综合合色蜜桃网| 在线观看视频一区| 成人性视频免费网站| 欧美aⅴ一区二区三区视频| 亚洲精品免费一二三区| 久久精品夜色噜噜亚洲a∨| 欧美日韩在线播放| av男人天堂一区| 国产麻豆一精品一av一免费| 午夜精品久久久久久久| 亚洲精品免费在线观看| 国产精品日韩精品欧美在线| 精品国产一区二区三区忘忧草| 欧美专区亚洲专区| 色哦色哦哦色天天综合| 成人app下载| 成人午夜短视频| 国产精品乡下勾搭老头1| 毛片av中文字幕一区二区| 亚洲成人福利片| 亚洲综合视频在线| 亚洲精品ww久久久久久p站| 国产精品美女视频| 日韩av中文字幕一区二区三区| 亚洲综合在线视频| 亚洲欧美成aⅴ人在线观看 | 欧美中文字幕一区二区三区亚洲| 粉嫩13p一区二区三区| 国产精品18久久久久久vr| 久久精品72免费观看| 久久99久久久久| 麻豆精品视频在线观看免费 | 久久亚洲一级片| 久久综合久久综合久久综合| 欧美成人精品1314www| 精品99999| 国产精品免费视频网站| 国产精品久久久久四虎| 亚洲欧美一区二区在线观看| 亚洲欧洲美洲综合色网| 亚洲色图第一区| 亚洲图片一区二区| 日本欧美肥老太交大片| 国产在线不卡一区| 成人黄色在线网站| 91视频xxxx| 欧美人牲a欧美精品| 欧美一三区三区四区免费在线看 | 青娱乐精品视频在线| 美日韩黄色大片| 国产高清视频一区| 91免费在线播放| 欧美精品久久一区| 久久午夜羞羞影院免费观看| 国产精品免费免费| 亚洲午夜成aⅴ人片| 久久99精品久久久久久国产越南| 激情文学综合丁香| 色94色欧美sute亚洲线路一久| 欧美日韩国产经典色站一区二区三区| 欧美久久久久久久久| 久久丝袜美腿综合| 一区二区三区四区激情| 老司机精品视频线观看86| 成人国产精品免费观看视频| 911精品产国品一二三产区| 久久久天堂av| 午夜精品久久久久影视| 国产99久久久国产精品免费看| 在线观看日韩精品| 国产欧美一区二区精品婷婷| 伊人婷婷欧美激情| 国产精品一区久久久久| 欧美探花视频资源| 国产精品国产三级国产三级人妇| 亚洲午夜成aⅴ人片| 成人视屏免费看| 日韩一区二区免费视频| 亚洲欧美激情在线| 国产高清亚洲一区|