Advertisement
Guest User

Untitled

a guest
Feb 4th, 2013
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. #include <Rcpp.h>
  2. #include <iostream>
  3. using namespace Rcpp;
  4.  
  5.  
  6. //int foo(int a, int b){
  7. // return a+b;}
  8.  
  9. // [[Rcpp::export]]
  10. NumericVector inclusionprobabilitiesCpp(NumericVector a, double n){
  11. int nnull = 0; //Count probabilities = 0
  12. int nneg = 0; //Count probabilities < 0
  13. double sumA = 0; //Sum of elements of a
  14.  
  15. for(int i=0;i<a.size();i++){
  16. if(a[i]==0){
  17. nnull++;}
  18. if(a[i]<0){
  19. nneg++;
  20. a[i] = 0;}
  21. sumA += a[i];
  22. }
  23. NumericVector pik1;
  24.  
  25. if(nnull == a.size()){
  26. pik1 = a;}
  27. else{ // **
  28. pik1 = (n/sumA)*a;
  29. NumericVector tempPik = pik1;
  30. int pikSize = 0;
  31. int pikCursor = 0;
  32.  
  33. for(int i=0;i<pik1.size();i++){
  34. if(pik1[i] <= 0){
  35. pik1[i] = 0;
  36. }
  37. else{
  38. pikSize++;}
  39. }
  40. //create, fill pik
  41. NumericVector pik(pikSize);
  42.  
  43. for(int i=0;i<pik1.size();i++){
  44. if(pik1[i] != 0){
  45. pik[pikCursor] = pik1[i];
  46. pikCursor++;}
  47. }
  48.  
  49. LogicalVector list1 = pik1 > 0;
  50. LogicalVector list2 = pik >= 1;
  51. int l = 0;
  52.  
  53. //find l, the number of elements of pik >= 1
  54. for(int i=0;i<list2.size();i++){
  55. if(list2[i]==true){
  56. l++;}
  57. }//end find l
  58. if(l>0){ //**
  59. int l1 = 0;
  60. NumericVector tempX(pik.size());
  61. while(l != l1){
  62. int xSize = pik.size();
  63. tempX = pik;
  64. //Where values are true, pik >=1 and we aren't modifying it yet
  65. // Instead, here we set other values x to (n-l)*x/(sum x)
  66. for(int i=0;i<pik.size();i++){
  67. if(list2[i] == true){
  68. tempX[i] = -1;
  69. xSize--;
  70. }
  71. //std::cout<< tempX[i]<<" ";
  72. }
  73. NumericVector x(xSize);
  74. int xCursor = 0;
  75. double sumX = 0;
  76. for(int i=0;i<pik.size();i++){
  77. if(list2[i] == false){
  78.  
  79. x[xCursor] = tempX[i];
  80. sumX += tempX[i];
  81. xCursor++;
  82. }
  83. }// end define x
  84. x = x/sumX;
  85. xCursor = 0;
  86. for(int i=0;i<pik.size();i++){
  87. if(list2[i]==false){
  88. pik[i] = (n-l)*x[xCursor];
  89. xCursor++;
  90. }
  91. else{
  92. pik[i] = 1;
  93. }
  94. }
  95. l1 = l;
  96. list2 = pik >=1;
  97. l = 0; //reset l
  98. //find l, the number of elements of pik >= 1
  99. for(int i=0;i<list2.size();i++){
  100. if(pik[i]>=1){
  101. l++;}
  102. }//end find l
  103. } //end while
  104.  
  105. //pik1[list1]=pik
  106. pikCursor = 0;
  107. for(int i=0;i<pik1.size();i++){
  108. if(list1[i]==true){
  109. pik1[i]=pik[pikCursor];
  110. pikCursor++;
  111. }
  112. }
  113. } //end if **
  114. } //end else **
  115. return pik1; //a NumericVector
  116. }
  117.  
  118. // [[Rcpp::export]]
  119. NumericVector UPtilleCpp(NumericVector pik, double eps=0.000001){
  120. std::cout<<"oh hai";
  121. if(any(is_na(pik))){
  122. std::cout<<"there are missing values in the pik vector \n";
  123. return pik;}
  124.  
  125. double n_double = 0;
  126. for(int i=0;i<pik.size();i++){
  127. n_double += pik[i];
  128. }
  129. int n = int(floor(n_double+.5)); //round n_double to nearest int
  130. //std::cout<<n_double <<" "<<n;
  131.  
  132. LogicalVector list1 = (pik > eps);
  133. LogicalVector list2 = (pik < (1 - eps));
  134. LogicalVector list = list1*list2;
  135. int pikbLength = 0;
  136.  
  137. for(int i =0;i<list.size();i++){
  138. // std::cout<<list[i]<<" ";
  139. pikbLength+=list[i];
  140. }
  141.  
  142. //Define pikb
  143. NumericVector pikb(pikbLength);
  144. int pikbCursor = 0;
  145.  
  146. for(int i=0;i<list.size();i++){
  147. if(list[i]==true){
  148. pikb[pikbCursor] = pik[i];
  149. pikbCursor++;
  150. }
  151. } //end define pikb
  152.  
  153. int N = pikbLength;
  154. NumericVector s = pik;
  155.  
  156. if(N<1){
  157. std::cout<<"the pik vector has all elements outside of the range [eps,1-eps]";
  158. return pik;
  159. }
  160. else{ // **
  161.  
  162. n = 0;
  163. for(int i=0;i<pikb.size();i++){
  164. n += pikb[i];
  165. }
  166. NumericVector sb(N,1.0);
  167. NumericVector b(N,1.0);
  168.  
  169. for(int i=0;i<N-n;i++){ //**
  170. NumericVector a = inclusionprobabilitiesCpp(pikb,N-i);
  171. // int xx = foo(1,2);
  172. }//end for **
  173. }//end else **
  174.  
  175. return pik;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement