SpaceQuester

Untitled

Apr 21st, 2017
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.74 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include "math.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <locale.h>
  6. #include <time.h>
  7. #include <stdbool.h>
  8.  
  9. #define N 15*15*2 // должно быть таким, что бы из этого числа, разделенного на два, извлекался корень
  10. #define NHalf N / 2
  11. #define WireWidth (int)sqrt(NHalf) // число осциляторов в строке/столбце одного слоя
  12. //#define K 1
  13.  
  14. const double omega_rand_glial_min = 0;
  15. const double omega_rand_glial_max = 1;
  16.  
  17. const double omega_rand_neuron_min = 3;
  18. const double omega_rand_neuron_max = 4;
  19.  
  20. const double theta_rand_min = 0;
  21. const double theta_rand_max = 2 * M_PI;
  22.  
  23. const double sigma_G = 0.500;
  24. const double sigma_GN = 0.000;
  25. const double sigma_N = 0.500;
  26.  
  27. double** A;
  28. double** B;
  29. double* C;
  30. double* omega;
  31. double* theta;
  32. double** sigma;
  33.  
  34. double sinux_x[N];
  35. double cosinus_x[N];
  36. double sinus_y[N];
  37. double cosinus_y[N];
  38.  
  39. int RandomI(int min, int max)
  40. {
  41. return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  42. }
  43.  
  44. double RandomD(double min, double max)
  45. {
  46. return ((double)rand() / RAND_MAX) * (max - min) + min;
  47. }
  48.  
  49. /*double kuramoto(int i, double theta[N]) // Без отпимизации
  50. {
  51. double sum = 0;
  52.  
  53. for (int j = 0; j < N; j++)
  54. {
  55. sum += A[i][j] * sin(theta[j] - theta[i]);
  56. }
  57.  
  58. return omega[i] + (double)sigma[i] * sum;
  59. }*/
  60.  
  61. /*double kuramoto(int i, double theta[N]) // С оптимизацией 1
  62. {
  63. double sum = 0;
  64.  
  65. for (int j = 0; j < C[i]; j++)
  66. {
  67. sum += sigma[i][(int)B[i][j]] * sin(theta[(int)B[i][j]] - theta[i]);
  68. }
  69.  
  70. return omega[i] + sum;
  71. }*/
  72.  
  73. double kuramoto(int i, double theta[N]) // С оптимизацией 2
  74. {
  75. double sum = 0;
  76. for (int j = 0; j < C[i]; j++)
  77. {
  78. sinux_x[j] = sin(theta[(int)B[i][j]]);
  79. cosinus_x[j] = cos(theta[(int)B[i][j]]);
  80. sinus_y[j] = sin(theta[i]);
  81. cosinus_y[j] = cos(theta[i]);
  82. }
  83.  
  84. for (int j = 0; j < C[i]; j++)
  85. {
  86. sum += sigma[i][(int)B[i][j]] * ( sinux_x[j] * cosinus_y[j] - cosinus_x[j] * sinus_y[j] );
  87. }
  88.  
  89. return omega[i] + sum;
  90. }
  91.  
  92. void RungeKutta(double dt, double theta[N], double theta_next[N])
  93. {
  94. double k[N][4];
  95.  
  96. // k1
  97. for (int i = 0; i < N; i++)
  98. k[i][0] = kuramoto(i, theta) * dt;
  99.  
  100. double theta_k1[N];
  101. for (int i = 0; i < N; i++)
  102. theta_k1[i] = theta[i] + k[i][0] / 2;
  103.  
  104. // k2
  105. for (int i = 0; i < N; i++)
  106. k[i][1] = kuramoto(i, theta_k1) * dt;
  107.  
  108. double theta_k2[N];
  109. for (int i = 0; i < N; i++)
  110. theta_k2[i] = theta[i] + k[i][1] / 2;
  111.  
  112. // k3
  113. for (int i = 0; i < N; i++)
  114. k[i][2] = kuramoto(i, theta_k2) * dt;
  115.  
  116. double theta_k3[N];
  117. for (int i = 0; i < N; i++)
  118. theta_k3[i] = theta[i] + k[i][2] / 2;
  119.  
  120. // k4
  121. for (int i = 0; i < N; i++)
  122. k[i][3] = kuramoto(i, theta_k3) * dt;
  123.  
  124. for (int i = 0; i < N; i++)
  125. theta_next[i] = theta[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  126. }
  127.  
  128. void CopyArray(double source[N], double target[N])
  129. {
  130. for (int i = 0; i < N; i++)
  131. target[i] = source[i];
  132. }
  133.  
  134. bool CheckSameLine(int i, int j)
  135. {
  136. return i / WireWidth == j / WireWidth;
  137. }
  138.  
  139. bool IsWireNeighbors(int i, int j)
  140. {
  141. if (CheckSameLine(i, j) && (i == j - 1 || i == j + 1))
  142. return true;
  143.  
  144. if (i == j - WireWidth || i == j + WireWidth)
  145. return true;
  146.  
  147. return false;
  148. }
  149.  
  150. void FillWireMatrix()
  151. {
  152. for (int i = 0; i < NHalf; i++)
  153. {
  154. for (int j = 0; j < NHalf; j++)
  155. {
  156. if (i == j)
  157. {
  158. A[i][j] = 0;
  159. continue;
  160. }
  161.  
  162. if (i > j)
  163. {
  164. A[i][j] = A[j][i];
  165. continue;
  166. }
  167.  
  168. A[i][j] = IsWireNeighbors(i, j) ? 1 : 0;
  169. }
  170. }
  171. }
  172.  
  173. void FillRandomMatrix()
  174. {
  175. for (int k = 0; k < N; k++)
  176. {
  177. int i, j;
  178.  
  179. do
  180. {
  181. i = RandomI(NHalf, N);
  182. j = RandomI(NHalf, N);
  183. } while (i == j);
  184.  
  185. A[i][j] = 1;
  186. A[j][i] = 1;
  187. }
  188. }
  189.  
  190. void Connect(int i, int j)
  191. {
  192. A[i][j] = 1;
  193. A[j][i] = 1;
  194. }
  195.  
  196. void FillLayerConnectionMatrix()
  197. {
  198. //int min = 0;
  199. //int max = NHalf;
  200. //int layerOffset = NHalf;
  201.  
  202. int min = NHalf;
  203. int max = N;
  204. int layerOffset = -NHalf;
  205.  
  206. for (int i = min; i < max; i++)
  207. {
  208. int nextLayerIndex = i + layerOffset;
  209. Connect(i, nextLayerIndex);
  210.  
  211. int leftIndex = i - 1;
  212. if (leftIndex >= min && CheckSameLine(leftIndex, i))
  213. Connect(leftIndex, nextLayerIndex);
  214.  
  215. int rightIndex = i + 1;
  216. if (rightIndex < max && CheckSameLine(rightIndex, i))
  217. Connect(rightIndex, nextLayerIndex);
  218.  
  219. int upIndex = i - WireWidth;
  220. if (upIndex >= min)
  221. Connect(upIndex, nextLayerIndex);
  222.  
  223. int downIndex = i + WireWidth;
  224. if (downIndex < max)
  225. Connect(downIndex, nextLayerIndex);
  226. }
  227. }
  228.  
  229. void FillFullNetworkNeuronMatrix()
  230. {
  231. for (int i = NHalf; i < N; i++)
  232. {
  233. for (int j = NHalf; j < N; j++)
  234. {
  235. A[i][j] = 1;
  236. if (i == j)
  237. {
  238. A[i][j] = 0;
  239. }
  240. }
  241. }
  242. }
  243.  
  244. void FillsigmaMatrix()
  245. {
  246. for (int i = 0; i < N; i++)
  247. {
  248. for (int j = 0; j < N; j++)
  249. {
  250. if ((i >= 0 && i <= NHalf) && (j >= 0 || j <= NHalf))
  251. {
  252. sigma[i][j] = sigma_G;
  253. }
  254. if ((((i > NHalf && i <= N) && (j >= 0 && j <= NHalf)) || ((i >= 0 && i <= NHalf) && (j > NHalf && j <= N))))
  255. {
  256. sigma[i][j] = sigma_GN;
  257. }
  258. if ((i > NHalf && i <= N) && (j > NHalf && j <= N))
  259. {
  260. sigma[i][j] = sigma_N;
  261. }
  262. }
  263. }
  264. }
  265.  
  266. bool Approximately(double a, double b)
  267. {
  268. if (a < 0)
  269. a = -a;
  270.  
  271. if (b < 0)
  272. b = -b;
  273.  
  274. return a - b <= 0.000001;
  275. }
  276.  
  277. void FillBCMatrix()
  278. {
  279. for (int i = 0; i < N; i++)
  280. {
  281. int bIndex = 0;
  282. C[i] = 0;
  283. for (int j = 0; j < N; j++)
  284. {
  285. if (A[i][j] == 1)
  286. {
  287. B[i][bIndex] = j;
  288. bIndex++;
  289. C[i]++;
  290. }
  291. }
  292. }
  293. }
  294.  
  295. int main()
  296. {
  297. FILE *fp0;
  298. srand(time(NULL));
  299.  
  300. A = malloc(N * sizeof(double));
  301. for (int i = 0; i < N; i++)
  302. A[i] = malloc(N * sizeof(double));
  303.  
  304. B = malloc(N * sizeof(double));
  305. for (int i = 0; i < N; i++)
  306. B[i] = malloc(N * sizeof(double));
  307.  
  308. C = malloc(N * sizeof(double));
  309.  
  310. sigma = malloc(N * sizeof(double));
  311. for (int i = 0; i < N; i++)
  312. sigma[i] = malloc(N * sizeof(double));
  313.  
  314. omega = malloc(N * sizeof(double));
  315.  
  316. theta = malloc(N * sizeof(double));
  317.  
  318. // omega_init open for write. begin
  319. for (int i = 0; i < NHalf; i++)
  320. omega[i] = RandomD(omega_rand_glial_min, omega_rand_glial_max);
  321.  
  322. for (int i = NHalf; i < N; i++)
  323. omega[i] = RandomD(omega_rand_neuron_min, omega_rand_neuron_max);
  324.  
  325. fp0 = fopen("omega_init.txt", "w+");
  326. for (int i = 0; i < N; i++)
  327. {
  328. fprintf(fp0, "%f\n", omega[i]);
  329. }
  330. fclose(fp0);
  331. // omega_init open for write. end
  332.  
  333. // omega_init open for read. begin
  334. /*fp0 = fopen("omega_init.txt", "r");
  335. for (int i = 0; i < N; i++)
  336. {
  337. fscanf(fp0, "%lf", &omega[i]);
  338. }*/
  339. // omega_init open for read. end
  340.  
  341. // theta_init open for write. begin
  342. for (int i = 0; i < N; i++)
  343. theta[i] = RandomD(theta_rand_min, theta_rand_max);
  344.  
  345. fp0 = fopen("theta_init.txt", "w+");
  346. for (int i = 0; i < N; i++)
  347. {
  348. fprintf(fp0, "%f\n", theta[i]);
  349. }
  350. fclose(fp0);
  351. // theta_init open for write.end
  352.  
  353. // theta_init open for read. begin
  354. /*fp0 = fopen("theta_init.txt", "r");
  355. for (int i = 0; i < N; i++)
  356. {
  357. fscanf(fp0, "%lf", &theta[i]);
  358. }
  359. fclose(fp0);*/
  360. // theta_init open for read.end
  361.  
  362. fp0 = fopen("A.txt", "w+");
  363.  
  364. FillWireMatrix();
  365. FillRandomMatrix();
  366. //FillFullNetworkNeuronMatrix();
  367. FillLayerConnectionMatrix();
  368. FillBCMatrix();
  369.  
  370. for (int i = 0; i < N; i++)
  371. {
  372. for (int j = 0; j < N; j++)
  373. {
  374. /*printf("i: %d\n", i);
  375. printf("j: %d\n", j);
  376. printf("A: %d\n", A[i][j]);*/
  377. fprintf(fp0, "%d\t", (int)A[i][j]);
  378. }
  379. fprintf(fp0, "\n");
  380. }
  381. fclose(fp0);
  382.  
  383. fp0 = fopen("B.txt", "w+");
  384.  
  385. for (int i = 0; i < N; i++)
  386. {
  387. for (int j = 0; j < C[i]; j++)
  388. {
  389. fprintf(fp0, "%d\t", (int)B[i][j]);
  390. }
  391. fprintf(fp0, "\n");
  392. }
  393.  
  394. fclose(fp0);
  395.  
  396. fp0 = fopen("C.txt", "w+");
  397.  
  398. for (int i = 0; i < N; i++)
  399. {
  400. fprintf(fp0, "%d\n", (int)C[i]);
  401. }
  402.  
  403. fclose(fp0);
  404.  
  405. FillsigmaMatrix();
  406.  
  407. fp0 = fopen("sigma.txt", "w+");
  408. for (int i = 0; i < N; i++)
  409. {
  410. for (int j = 0; j < N; j++)
  411. {
  412. fprintf(fp0, "%f\t", sigma[i][j]);
  413. }
  414. fprintf(fp0, "\n");
  415. }
  416.  
  417. fclose(fp0);
  418.  
  419. //Пишем в файл число связей у каждого осциллятора в четвертом квадранте
  420. fp0 = fopen("links.txt", "w+");
  421. for (int i = NHalf; i < N; i++)
  422. {
  423. int links_count = 0;
  424. for (int j = NHalf; j < N; j++)
  425. {
  426. if (A[i][j] == 1)
  427. {
  428. links_count++;
  429. }
  430. }
  431. fprintf(fp0, "%d\n", (int)links_count);
  432.  
  433. }
  434. fclose(fp0);
  435.  
  436. const double t_start = 0;
  437. const double t_max = 2000; //2000
  438. const double dt = 0.05; //0.05
  439.  
  440. double t = t_start;
  441.  
  442. fp0 = fopen("results.txt", "w+");
  443. //setlocale(LC_NUMERIC, "French_Canada.1252");
  444.  
  445. clock_t start_rk4, end_rk4;
  446. start_rk4 = clock();
  447. int lastPercent = -1;
  448.  
  449. while (t < t_max || Approximately(t, t_max))
  450. {
  451. fprintf(fp0, "%f\t", t);
  452. for (int i = 0; i < N; i++)
  453. {
  454. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", theta[i]);
  455. }
  456. fprintf(fp0, "\n");
  457.  
  458. double theta_next[N];
  459.  
  460. RungeKutta(dt, theta, theta_next);
  461. CopyArray(theta_next, theta);
  462.  
  463. t += dt;
  464.  
  465. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  466. if (percent != lastPercent)
  467. {
  468. printf("Progress: %d%%\n", percent);
  469. lastPercent = percent;
  470. }
  471. }
  472.  
  473. end_rk4 = clock();
  474. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  475. int minutes = (int)extime_rk4 / 60;
  476. int seconds = (int)extime_rk4 % 60;
  477. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  478.  
  479. fclose(fp0);
  480.  
  481. fp0 = fopen("time_exec.txt", "w+");
  482. fprintf(fp0, "%f\n", extime_rk4);
  483. fclose(fp0);
  484.  
  485. for (int i = 0; i < N; i++)
  486. free(A[i]);
  487. free(A);
  488.  
  489. for (int i = 0; i < N; i++)
  490. free(B[i]);
  491. free(B);
  492.  
  493. for (int i = 0; i < N; i++)
  494. free(sigma[i]);
  495. free(sigma);
  496.  
  497. free(C);
  498.  
  499. free(omega);
  500.  
  501. free(theta);
  502.  
  503. }
Advertisement
Add Comment
Please, Sign In to add comment