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

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

?? psmo_solver.cpp

?? 支持向量分類算法在linux操作系統(tǒng)下的是實現(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一区二区三区免费野_久草精品视频
亚洲一区在线视频观看| 久久国产福利国产秒拍| 2023国产精品| 欧美日韩午夜影院| 成人激情午夜影院| 蜜臀av一区二区| 亚洲在线视频网站| 国产精品久久久久影院老司| 精品福利视频一区二区三区| 欧美日韩一区二区三区不卡| 91美女片黄在线观看91美女| 国产精品乡下勾搭老头1| 日产欧产美韩系列久久99| 亚洲久草在线视频| 国产精品国产自产拍高清av | 欧美日韩国产一级| 成人18视频日本| 国产精品系列在线播放| 日产国产欧美视频一区精品| 亚洲一区二区在线播放相泽| 亚洲天堂av一区| 国产精品情趣视频| 久久久另类综合| 精品国内片67194| 欧美大白屁股肥臀xxxxxx| 欧美日韩国产高清一区| 欧美无砖专区一中文字| 欧美综合天天夜夜久久| 91麻豆精品在线观看| 99久久99久久免费精品蜜臀| 懂色一区二区三区免费观看| 国产精一品亚洲二区在线视频| 精品无码三级在线观看视频| 麻豆精品在线观看| 久久精品72免费观看| 美日韩黄色大片| 免费成人在线影院| 精品无人码麻豆乱码1区2区| 韩国三级在线一区| 国产一区二区三区免费看| 国内精品自线一区二区三区视频| 久久99精品久久久| 国产一区二区免费视频| 国产精品一区二区久激情瑜伽| 国产成人丝袜美腿| 99精品黄色片免费大全| 在线精品国精品国产尤物884a| 欧美三级乱人伦电影| 91精选在线观看| 欧美刺激脚交jootjob| 久久综合久久综合久久综合| 国产欧美一区二区三区沐欲| 国产精品国产三级国产a | 国模无码大尺度一区二区三区| 国产一区999| 成人毛片在线观看| 欧美性极品少妇| 日韩一区二区三区三四区视频在线观看 | 欧美日韩和欧美的一区二区| 欧美一区二区大片| 国产日韩欧美电影| 一区二区三区日韩欧美精品| 日本午夜一本久久久综合| 国产精品99久久久久| 色综合久久久久综合体 | 国产女人aaa级久久久级| 国产精品国产自产拍高清av王其 | 国产suv精品一区二区三区| www.日韩在线| 欧美人与z0zoxxxx视频| 久久久久99精品国产片| 亚洲欧美日韩电影| 日本在线不卡一区| 国产91在线|亚洲| 欧美日韩免费一区二区三区| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 一本一道久久a久久精品| 91精品国产色综合久久久蜜香臀| 久久精品亚洲一区二区三区浴池| 亚洲人成在线播放网站岛国| 免费xxxx性欧美18vr| av福利精品导航| 日韩女优制服丝袜电影| 亚洲精品国产无天堂网2021 | 色婷婷精品大视频在线蜜桃视频| 7777精品伊人久久久大香线蕉最新版| 国产午夜精品一区二区三区视频| 亚洲国产精品影院| 国产成人精品一区二区三区四区| 欧美日韩视频第一区| 日本一区二区三区久久久久久久久不| 亚洲va欧美va天堂v国产综合| 国产麻豆9l精品三级站| 欧美午夜精品一区二区蜜桃| 国产视频视频一区| 日本成人在线网站| 色婷婷综合中文久久一本| 久久综合网色—综合色88| 亚洲成人av在线电影| 99精品欧美一区| 久久久99精品免费观看不卡| 天天综合天天综合色| 91视频在线看| 久久久久久免费毛片精品| 五月天视频一区| 色域天天综合网| 国产精品美女久久久久av爽李琼| 久久av资源网| 欧美老肥妇做.爰bbww| 亚洲乱码国产乱码精品精小说 | 欧美精品日韩一区| 亚洲精品videosex极品| 成人毛片视频在线观看| 亚洲精品在线网站| 日韩电影在线观看一区| 欧洲生活片亚洲生活在线观看| 中文字幕欧美日韩一区| 国产精品一区一区| 久久av中文字幕片| 91捆绑美女网站| 国产清纯在线一区二区www| 精品在线亚洲视频| 555夜色666亚洲国产免| 视频一区免费在线观看| 在线观看一区二区精品视频| 亚洲美女电影在线| 91看片淫黄大片一级在线观看| 国产女同性恋一区二区| 高清成人免费视频| 欧美精彩视频一区二区三区| 国产电影一区在线| 国产欧美日韩精品在线| 国产盗摄精品一区二区三区在线 | 日本va欧美va精品| 91精品国产一区二区| 日本视频一区二区| 日韩视频中午一区| 狠狠v欧美v日韩v亚洲ⅴ| 久久免费电影网| 国产不卡在线视频| 国产精品国产三级国产a| k8久久久一区二区三区| 亚洲精品一二三四区| 欧美少妇bbb| 美腿丝袜亚洲综合| 久久久久久一二三区| 国产精品亚洲视频| 综合中文字幕亚洲| 在线免费亚洲电影| 日韩影院在线观看| 久久久精品国产免大香伊 | 91免费国产在线观看| 一区二区三区蜜桃| 欧美一区二区网站| 国内精品在线播放| 国产精品大尺度| 欧美年轻男男videosbes| 韩国成人福利片在线播放| 国产欧美日韩另类一区| 91福利在线看| 美女尤物国产一区| 国产精品色眯眯| 欧美性色黄大片| 久久国产人妖系列| 中文字幕一区二区三区不卡| 欧美色手机在线观看| 精品一区二区三区在线播放视频| 国产精品久久久久久久久果冻传媒 | 成人sese在线| 亚洲大尺度视频在线观看| 久久综合久久99| 色8久久精品久久久久久蜜| 男人操女人的视频在线观看欧美| 日本一区二区三区四区在线视频| 欧美亚洲一区二区三区四区| 国内成人精品2018免费看| 亚洲欧美成aⅴ人在线观看| 日韩精品资源二区在线| jizz一区二区| 久久成人羞羞网站| 亚洲自拍偷拍网站| 久久久九九九九| 91精品视频网| 99久久国产综合精品女不卡| 美女被吸乳得到大胸91| 亚洲天堂免费在线观看视频| 精品国产乱码久久久久久久久 | 不卡电影免费在线播放一区| 午夜国产不卡在线观看视频| 中文一区一区三区高中清不卡| 欧美浪妇xxxx高跟鞋交| aaa欧美日韩| 国产精品538一区二区在线| 亚洲国产欧美一区二区三区丁香婷| 久久久久99精品一区| 欧美一区二区三区视频在线 | 久久―日本道色综合久久| 欧美在线你懂得| 成人h精品动漫一区二区三区| 久久99这里只有精品|