ptrc_test.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <tgmath.h>
  6. #include <time.h>
  7. #include <iterative_point_recovery.clh>
  8. #include <ptrc_test_settings.h>
  9. flt32_t fSolves=0.0f; /* counter of number of Chi solves */
  10. #include <iterative_point_recovery.clc>
  11. #define __PTRC_TS_FRND \
  12. (((flt32_t)(rand()-(RAND_MAX/2)))/((flt32_t)(RAND_MAX/2)))
  13. typedef struct _PTRC_TS_STATISTICAL_DATA_SET {
  14. flt32_t* pf32Vals;
  15. flt32_t f32ExpVal;
  16. flt32_t f32SigmaVal;
  17. flt32_t f32MinVal;
  18. flt32_t f32MaxVal;
  19. } _PTRC_STAT_DSET;
  20. typedef struct _PTRC_TS_CASES {
  21. flt32_t f32SensorUnc;
  22. _PTRC_STAT_DSET Errors;
  23. _PTRC_STAT_DSET Solves;
  24. uint64_t u64NofCases;
  25. } _PTRC_TS_CASES;
  26. int32_t __ptrc_ts_oneCase(const uint64_t u64D,
  27. const uint64_t u64NofS,
  28. const flt32_t f32RngMult,
  29. _PTRC_TS_CASES* const pCases);
  30. flt32_t __ptrc_ts_expVal(const flt32_t* const pf32Vals,
  31. uint64_t u64NofVals,
  32. const flt32_t f32DeltaX);
  33. int32_t __ptrc_ts_minMaxVals( flt32_t* const pf32Min,
  34. flt32_t* const pf32Max,
  35. const flt32_t* const pf32Vals,
  36. const uint64_t u64NofVals);
  37. int32_t main(void) {
  38. _PTRC_TS_CASES* pCases=NULL;
  39. uint64_t u64NofCasesBlocks=
  40. (uint64_t)((_PTRC_TS_MAX_SENSOR_UNCERTAINTY-
  41. _PTRC_TS_MIN_SENSOR_UNCERTAINTY)/
  42. _PTRC_TS_SENSOR_UNCERTAINTY_INCREMENT)+1ul;
  43. int32_t err=0;
  44. srand((uint32_t)time(NULL));
  45. pCases=malloc(u64NofCasesBlocks*sizeof(_PTRC_TS_CASES));
  46. if(!pCases) { fprintf(stderr,"Error!!!!!\n"); return(1); }
  47. { uint64_t i;
  48. for(i=0ul;i<u64NofCasesBlocks;i++) {
  49. pCases[i].Errors.pf32Vals=malloc(
  50. _PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT*sizeof(flt32_t));
  51. pCases[i].Solves.pf32Vals=malloc(
  52. _PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT*sizeof(flt32_t));
  53. if(!pCases[i].Errors.pf32Vals || !pCases[i].Solves.pf32Vals) {
  54. uint64_t j;
  55. for(j=0ul;j<i;j++) {
  56. if(pCases[j].Errors.pf32Vals)
  57. free(pCases[j].Errors.pf32Vals);
  58. if(pCases[j].Solves.pf32Vals)
  59. free(pCases[j].Solves.pf32Vals);
  60. }
  61. if(pCases) free(pCases);
  62. fprintf(stderr,"Error!!!!!\n");
  63. return(1);
  64. }
  65. }
  66. }
  67. { uint64_t i;
  68. for(i=0ul;i<u64NofCasesBlocks;i++) {
  69. uint64_t j;
  70. _PTRC_TS_CASES* pCurCaseBlocks=&pCases[i];
  71. pCurCaseBlocks->f32SensorUnc=_PTRC_TS_MIN_SENSOR_UNCERTAINTY+
  72. (((flt32_t)i)*_PTRC_TS_SENSOR_UNCERTAINTY_INCREMENT);
  73. pCurCaseBlocks->u64NofCases=0ul;
  74. pCurCaseBlocks->Errors.f32ExpVal=pCurCaseBlocks->Errors.f32SigmaVal=
  75. pCurCaseBlocks->Solves.f32ExpVal=pCurCaseBlocks->Solves.f32SigmaVal=
  76. 0.0f;
  77. for(j=0ul;j<_PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT;j++) {
  78. err=__ptrc_ts_oneCase(_PTRC_TS_DIMENSIONALITY,
  79. _PTRC_TS_NUM_OF_SPHERES,
  80. _PTRC_TS_RANGE_MULTIPLIER,
  81. pCurCaseBlocks);
  82. if(err && err!=2) {
  83. uint64_t k;
  84. for(k=0ul;k<u64NofCasesBlocks;k++) {
  85. if(pCases[k].Errors.pf32Vals)
  86. free(pCases[k].Errors.pf32Vals);
  87. if(pCases[k].Solves.pf32Vals)
  88. free(pCases[k].Solves.pf32Vals);
  89. }
  90. if(pCases) free(pCases);
  91. fprintf(stderr,"Error!!!!!\n");
  92. return(1);
  93. }
  94. }
  95. }
  96. }
  97. {
  98. FILE* pStatFile=NULL;
  99. uint64_t i;
  100. flt32_t f32DeltaX=_PTRC_TS_STATISTICS_DISCRETISATION_STEP;
  101. printf("Calculating and saving statistics - ");
  102. pStatFile=fopen(_PTRC_TS_STATISTICS_FILENAME,"w");
  103. if(!pStatFile) {
  104. uint64_t k;
  105. for(k=0ul;k<u64NofCasesBlocks;k++) {
  106. if(pCases[k].Errors.pf32Vals)
  107. free(pCases[k].Errors.pf32Vals);
  108. if(pCases[k].Solves.pf32Vals)
  109. free(pCases[k].Solves.pf32Vals);
  110. }
  111. if(pCases) free(pCases);
  112. fprintf(stderr,"Error!!!!!\n");
  113. return(1);
  114. }
  115. fprintf(pStatFile,"Dimensionality %lu\n", _PTRC_TS_DIMENSIONALITY);
  116. fprintf(pStatFile,"Number_of_known_spheres %lu\n",
  117. _PTRC_TS_NUM_OF_SPHERES);
  118. fprintf(pStatFile,"Number_of_runs %lu\n",
  119. _PTRC_TS_NUM_OF_RUNS);
  120. fprintf(pStatFile,"Multiplier "_PTRC_TS_FLOAT_OUTFORM"\n",
  121. (flt32_t)_PTRC_TS_RANGE_MULTIPLIER);
  122. fprintf(pStatFile,"Start_uncertainty "_PTRC_TS_FLOAT_OUTFORM"\n",
  123. (flt32_t)_PTRC_TS_MIN_SENSOR_UNCERTAINTY);
  124. fprintf(pStatFile,"End_uncertainty "_PTRC_TS_FLOAT_OUTFORM"\n",
  125. (flt32_t)_PTRC_TS_MAX_SENSOR_UNCERTAINTY);
  126. fprintf(pStatFile,"Uncertainty_incr "_PTRC_TS_FLOAT_OUTFORM"\n",
  127. (flt32_t)_PTRC_TS_SENSOR_UNCERTAINTY_INCREMENT);
  128. fprintf(pStatFile,"Samples_for_one_uncertainty_value %lu\n",
  129. _PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT);
  130. fprintf(pStatFile,"Statistical_discretisation "
  131. _PTRC_TS_FLOAT_OUTFORM"\n",
  132. (flt32_t)_PTRC_TS_STATISTICS_DISCRETISATION_STEP);
  133. fprintf(pStatFile,"Sensor_uncertainty");
  134. for(i=0ul;i<u64NofCasesBlocks;i++)
  135. fprintf(pStatFile," "_PTRC_TS_FLOAT_OUTFORM,pCases[i].f32SensorUnc);
  136. fprintf(pStatFile,"\nExpected_err");
  137. for(i=0ul;i<u64NofCasesBlocks;i++)
  138. fprintf(pStatFile," "_PTRC_TS_FLOAT_OUTFORM,
  139. pCases[i].Errors.f32ExpVal=__ptrc_ts_expVal(
  140. pCases[i].Errors.pf32Vals,pCases[i].u64NofCases,
  141. f32DeltaX));
  142. fprintf(pStatFile,"\nSigma_err");
  143. for(i=0ul;i<u64NofCasesBlocks;i++) {
  144. uint64_t j;
  145. pCases[i].Errors.f32SigmaVal=0.0f;
  146. for(j=0ul;j<pCases[i].u64NofCases;j++) {
  147. flt32_t x=(floor(pCases[i].Errors.pf32Vals[j]/f32DeltaX)*f32DeltaX)-
  148. pCases[i].Errors.f32ExpVal;
  149. pCases[i].Errors.f32SigmaVal+=(x*x);
  150. }
  151. pCases[i].Errors.f32SigmaVal/=((flt32_t)pCases[i].u64NofCases);
  152. pCases[i].Errors.f32SigmaVal=sqrt(pCases[i].Errors.f32SigmaVal);
  153. fprintf(pStatFile," "_PTRC_TS_FLOAT_OUTFORM,
  154. pCases[i].Errors.f32SigmaVal);
  155. }
  156. for(i=0ul;i<u64NofCasesBlocks;i++)
  157. __ptrc_ts_minMaxVals(&pCases[i].Errors.f32MinVal,
  158. &pCases[i].Errors.f32MaxVal,
  159. pCases[i].Errors.pf32Vals,
  160. pCases[i].u64NofCases);
  161. fprintf(pStatFile,"\nMin_err");
  162. for(i=0ul;i<u64NofCasesBlocks;i++) fprintf(pStatFile,
  163. " "_PTRC_TS_FLOAT_OUTFORM,
  164. pCases[i].Errors.f32MinVal);
  165. fprintf(pStatFile,"\nMax_err");
  166. for(i=0ul;i<u64NofCasesBlocks;i++) fprintf(pStatFile,
  167. " "_PTRC_TS_FLOAT_OUTFORM,
  168. pCases[i].Errors.f32MaxVal);
  169. fprintf(pStatFile,"\nExpected_solves");
  170. for(i=0ul;i<u64NofCasesBlocks;i++)
  171. fprintf(pStatFile," "_PTRC_TS_FLOAT_OUTFORM,
  172. pCases[i].Solves.f32ExpVal=__ptrc_ts_expVal(
  173. pCases[i].Solves.pf32Vals,pCases[i].u64NofCases,1.0f));
  174. fprintf(pStatFile,"\nSigma_solves");
  175. for(i=0ul;i<u64NofCasesBlocks;i++) {
  176. uint64_t j;
  177. pCases[i].Solves.f32SigmaVal=0.0f;
  178. for(j=0ul;j<pCases[i].u64NofCases;j++) {
  179. flt32_t x=pCases[i].Solves.pf32Vals[j]-
  180. pCases[i].Solves.f32ExpVal;
  181. pCases[i].Solves.f32SigmaVal+=(x*x);
  182. }
  183. pCases[i].Solves.f32SigmaVal/=((flt32_t)pCases[i].u64NofCases);
  184. pCases[i].Solves.f32SigmaVal=sqrt(pCases[i].Solves.f32SigmaVal);
  185. fprintf(pStatFile," "_PTRC_TS_FLOAT_OUTFORM,
  186. pCases[i].Solves.f32SigmaVal);
  187. }
  188. for(i=0ul;i<u64NofCasesBlocks;i++)
  189. __ptrc_ts_minMaxVals(&pCases[i].Solves.f32MinVal,
  190. &pCases[i].Solves.f32MaxVal,
  191. pCases[i].Solves.pf32Vals,
  192. pCases[i].u64NofCases);
  193. fprintf(pStatFile,"\nMin_solves");
  194. for(i=0ul;i<u64NofCasesBlocks;i++)
  195. fprintf(pStatFile," %lu",(uint64_t)pCases[i].Solves.f32MinVal);
  196. fprintf(pStatFile,"\nMax_solves");
  197. for(i=0ul;i<u64NofCasesBlocks;i++)
  198. fprintf(pStatFile," %lu",(uint64_t)pCases[i].Solves.f32MaxVal);
  199. fprintf(pStatFile,"\nSensor_uncertainty Raw_Deltas\n");
  200. for(i=0ul;i<u64NofCasesBlocks;i++) {
  201. uint64_t j;
  202. fprintf(pStatFile,_PTRC_TS_FLOAT_OUTFORM,pCases[i].f32SensorUnc);
  203. for(j=0ul;j<pCases[i].u64NofCases;j++)
  204. fprintf(pStatFile," "_PTRC_TS_FLOAT_OUTFORM,
  205. pCases[i].Errors.pf32Vals[j]);
  206. fprintf(pStatFile,"\n");
  207. }
  208. fprintf(pStatFile,"\nSensor_uncertainty Raw_Solves\n");
  209. for(i=0ul;i<u64NofCasesBlocks;i++) {
  210. uint64_t j;
  211. fprintf(pStatFile,_PTRC_TS_FLOAT_OUTFORM,pCases[i].f32SensorUnc);
  212. for(j=0ul;j<pCases[i].u64NofCases;j++)
  213. fprintf(pStatFile," %lu",
  214. (uint64_t)pCases[i].Solves.pf32Vals[j]);
  215. fprintf(pStatFile,"\n");
  216. }
  217. fclose(pStatFile);
  218. printf("ok\n");
  219. }
  220. { uint64_t k;
  221. for(k=0ul;k<u64NofCasesBlocks;k++) {
  222. if(pCases[k].Errors.pf32Vals) free(pCases[k].Errors.pf32Vals);
  223. if(pCases[k].Solves.pf32Vals) free(pCases[k].Solves.pf32Vals);
  224. }
  225. if(pCases) free(pCases);
  226. }
  227. return(0);
  228. }
  229. int32_t __ptrc_ts_oneCase(const uint64_t u64D,
  230. const uint64_t u64NofS,
  231. const flt32_t f32RngMult,
  232. _PTRC_TS_CASES* const pCases) {
  233. _PTRC_INDAT in={ .u64D=u64D, .u64NofS=u64NofS, .pfCnt=NULL, .pfRds=NULL };
  234. flt32_t* pf32RealPnt=NULL,
  235. * pf32Res=NULL,
  236. f32Qlt=0.0f;
  237. int32_t err=0;
  238. pf32RealPnt=malloc(u64D*sizeof(flt32_t));
  239. in.pfCnt=malloc(u64NofS*u64D*sizeof(flt32_t));
  240. in.pfRds=malloc(u64NofS*sizeof(flt32_t));
  241. pf32Res=malloc(u64D*sizeof(flt32_t));
  242. if(!(pf32RealPnt && in.pfCnt && in.pfRds && pf32Res)) {
  243. if(pf32RealPnt) free(pf32RealPnt);
  244. if(in.pfCnt) free(in.pfCnt);
  245. if(in.pfRds) free(in.pfRds);
  246. if(pf32Res) free(pf32Res);
  247. return(1);
  248. }
  249. { uint64_t i;
  250. for(i=0;i<u64D;i++) pf32RealPnt[i]=__PTRC_TS_FRND*f32RngMult;
  251. for(i=0;i<(u64D*u64NofS);i++) in.pfCnt[i]=__PTRC_TS_FRND*f32RngMult;
  252. for(i=0;i<u64NofS;i++) {
  253. flt32_t fault;
  254. in.pfRds[i]=__ptrc_EuclDist(pf32RealPnt,&in.pfCnt[i*u64D],u64D);
  255. fault=__PTRC_TS_FRND*pCases->f32SensorUnc*in.pfRds[i];
  256. in.pfRds[i]+=fault;
  257. }
  258. }
  259. #if defined(_PTRC_TS_DATA_OUTPUT_MODE)
  260. printf(_PTRC_TS_FLOAT_OUTFORM" %lu\n",
  261. pCases->f32SensorUnc,_PTRC_MAX_ITERATIONS_ON_SPHERE);
  262. #endif /* _PTRC_TS_DATA_OUTPUT_MODE */
  263. fSolves=0.0f;
  264. err=_ptrc_recoverPoint(pf32Res,&f32Qlt,in,_PTRC_TS_NUM_OF_RUNS);
  265. if(err) {
  266. if(pf32RealPnt) free(pf32RealPnt);
  267. if(in.pfCnt) free(in.pfCnt);
  268. if(in.pfRds) free(in.pfRds);
  269. if(pf32Res) free(pf32Res);
  270. return(2);
  271. }
  272. pCases->Errors.pf32Vals[pCases->u64NofCases]=
  273. __ptrc_EuclDist(pf32RealPnt,pf32Res,u64D);
  274. pCases->Solves.pf32Vals[pCases->u64NofCases]=fSolves;
  275. pCases->u64NofCases++;
  276. #if defined(_PTRC_TS_DATA_OUTPUT_MODE)
  277. { uint64_t j;
  278. printf("%d ",(-2));
  279. for(j=0ul;j<u64D;j++) printf(_PTRC_TS_FLOAT_OUTFORM" ",pf32RealPnt[j]);
  280. printf(_PTRC_TS_FLOAT_OUTFORM" \n",
  281. pCases->Errors.pf32Vals[(pCases->u64NofCases)-1ul]); }
  282. #endif /* _PTRC_TS_DATA_OUTPUT_MODE */
  283. if(pf32RealPnt) free(pf32RealPnt);
  284. if(in.pfCnt) free(in.pfCnt);
  285. if(in.pfRds) free(in.pfRds);
  286. if(pf32Res) free(pf32Res);
  287. return(0);
  288. }
  289. flt32_t __ptrc_ts_expVal(const flt32_t* const pf32Vals,
  290. uint64_t u64NofVals,
  291. const flt32_t f32DeltaX) {
  292. flt32_t f32Res=0.0f;
  293. uint64_t i;
  294. for(i=0ul;i<u64NofVals;i++)
  295. f32Res+=floor(pf32Vals[i]/f32DeltaX)*f32DeltaX;
  296. f32Res/=((flt32_t)u64NofVals);
  297. return(f32Res);
  298. }
  299. int32_t __ptrc_ts_minMaxVals( flt32_t* const pf32Min,
  300. flt32_t* const pf32Max,
  301. const flt32_t* const pf32Vals,
  302. const uint64_t u64NofVals) {
  303. *pf32Min=*pf32Max=pf32Vals[0];
  304. uint64_t i;
  305. for(i=1ul;i<u64NofVals;i++) {
  306. if(pf32Vals[i]<(*pf32Min)) *pf32Min=pf32Vals[i];
  307. if(pf32Vals[i]>(*pf32Max)) *pf32Max=pf32Vals[i];
  308. }
  309. return(0);
  310. }