NCBI C++ ToolKit
sls_alp_regression.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: sls_alp_regression.cpp 52096 2011-11-28 17:44:35Z boratyng $
2 * ===========================================================================
3 *
4 * PUBLIC DOMAIN NOTICE
5 * National Center for Biotechnology Information
6 *
7 * This software/database is a "United States Government Work" under the
8 * terms of the United States Copyright Act. It was written as part of
9 * the author's offical duties as a United States Government employee and
10 * thus cannot be copyrighted. This software/database is freely available
11 * to the public for use. The National Library of Medicine and the U.S.
12 * Government have not placed any restriction on its use or reproduction.
13 *
14 * Although all reasonable efforts have been taken to ensure the accuracy
15 * and reliability of the software and data, the NLM and the U.S.
16 * Government do not and cannot warrant the performance or results that
17 * may be obtained by using this software or data. The NLM and the U.S.
18 * Government disclaim all warranties, express or implied, including
19 * warranties of performance, merchantability or fitness for any particular
20 * purpose.
21 *
22 * Please cite the author in any work or product based on this material.
23 *
24 * ===========================================================================*/
25 
26 /*****************************************************************************
27 
28 File name: sls_alp_regression.cpp
29 
30 Author: Sergey Sheetlin
31 
32 Contents: Regression methods
33 
34 ******************************************************************************/
35 
36 #include <ncbi_pch.hpp>
37 
38 #include "sls_alp_regression.hpp"
39 
41 USING_SCOPE(blast);
43 
44 
45 //-------------------------Solution of arbitrary equations----------------------------
47 function_type *func_,
48 void* func_pointer_,
49 double a_,//[a,b] is the interval for search of equation solution
50 double b_,
51 Int4 n_partition_,
52 double eps_,
53 std::vector<double> &res_
54 )
55 {
56  res_.resize(0);
57  vector<Int4> intervals(0);
58 
59  if(n_partition_<=0)
60  {
61  throw error("Error in alp_reg::find_tetta_general\n",4);
62  return;
63  };
64 
65  Int4 i;
66  double h=(b_-a_)/n_partition_;
67  double x1,x2 = 0.0;
68  for(i=0;i<n_partition_;i++)
69  {
70  if(i==0)
71  {
72  x1=(*func_)(//calculation of E(exp(tetta*X))
73  a_+i*h,func_pointer_);
74  if(fabs(x1)<eps_)
75  {
76  res_.push_back(a_+i*h);
77  };
78 
79  }
80  else
81  {
82  x1=x2;
83  };
84 
85 
86  x2=(*func_)(//calculation of E(exp(tetta*X))
87  a_+(i+1)*h,
88  func_pointer_);
89 
90  if(fabs(x2)<eps_)
91  {
92  res_.push_back(a_+(i+1)*h);
93  };
94 
95  if((x1*x2<0)&&(fabs(x1)>=eps_&&fabs(x2)>=eps_))
96  {
97  intervals.push_back(i);
98  };
99  };
100 
101  for(i=0;i<(Int4)intervals.size();i++)
102  {
103  double sol=find_single_tetta_general(
104  func_,
105  func_pointer_,
106  a_+intervals[i]*h,//[a,b] is the interval for search of equation solution
107  a_+(1+intervals[i])*h,
108  eps_);
109  res_.push_back(sol);
110  };
111 
112  sort(res_.begin(),res_.end());
113 
114  return;
115 };
116 
118 function_type *func_,
119 void* func_pointer_,
120 double a_,//[a,b] is the interval for search of equation solution
121 double b_,
122 double eps_
123 )
124 {
125  if(b_<a_)
126  {
127  throw error("Error in alp_reg::find_single_tetta_general\n",4);
128  return 0;
129  };
130 
131  double x1=a_;
132  double x2=b_;
133  double precision=(x2-x1)/2;
134 
135  double y1=(*func_)(//calculation of E(exp(tetta*X))
136  x1,
137  func_pointer_);
138  if(fabs(y1)<eps_)
139  {
140  return x1;
141  };
142 
143 
144  double y2=(*func_)(//calculation of E(exp(tetta*X))
145  x2,
146  func_pointer_);
147  if(fabs(y2)<eps_)
148  {
149  return x2;
150  };
151 
152  while(precision>eps_)
153  {
154  double x12=(x1+x2)/2;
155 
156  double y12=(*func_)(//calculation of E(exp(tetta*X))
157  x12,
158  func_pointer_);
159 
160  if(fabs(y12)<eps_)
161  {
162  return x12;
163  };
164 
165  if(y12*y1<0)
166  {
167  x2=x12;
168  y2=y12;
169  }
170  else
171  {
172  x1=x12;
173  y1=y12;
174  };
175  precision=(x2-x1)/2;
176  };
177 
178  return (x1+x2)/2;
179 };
180 
181 //------------regression-----------------------------------
182 
184 double *errors_,
185 Int4 number_of_elements_)
186 {
187 
188  if(number_of_elements_<=0)
189  {
190  throw error("Unexpected error",4);
191  };
192 
193 
194  double average_error=0;
195  Int4 i;
196  for(i=0;i<number_of_elements_;i++)
197  {
198  if(errors_[i]<0)
199  {
200  throw error("Error in the regression is less than 0",4);
201  };
202 
203  average_error+=errors_[i];
204  };
205 
206  average_error/=(double)number_of_elements_;
207 
208  double error_eps;
209 
210  if(average_error<=0)
211  {
212  error_eps=1e-50;
213  }
214  else
215  {
216  error_eps=average_error;
217  };
218 
219 
220  for(i=0;i<number_of_elements_;i++)
221  {
222  if(errors_[i]==0)
223  {
224  errors_[i]=error_eps;
225  };
226  };
227 };
228 
230 Int4 min_length_,
231 Int4 number_of_elements_,
232 double *values_,
233 double *errors_,
234 bool cut_left_tail_,
235 bool cut_right_tail_,
236 double y_,
237 double &beta0_,
238 double &beta1_,
239 double &beta0_error_,
240 double &beta1_error_,
241 Int4 &k1_opt_,
242 Int4 &k2_opt_,
243 bool &res_was_calculated_)
244 {
245 
246  if(number_of_elements_<2)
247  {
248  throw error("Unexpected error\n",4);
249  };
250 
251  correction_of_errors(errors_,number_of_elements_);
252 
253  //minization of the function
254  double c=y_*y_;
255 
256 
257  Int4 k1_start,k1_end;
258  Int4 k2_start,k2_end;
259 
260  if(cut_left_tail_&&cut_right_tail_)
261  {
262  k1_start=0;
263  k1_end=number_of_elements_-1;
264 
265  k2_start=0;
266  k2_end=number_of_elements_-1;
267 
268  }
269  else
270  {
271  if(cut_left_tail_&&!cut_right_tail_)
272  {
273  k1_start=0;
274  k1_end=number_of_elements_-1;
275 
276  k2_start=number_of_elements_-1;
277  k2_end=number_of_elements_-1;
278 
279  }
280  else
281  {
282  if(!cut_left_tail_&&cut_right_tail_)
283  {
284  k1_start=0;
285  k1_end=0;
286 
287  k2_start=0;
288  k2_end=number_of_elements_-1;
289  }
290  else
291  {
292  k1_start=0;
293  k1_end=0;
294 
295  k2_start=number_of_elements_-1;
296  k2_end=number_of_elements_-1;
297 
298  };
299  };
300  };
301 
302  Int4 k1_opt=0,k2_opt=0;
303 
304  double func_opt=DBL_MAX;
305  double beta0_opt=0;
306  double beta1_opt=0;
307  double beta0_opt_error=0;
308  double beta1_opt_error=0;
309 
310  Int4 k1,k2;
311 
312 
313  res_was_calculated_=false;
314 
315 
316  for(k1=k1_start;k1<=k1_end;k1++)
317  {
318 
319  for(k2=alp_data::Tmax(k1+(Int4)1,alp_data::Tmax(k1,k2_start)+min_length_);k2<=k2_end;k2++)
320  {
321  double beta0_opt_tmp,beta1_opt_tmp,beta0_opt_error_tmp,beta1_opt_error_tmp;
322  bool res_was_calculated;
323 
325  values_+k1,
326  errors_+k1,
327  k2-k1+1,
328  k1,
329  c,
330  beta0_opt_tmp,
331  beta1_opt_tmp,
332  beta0_opt_error_tmp,
333  beta1_opt_error_tmp,
334  res_was_calculated);
335 
336 
337 
338  if(tmp<func_opt&&res_was_calculated)
339  {
340  func_opt=tmp;
341  beta0_opt=beta0_opt_tmp;
342  beta1_opt=beta1_opt_tmp;
343  beta0_opt_error=beta0_opt_error_tmp;
344  beta1_opt_error=beta1_opt_error_tmp;
345  k1_opt=k1;
346  k2_opt=k2;
347  res_was_calculated_=true;
348  };
349 
350  };
351  };
352 
353 
354 
355 
356  if(res_was_calculated_)
357  {
358  beta0_=beta0_opt;
359  beta1_=beta1_opt;
360  beta0_error_=beta0_opt_error;
361  beta1_error_=beta1_opt_error;
362  k1_opt_=k1_opt;
363  k2_opt_=k2_opt;
364  };
365 
366 
367 };
368 
370 double *values_,
371 double *errors_,
372 Int4 number_of_elements_,
373 Int4 k_start_,
374 double c_,
375 double &beta0_,
376 double &beta1_,
377 double &beta0_error_,
378 double &beta1_error_,
379 bool &res_was_calculated_)
380 {
381  Int4 i;
382  double a11=0;
383  double a12=0;
384  double a21=0;
385  double a22=0;
386  double y1=0;
387  double y2=0;
388 
389  double y1_error=0;
390  double y2_error=0;
391 
392  for(i=0;i<number_of_elements_;i++)
393  {
394  if(errors_[i]!=0)
395  {
396  double tmp=1.0/(errors_[i]*errors_[i]);
397 
398  a11+=tmp;
399  a12+=(double)(k_start_+i)*tmp;
400  a22+=(double)((k_start_+i)*(k_start_+i))*tmp;
401  y1+=values_[i]*tmp;
402  y1_error+=tmp*tmp*errors_[i]*errors_[i];
403  y2+=(double)(k_start_+i)*values_[i]*tmp;
404  y2_error+=(double)(k_start_+i)*(double)(k_start_+i)*tmp*tmp*errors_[i]*errors_[i];
405  };
406  };
407 
408  a21=a12;
409  y1_error=alp_reg::sqrt_for_errors(y1_error);
410  y2_error=alp_reg::sqrt_for_errors(y2_error);
411 
412  double eps=1e-10*alp_data::Tmax(fabs(a11*a22),fabs(a21*a12));
413 
414  double den=a11*a22-a21*a12;
415  if(fabs(den)<=eps)
416  {
417  res_was_calculated_=false;
418  return 0;
419  }
420  else
421  {
422  res_was_calculated_=true;
423  };
424 
425  beta0_=(y1*a22-a12*y2)/den;
426  beta1_=(a11*y2-a21*y1)/den;
427 
428  beta0_error_=sqrt(y1_error*y1_error*a22*a22+a12*a12*y2_error*y2_error)/den;
429  beta1_error_=sqrt(a11*a11*y2_error*y2_error+a21*a21*y1_error*y1_error)/den;
430 
431 
432  double res=0;
433  for(i=0;i<number_of_elements_;i++)
434  {
435  if(errors_[i]!=0)
436  {
437  double tmp=(beta0_+beta1_*(i+k_start_)-values_[i])/errors_[i];
438  res+=tmp*tmp-c_;
439  };
440  };
441 
442  return res;
443 };
444 
446 Int4 min_length_,
447 Int4 number_of_elements_,
448 double *values_,
449 double *errors_,
450 bool cut_left_tail_,
451 bool cut_right_tail_,
452 double y_,
453 double &beta0_,
454 double beta1_,
455 double &beta0_error_,
456 double beta1_error_,
457 Int4 &k1_opt_,
458 Int4 &k2_opt_,
459 bool &res_was_calculated_)
460 {
461 
462  correction_of_errors(errors_,number_of_elements_);
463 
464  //minization of the function
465  double c=y_*y_;
466 
467 
468  Int4 k1_start,k1_end;
469  Int4 k2_start,k2_end;
470 
471  if(cut_left_tail_&&cut_right_tail_)
472  {
473  k1_start=0;
474  k1_end=number_of_elements_-1;
475 
476  k2_start=0;
477  k2_end=number_of_elements_-1;
478 
479  }
480  else
481  {
482  if(cut_left_tail_&&!cut_right_tail_)
483  {
484  k1_start=0;
485  k1_end=number_of_elements_-1;
486 
487  k2_start=number_of_elements_-1;
488  k2_end=number_of_elements_-1;
489 
490  }
491  else
492  {
493  if(!cut_left_tail_&&cut_right_tail_)
494  {
495  k1_start=0;
496  k1_end=0;
497 
498  k2_start=0;
499  k2_end=number_of_elements_-1;
500  }
501  else
502  {
503  k1_start=0;
504  k1_end=0;
505 
506  k2_start=number_of_elements_-1;
507  k2_end=number_of_elements_-1;
508 
509  };
510  };
511  };
512 
513  Int4 k1_opt = 0, k2_opt = 0;
514 
515  double func_opt=DBL_MAX;
516  double beta0_opt = 0.0;
517  double beta0_opt_error = 0.0;
518 
519  Int4 k1,k2;
520 
521  res_was_calculated_=false;
522 
523 
524  for(k1=k1_start;k1<=k1_end;k1++)
525  {
526 
527  for(k2=alp_data::Tmax(k1,k2_start)+min_length_;k2<=k2_end;k2++)
528  {
529  double beta0_opt_tmp,beta1_opt_tmp,beta0_opt_error_tmp,beta1_opt_error_tmp;
530  bool res_was_calculated;
531 
532  beta1_opt_tmp=beta1_;
533  beta1_opt_error_tmp=beta1_error_;
534 
536  values_+k1,
537  errors_+k1,
538  k2-k1+1,
539  k1,
540  c,
541  beta0_opt_tmp,
542  beta1_opt_tmp,
543  beta0_opt_error_tmp,
544  beta1_opt_error_tmp,
545  res_was_calculated);
546 
547  if(tmp<func_opt&&res_was_calculated)
548  {
549  func_opt=tmp;
550  beta0_opt=beta0_opt_tmp;
551  beta0_opt_error=beta0_opt_error_tmp;
552  k1_opt=k1;
553  k2_opt=k2;
554  res_was_calculated_=true;
555  };
556 
557  };
558  };
559 
560  if(res_was_calculated_)
561  {
562  beta0_=beta0_opt;
563  beta0_error_=beta0_opt_error;
564  k1_opt_=k1_opt;
565  k2_opt_=k2_opt;
566  };
567 
568 
569 };
570 
572 double *values_,
573 double *errors_,
574 Int4 number_of_elements_,
575 Int4 k_start_,
576 double c_,
577 double &beta0_,
578 double beta1_,
579 double &beta0_error_,
580 double beta1_error_,
581 bool &res_was_calculated_)
582 {
583  Int4 i;
584  double a11=0;
585  double y1=0;
586 
587  double y1_error=0;
588 
589 
590  for(i=0;i<number_of_elements_;i++)
591  {
592  if(errors_[i]!=0)
593  {
594  double tmp=1.0/(errors_[i]*errors_[i]);
595 
596  a11+=tmp;
597  y1+=(values_[i]-(double)(k_start_+i)*beta1_)*tmp;
598  double error_tmp=errors_[i]*errors_[i]+(double)(k_start_+i)*(double)(k_start_+i)*beta1_error_*beta1_error_;
599  y1_error+=tmp*tmp*error_tmp;
600  };
601  };
602 
603  y1_error=sqrt(y1_error);
604 
605  double eps=1e-10*fabs(a11);
606 
607  double den=a11;
608  if(fabs(den)<=eps)
609  {
610  res_was_calculated_=false;
611  return 0;
612  }
613  else
614  {
615  res_was_calculated_=true;
616  };
617 
618  beta0_=y1/den;
619 
620  beta0_error_=y1_error/den;
621 
622 
623  double res=0;
624  for(i=0;i<number_of_elements_;i++)
625  {
626  if(errors_[i]!=0)
627  {
628  double tmp=(beta0_+beta1_*(i+k_start_)-values_[i])/errors_[i];
629  res+=tmp*tmp-c_;
630  };
631  };
632 
633  return res;
634 
635 };
636 
637 double alp_reg::error_of_the_lg(//lg(v1_)
638 double v1_,
639 double v1_error_)
640 {
641  if(v1_error_>=1e100||v1_<=0)
642  {
643  return 1e100;
644  };
645 
646  return alp_data::Tmin(fabs(log(v1_)/log(10.0)),v1_error_/v1_/log(10.0));
647 };
648 
649 
650 double alp_reg::error_of_the_sqrt(//sqrt(v1_)
651 double v1_,
652 double v1_error_)
653 {
654  if(v1_error_>=1e100||v1_<0)
655  {
656  return 1e100;
657  };
658 
659  double s=sqrt(v1_);
660  double s1=sqrt(alp_data::Tmax(0.0,v1_-v1_error_));
661  double s2=sqrt(alp_data::Tmax(0.0,v1_+v1_error_));
662 
663  return alp_data::Tmax(fabs(s-s1),fabs(s-s2));
664 };
665 
666 
667 
669 double v1_,
670 double v1_error_,
671 double v2_,
672 double v2_error_)
673 {
674  if(v1_error_>=1e100||v2_error_>=1e100)
675  {
676  return 1e100;
677  };
678 
679  if(v2_==0)
680  {
681  return 1e100;
682  };
683 
684  if(v1_==0&&v1_error_==0)
685  {
686  return 0.0;
687  };
688 
689  double a=v1_/v2_;
690 
691  if(((v2_+v2_error_)*v2_<=0))
692  {
693  double a3=(v1_+v1_error_)/(v2_-v2_error_);
694  double a4=(v1_-v1_error_)/(v2_-v2_error_);
695  return alp_data::Tmax(fabs(a-a3),fabs(a-a4));
696  };
697 
698  if(((v2_-v2_error_)*v2_<=0))
699  {
700  double a1=(v1_+v1_error_)/(v2_+v2_error_);
701  double a2=(v1_-v1_error_)/(v2_+v2_error_);
702  return alp_data::Tmax(fabs(a-a1),fabs(a-a2));
703  };
704 
705 
706  double a1=(v1_+v1_error_)/(v2_+v2_error_);
707  double a2=(v1_-v1_error_)/(v2_+v2_error_);
708  double a3=(v1_+v1_error_)/(v2_-v2_error_);
709  double a4=(v1_-v1_error_)/(v2_-v2_error_);
710 
711  return alp_data::Tmax(fabs(a-a1),fabs(a-a2),fabs(a-a3),fabs(a-a4));
712 };
713 
715 double v1_,
716 double v1_error_,
717 double v2_,
718 double v2_error_)
719 {
720  if(v1_error_>=1e100||v2_error_>=1e100)
721  {
722  return 1e100;
723  };
724 
725  double a1=(v1_+v1_error_)*(v2_+v2_error_);
726  double a2=(v1_-v1_error_)*(v2_+v2_error_);
727  double a3=(v1_+v1_error_)*(v2_-v2_error_);
728  double a4=(v1_-v1_error_)*(v2_-v2_error_);
729 
730  double a=v1_*v2_;
731 
732  return alp_data::Tmax(fabs(a1-a),fabs(a2-a),fabs(a3-a),fabs(a4-a));
733 
734 };
735 
737 double v1_,
738 double v1_error_,
739 double v2_,
740 double v2_error_)
741 {
742  if(v1_error_>=1e100||v2_error_>=1e100)
743  {
744  return 1e100;
745  };
746 
747  return sqrt(v1_error_*v1_error_+v2_error_*v2_error_);
748 };
749 
751 Int4 dim_,
752 double *array_)
753 {
754  vector<double> array_vect(dim_);
755  Int4 i;
756  for(i=0;i<dim_;i++)
757  {
758  array_vect[i]=array_[i];
759  };
760  sort(array_vect.begin(),array_vect.end());
761  if(dim_%2==0)
762  {
763  Int4 k=(Int4)alp_data::round((double)dim_/2.0);
764  return 0.5*(array_vect[k-1]+array_vect[k]);
765  }
766  else
767  {
768  Int4 k=(Int4)alp_data::round((double)(dim_-1.0)/2.0);
769  return array_vect[k];
770 
771  };
772 };
773 
775 double *values,
776 Int4 dim,
777 Int4 N_points,
778 bool *&remove_flag)
779 {
780  remove_flag=NULL;
781 
782  if(dim<=N_points)
783  {
784  throw error("Unexpected error\n",4);
785  };
786 
787  bool ee_error_flag=false;
788  error ee_error("",0);
789 
790  try
791  {
792  try
793  {
794 
795  Int4 i;
796  remove_flag=new bool[dim];
797  alp_data::assert_mem(remove_flag);
798  for(i=0;i<dim;i++)
799  {
800  remove_flag[i]=true;
801  };
802 
803 
804  double med_val=alp_reg::median(
805  dim,
806  values);
807 
808  vector<pair<double,Int4> > array_vect(dim);
809 
810  for(i=0;i<dim;i++)
811  {
812  pair<double,Int4> P;
813  P.first=-fabs(values[i]-med_val);
814  P.second=i;
815  array_vect[i]=P;
816  };
817 
818  sort(array_vect.begin(),array_vect.end());
819 
820  for(i=0;i<N_points;i++)
821  {
822  remove_flag[array_vect[i].second]=false;
823  };
824 
825  double res=0.0;
826 
827  for(i=0;i<dim;i++)
828  {
829  if(remove_flag[i])
830  {
831  res+=values[i];
832  };
833  };
834 
835  res/=(double)(dim-N_points);
836  return res;
837 
838  }
839  catch (error er)
840  {
841  ee_error_flag=true;
842  ee_error=er;
843  };
844  }
845  catch (...)
846  {
847  ee_error_flag=true;
848  ee_error=error("Internal error in the program\n",4);
849  };
850 
851  //memory release
852 
853  if(ee_error_flag)
854  {
855  delete[]remove_flag;remove_flag=NULL;
856  throw error(ee_error.st,ee_error.error_code);
857  };
858 
859  return 0.0;
860 
861 };
862 
static double round(const double &x_)
static T Tmax(T i_, T j_)
static T Tmin(T i_, T j_)
static void assert_mem(void *pointer_)
static double sqrt_for_errors(double x_)
static double function_for_robust_regression_sum_with_cut_LSM_beta1_is_defined(double *values_, double *errors_, Int4 number_of_elements_, Int4 k_start_, double c_, double &beta0_, double beta1_, double &beta0_error_, double beta1_error_, bool &res_was_calculated_)
static double error_of_the_product(double v1_, double v1_error_, double v2_, double v2_error_)
static double error_of_the_sum(double v1_, double v1_error_, double v2_, double v2_error_)
static double median(Int4 dim_, double *array_)
static void robust_regression_sum_with_cut_LSM(Int4 min_length_, Int4 number_of_elements_, double *values_, double *errors_, bool cut_left_tail_, bool cut_right_tail_, double y_, double &beta0_, double &beta1_, double &beta0_error_, double &beta1_error_, Int4 &k1_opt_, Int4 &k2_opt_, bool &res_was_calculated_)
static double robust_sum(double *values, Int4 dim, Int4 N_points, bool *&remove_flag)
static double error_of_the_lg(double v1_, double v1_error_)
static double error_of_the_sqrt(double v1_, double v1_error_)
static double function_for_robust_regression_sum_with_cut_LSM(double *values_, double *errors_, Int4 number_of_elements_, Int4 k_start_, double c_, double &beta0_, double &beta1_, double &beta0_error_, double &beta1_error_, bool &res_was_calculated_)
static void robust_regression_sum_with_cut_LSM_beta1_is_defined(Int4 min_length_, Int4 number_of_elements_, double *values_, double *errors_, bool cut_left_tail_, bool cut_right_tail_, double y_, double &beta0_, double beta1_, double &beta0_error_, double beta1_error_, Int4 &k1_opt_, Int4 &k2_opt_, bool &res_was_calculated_)
static void find_tetta_general(function_type *func_, void *func_pointer_, double a_, double b_, Int4 n_partition_, double eps_, std::vector< double > &res_)
static void correction_of_errors(double *errors_, Int4 number_of_elements_)
static double error_of_the_ratio(double v1_, double v1_error_, double v2_, double v2_error_)
static double find_single_tetta_general(function_type *func_, void *func_pointer_, double a_, double b_, double eps_)
static char precision
Definition: genparams.c:28
#define NULL
Definition: ncbistd.hpp:225
int32_t Int4
4-byte (32-bit) signed integer
Definition: ncbitype.h:102
int i
#define P(a, b, c, d, k, s, t)
constexpr auto sort(_Init &&init)
#define fabs(v)
Definition: ncbi_dispd.c:46
unsigned int a
Definition: ncbi_localip.c:102
static char tmp[2048]
Definition: utf8.c:42
USING_SCOPE(blast)
USING_NCBI_SCOPE
double function_type(double x_, void *func_number_)
std::string st
Int4 error_code
Modified on Sat Dec 02 09:23:08 2023 by modify_doxy.py rev. 669887