PageRenderTime 57ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/mona/src/minc/mincWorld.cpp

#
C++ | 441 lines | 393 code | 30 blank | 18 comment | 73 complexity | 1590a469caedae54ff098ca871dcaff3 MD5 | raw file
  1. // For conditions of distribution and use, see copyright notice in minc.hpp
  2. // The minc T-maze world.
  3. #include "TmazeGrammar.hpp"
  4. #include "minc.hpp"
  5. #ifdef WIN32
  6. #include <process.h>
  7. #endif
  8. // Version (SCCS "what" format).
  9. #define MINC_WORLD_VERSION "@(#)Minc world version 1.0"
  10. const char *MincWorldVersion = MINC_WORLD_VERSION;
  11. // Parameters.
  12. int NumMazeMarks;
  13. int NumMazes;
  14. RANDOM RandomSeed;
  15. int GeneralizationRuns;
  16. int DiscriminationRuns;
  17. int ResultRuns;
  18. // Discrimination success criterion: number of consecutive successful runs.
  19. int DISCRIMINATION_SUCCESS_RUNS = 10;
  20. // T-maze grammar.
  21. TmazeGrammar *MazeGrammar;
  22. // T-mazes.
  23. vector<Tmaze *> GeneralizationMazes;
  24. Tmaze *DiscriminationMaze;
  25. // LENS examples.
  26. #define GENERALIZATION_EXAMPLE "TmazeGeneralization"
  27. #define DISCRIMINATION_EXAMPLE "TmazeDiscrimination"
  28. char GeneralizationFileName[BUFSIZ];
  29. char DiscriminationFileName[BUFSIZ];
  30. char *Usage[] =
  31. {
  32. (char *)"minc_world\n",
  33. (char *)" -numMazeMarks <number of maze marks (must be >= 2)>\n",
  34. (char *)" -numMazes <number of T-mazes>\n",
  35. (char *)" -randomSeed <generation seed>\n",
  36. (char *)" [-generalizationRuns <number of generalization runs>]\n",
  37. (char *)" [-discriminationRuns <number of discrimination runs>]\n",
  38. (char *)" -resultRuns <number of result runs>\n",
  39. NULL
  40. };
  41. void printUsage()
  42. {
  43. for (int i = 0; Usage[i] != NULL; i++)
  44. {
  45. fprintf(stderr, "%s", Usage[i]);
  46. }
  47. }
  48. int
  49. main(int argc, char *argv[])
  50. {
  51. int i, j, k, intervals;
  52. Random *randomizer;
  53. Tmaze *maze;
  54. FILE *fp;
  55. char buf[100];
  56. NumMazeMarks = -1;
  57. NumMazes = -1;
  58. GeneralizationRuns = -1;
  59. DiscriminationRuns = -1;
  60. ResultRuns = -1;
  61. RandomSeed = INVALID_RANDOM;
  62. for (i = 1; i < argc; i++)
  63. {
  64. if (strcmp(argv[i], "-numMazeMarks") == 0)
  65. {
  66. i++;
  67. if (i >= argc)
  68. {
  69. printUsage();
  70. return(1);
  71. }
  72. NumMazeMarks = atoi(argv[i]);
  73. if (NumMazeMarks < 2)
  74. {
  75. printUsage();
  76. return(1);
  77. }
  78. continue;
  79. }
  80. if (strcmp(argv[i], "-numMazes") == 0)
  81. {
  82. i++;
  83. if (i >= argc)
  84. {
  85. printUsage();
  86. return(1);
  87. }
  88. NumMazes = atoi(argv[i]);
  89. if (NumMazes < 1)
  90. {
  91. printUsage();
  92. return(1);
  93. }
  94. continue;
  95. }
  96. if (strcmp(argv[i], "-randomSeed") == 0)
  97. {
  98. i++;
  99. if (i >= argc)
  100. {
  101. printUsage();
  102. return(1);
  103. }
  104. RandomSeed = atoi(argv[i]);
  105. continue;
  106. }
  107. if (strcmp(argv[i], "-generalizationRuns") == 0)
  108. {
  109. i++;
  110. if (i >= argc)
  111. {
  112. printUsage();
  113. return(1);
  114. }
  115. GeneralizationRuns = atoi(argv[i]);
  116. if (GeneralizationRuns < 0)
  117. {
  118. printUsage();
  119. return(1);
  120. }
  121. continue;
  122. }
  123. if (strcmp(argv[i], "-discriminationRuns") == 0)
  124. {
  125. i++;
  126. if (i >= argc)
  127. {
  128. printUsage();
  129. return(1);
  130. }
  131. DiscriminationRuns = atoi(argv[i]);
  132. if (DiscriminationRuns < 0)
  133. {
  134. printUsage();
  135. return(1);
  136. }
  137. continue;
  138. }
  139. if (strcmp(argv[i], "-resultRuns") == 0)
  140. {
  141. i++;
  142. if (i >= argc)
  143. {
  144. printUsage();
  145. return(1);
  146. }
  147. ResultRuns = atoi(argv[i]);
  148. if (ResultRuns < 0)
  149. {
  150. printUsage();
  151. return(1);
  152. }
  153. continue;
  154. }
  155. printUsage();
  156. return(1);
  157. }
  158. if ((NumMazeMarks == -1) || (NumMazes == -1) ||
  159. (RandomSeed == INVALID_RANDOM) || (ResultRuns == -1))
  160. {
  161. printUsage();
  162. return(1);
  163. }
  164. else
  165. {
  166. printf("Parameters:\n");
  167. printf("numMazeMarks=%d\n", NumMazeMarks);
  168. printf("numMazes=%d\n", NumMazes);
  169. printf("randomSeed=%lu\n", RandomSeed);
  170. printf("generalizationRuns=%d\n", GeneralizationRuns);
  171. printf("discriminationRuns=%d\n", DiscriminationRuns);
  172. printf("resultRuns=%d\n", ResultRuns);
  173. }
  174. // Get random numbers.
  175. randomizer = new Random(RandomSeed);
  176. assert(randomizer != NULL);
  177. // Generate mazes.
  178. MazeGrammar = new TmazeGrammar(RandomSeed, NumMazeMarks);
  179. assert(MazeGrammar != NULL);
  180. for (i = 0; i < (NumMazes * 100) && (int)GeneralizationMazes.size() < NumMazes; i++)
  181. {
  182. maze = MazeGrammar->generateMaze();
  183. assert(maze != NULL);
  184. for (j = 0; j < (int)GeneralizationMazes.size(); j++)
  185. {
  186. if (GeneralizationMazes[j]->isDuplicate(maze))
  187. {
  188. break;
  189. }
  190. }
  191. if (j == (int)GeneralizationMazes.size())
  192. {
  193. GeneralizationMazes.push_back(maze);
  194. }
  195. else
  196. {
  197. delete maze;
  198. }
  199. }
  200. if ((int)GeneralizationMazes.size() < NumMazes)
  201. {
  202. fprintf(stderr, "Cannot create %d unique files\n", NumMazes);
  203. return(1);
  204. }
  205. // Create generalization example file.
  206. printf("Generalization mazes:\n");
  207. #ifdef WIN32
  208. sprintf(GeneralizationFileName, "%s_%d.ex", GENERALIZATION_EXAMPLE, _getpid());
  209. #else
  210. sprintf(GeneralizationFileName, "/tmp/%s_%d.ex", GENERALIZATION_EXAMPLE, getpid());
  211. #endif
  212. if ((fp = fopen(GeneralizationFileName, "w")) == NULL)
  213. {
  214. fprintf(stderr, "Cannot create generalization example file %s\n", GeneralizationFileName);
  215. return(1);
  216. }
  217. intervals = 0;
  218. for (i = 0; i < NumMazes; i++)
  219. {
  220. maze = GeneralizationMazes[i];
  221. if (intervals < (int)maze->path.size())
  222. {
  223. intervals = (int)maze->path.size();
  224. }
  225. printf("name: { ");
  226. fprintf(fp, "name: { ");
  227. for (j = 0; j < (int)maze->path.size(); j++)
  228. {
  229. printf("%d ", maze->path[j].mark);
  230. fprintf(fp, "%d ", maze->path[j].mark);
  231. }
  232. printf("} %d\n", (int)maze->path.size());
  233. fprintf(fp, "} %d\n", (int)maze->path.size());
  234. for (j = 0; j < (int)maze->path.size(); j++)
  235. {
  236. printf("I:");
  237. fprintf(fp, "I:");
  238. for (k = 0; k < NumMazeMarks; k++)
  239. {
  240. if (k == maze->path[j].mark)
  241. {
  242. printf(" 1");
  243. fprintf(fp, " 1");
  244. }
  245. else
  246. {
  247. printf(" 0");
  248. fprintf(fp, " 0");
  249. }
  250. }
  251. printf(" T: ");
  252. fprintf(fp, " T: ");
  253. if (maze->path[j].direction)
  254. {
  255. printf("0 1");
  256. fprintf(fp, "0 1");
  257. }
  258. else
  259. {
  260. printf("1 0");
  261. fprintf(fp, "1 0");
  262. }
  263. printf(" P: %f %f", maze->path[j].probability, 1.0 - maze->path[j].probability);
  264. if (j < (int)maze->path.size() - 1)
  265. {
  266. printf("\n");
  267. fprintf(fp, "\n");
  268. }
  269. else
  270. {
  271. printf(";\n");
  272. fprintf(fp, ";\n");
  273. }
  274. }
  275. }
  276. fclose(fp);
  277. // Create discrimination example file.
  278. printf("Discrimination maze:\n");
  279. DiscriminationMaze = maze = GeneralizationMazes[randomizer->RAND_CHOICE(NumMazes)];
  280. #ifdef WIN32
  281. sprintf(DiscriminationFileName, "%s_%d.ex", DISCRIMINATION_EXAMPLE, _getpid());
  282. #else
  283. sprintf(DiscriminationFileName, "/tmp/%s_%d.ex", DISCRIMINATION_EXAMPLE, getpid());
  284. #endif
  285. if ((fp = fopen(DiscriminationFileName, "w")) == NULL)
  286. {
  287. fprintf(stderr, "Cannot create discrimination example file %s\n", DiscriminationFileName);
  288. return(1);
  289. }
  290. printf("name: { ");
  291. fprintf(fp, "name: { ");
  292. for (i = 0; i < (int)maze->path.size(); i++)
  293. {
  294. printf("%d ", maze->path[i].mark);
  295. fprintf(fp, "%d ", maze->path[i].mark);
  296. }
  297. printf("} %d\n", (int)maze->path.size());
  298. fprintf(fp, "} %d\n", (int)maze->path.size());
  299. for (i = 0; i < (int)maze->path.size(); i++)
  300. {
  301. printf("I:");
  302. fprintf(fp, "I:");
  303. for (j = 0; j < NumMazeMarks; j++)
  304. {
  305. if (j == maze->path[i].mark)
  306. {
  307. printf(" 1");
  308. fprintf(fp, " 1");
  309. }
  310. else
  311. {
  312. printf(" 0");
  313. fprintf(fp, " 0");
  314. }
  315. }
  316. printf(" T: ");
  317. fprintf(fp, " T: ");
  318. if (maze->path[i].direction)
  319. {
  320. printf("0 1");
  321. fprintf(fp, "0 1");
  322. }
  323. else
  324. {
  325. printf("1 0");
  326. fprintf(fp, "1 0");
  327. }
  328. printf(" P: %f %f", maze->path[i].probability, 1.0 - maze->path[i].probability);
  329. if (i < (int)maze->path.size() - 1)
  330. {
  331. printf("\n");
  332. fprintf(fp, "\n");
  333. }
  334. else
  335. {
  336. printf(";\n");
  337. fprintf(fp, ";\n");
  338. }
  339. }
  340. fclose(fp);
  341. // Start lens.
  342. if (startLens(argv[0]))
  343. {
  344. fprintf(stderr, "Lens failed to start\n");
  345. return(1);
  346. }
  347. // Load maze examples.
  348. sprintf(buf, (char *)"loadExamples %s -set %s -exmode PERMUTED",
  349. GeneralizationFileName, GENERALIZATION_EXAMPLE);
  350. lens(buf);
  351. sprintf(buf, (char *)"loadExamples %s -set %s", DiscriminationFileName,
  352. DISCRIMINATION_EXAMPLE);
  353. lens(buf);
  354. #ifdef WIN32
  355. _unlink(GeneralizationFileName);
  356. _unlink(DiscriminationFileName);
  357. #else
  358. unlink(GeneralizationFileName);
  359. unlink(DiscriminationFileName);
  360. #endif
  361. // Create minc.
  362. Minc *minc = new Minc(NumMazeMarks, intervals, RandomSeed);
  363. assert(minc != NULL);
  364. // Generalization runs.
  365. if (GeneralizationRuns > 0)
  366. {
  367. minc->generalize((char *)GENERALIZATION_EXAMPLE, GeneralizationRuns);
  368. }
  369. // Discrimination runs.
  370. if (DiscriminationRuns > 0)
  371. {
  372. Minc::startTick = randomizer->RAND_CHOICE((int)DiscriminationMaze->path.size());
  373. Minc::tickCount = -1;
  374. for (i = 0; i < DiscriminationRuns; i++)
  375. {
  376. minc->discriminate((char *)DISCRIMINATION_EXAMPLE, DiscriminationMaze);
  377. }
  378. }
  379. // Result runs.
  380. printf("Result runs:\n");
  381. Minc::startTick = -1;
  382. for (i = j = 0; i < ResultRuns; i++)
  383. {
  384. if (minc->test((char *)DISCRIMINATION_EXAMPLE, DiscriminationMaze))
  385. {
  386. j++;
  387. printf("Result run=%d: success\n", i);
  388. }
  389. else
  390. {
  391. printf("Result run=%d: fail\n", i);
  392. }
  393. }
  394. printf("Result summary: success/total=%d/%d", j, ResultRuns);
  395. if (ResultRuns > 0)
  396. {
  397. printf(" (%f)", (float)j / (float)ResultRuns);
  398. }
  399. if (NumMazes > 0)
  400. {
  401. for (i = j = 0; i < NumMazes; i++)
  402. {
  403. maze = GeneralizationMazes[i];
  404. j += (int)maze->path.size();
  405. }
  406. printf("; average maze path length=%f; discrimination maze path length=%d",
  407. (float)j / (float)NumMazes, (int)DiscriminationMaze->path.size());
  408. }
  409. printf("\n");
  410. return(0);
  411. }