SpaceQuester

Untitled

Jul 31st, 2018
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.26 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 10*10*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.5;
  15. const double omega_rand_glial_max = 1.5;
  16.  
  17. const double omega_rand_neuron_min = 9.5;
  18. const double omega_rand_neuron_max = 10.5;
  19.  
  20. const double theta_rand_min = 0;
  21. const double theta_rand_max = 2 * M_PI;
  22.  
  23. double sigma_G;
  24. double sigma_GN;
  25. double sigma_N;
  26.  
  27. double sigma_G_1;
  28. double sigma_N_1;
  29.  
  30. double** A;
  31. double** B;
  32. double* C;
  33. double* omega;
  34. double* theta;
  35. double** sigma;
  36.  
  37. double p = 0.5; // 0.1
  38.  
  39. /*double sinux_x[N];
  40. double cosinus_x[N];
  41. double sinus_y[N];
  42. double cosinus_y[N];*/
  43.  
  44. // возвращает целое случайное число в интервале от min до max включительно
  45. int RandomI(int min, int max)
  46. {
  47. return round(((double)rand() / (RAND_MAX)) * (max - min) + min);
  48. }
  49.  
  50. double RandomD(double min, double max)
  51. {
  52. return ((double)rand() / RAND_MAX) * (max - min) + min;
  53. }
  54.  
  55. /*double kuramoto(int i, double theta[N]) // Без оптимизации
  56. {
  57. double sum = 0;
  58.  
  59. for (int j = 0; j < N; j++)
  60. {
  61. sum += A[i][j] * sin(theta[j] - theta[i]);
  62. }
  63.  
  64. return omega[i] + (double)sigma[i] * sum;
  65. }*/
  66.  
  67. double kuramoto(int i, double theta[N]) // С оптимизацией 1
  68. {
  69. double sum = 0;
  70.  
  71. for (int j = 0; j < C[i]; j++)
  72. {
  73. sum += sigma[i][(int)B[i][j]] * sin(theta[(int)B[i][j]] - theta[i]);
  74. }
  75.  
  76. return omega[i] + sum;
  77. }
  78.  
  79. /*double kuramoto(int i, double theta[N]) // С оптимизацией 2
  80. {
  81. double sum = 0;
  82. for (int j = 0; j < C[i]; j++)
  83. {
  84. sinux_x[j] = sin(theta[(int)B[i][j]]);
  85. cosinus_x[j] = cos(theta[(int)B[i][j]]);
  86. sinus_y[j] = sin(theta[i]);
  87. cosinus_y[j] = cos(theta[i]);
  88. }
  89.  
  90. for (int j = 0; j < C[i]; j++)
  91. {
  92. sum += sigma[i][(int)B[i][j]] * ( sinux_x[j] * cosinus_y[j] - cosinus_x[j] * sinus_y[j] );
  93. }
  94.  
  95. return omega[i] + sum;
  96. }*/
  97.  
  98. void RungeKutta(double dt, double theta[N], double theta_next[N])
  99. {
  100. double k[N][4];
  101.  
  102. // k1
  103. for (int i = 0; i < N; i++)
  104. k[i][0] = kuramoto(i, theta) * dt;
  105.  
  106. double theta_k1[N];
  107. for (int i = 0; i < N; i++)
  108. theta_k1[i] = theta[i] + k[i][0] / 2;
  109.  
  110. // k2
  111. for (int i = 0; i < N; i++)
  112. k[i][1] = kuramoto(i, theta_k1) * dt;
  113.  
  114. double theta_k2[N];
  115. for (int i = 0; i < N; i++)
  116. theta_k2[i] = theta[i] + k[i][1] / 2;
  117.  
  118. // k3
  119. for (int i = 0; i < N; i++)
  120. k[i][2] = kuramoto(i, theta_k2) * dt;
  121.  
  122. double theta_k3[N];
  123. for (int i = 0; i < N; i++)
  124. theta_k3[i] = theta[i] + k[i][2] / 2;
  125.  
  126. // k4
  127. for (int i = 0; i < N; i++)
  128. k[i][3] = kuramoto(i, theta_k3) * dt;
  129.  
  130. for (int i = 0; i < N; i++)
  131. theta_next[i] = theta[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  132. }
  133.  
  134. void CopyArray(double source[N], double target[N])
  135. {
  136. for (int i = 0; i < N; i++)
  137. target[i] = source[i];
  138. }
  139.  
  140. int GetLineIndex(int i)
  141. {
  142. return i / WireWidth;
  143. }
  144.  
  145. bool CheckSameLine(int i, int j)
  146. {
  147. return GetLineIndex(i) == GetLineIndex(j);
  148. }
  149.  
  150. bool CheckAdjacentLine(int i, int j)
  151. {
  152. return abs(GetLineIndex(i) - GetLineIndex(j)) == 1;
  153. }
  154.  
  155. bool IsWireNeighbors(int i, int j)
  156. {
  157. if (CheckSameLine(i, j) && (i == j - 1 || i == j + 1))
  158. return true;
  159.  
  160. if (i == j - WireWidth || i == j + WireWidth)
  161. return true;
  162.  
  163. if (CheckAdjacentLine(i, j))
  164. {
  165. if (i == j - WireWidth - 1)
  166. return true;
  167.  
  168. if (i == j - WireWidth + 1)
  169. return true;
  170.  
  171. if (i == j + WireWidth - 1)
  172. return true;
  173.  
  174. if (i == j + WireWidth + 1)
  175. return true;
  176. }
  177.  
  178. return false;
  179. }
  180.  
  181. void FillAMatrixZero()
  182. {
  183. for (int i = 0; i < N; i++)
  184. {
  185. for (int j = 0; j < N; j++)
  186. {
  187. A[i][j] = 0;
  188. }
  189. }
  190. }
  191.  
  192. void FillGlialWireMatrix()
  193. {
  194. for (int i = 0; i < NHalf; i++)
  195. {
  196. for (int j = 0; j < NHalf; j++)
  197. {
  198. if (i == j)
  199. {
  200. A[i][j] = 0;
  201. continue;
  202. }
  203.  
  204. if (i > j)
  205. {
  206. A[i][j] = A[j][i];
  207. continue;
  208. }
  209.  
  210. A[i][j] = IsWireNeighbors(i, j) ? 1 : 0;
  211. }
  212. }
  213. }
  214.  
  215. void FillNetworkWireMatrix()
  216. {
  217. for (int i = NHalf; i < N; i++)
  218. {
  219. for (int j = NHalf; j < N; j++)
  220. {
  221. if (i == j)
  222. {
  223. A[i][j] = 0;
  224. continue;
  225. }
  226.  
  227. if (i > j)
  228. {
  229. A[i][j] = A[j][i];
  230. continue;
  231. }
  232.  
  233. A[i][j] = IsWireNeighbors(i, j) ? 1 : 0;
  234. }
  235. }
  236. }
  237.  
  238. void RandomizeWireMatrix()
  239. {
  240. srand(time(NULL));
  241.  
  242. for (int i = NHalf; i < N; i++)
  243. {
  244. if (i == N - NHalf / 2)
  245. srand(time(NULL));
  246.  
  247. for (int j = NHalf; j < N; j++)
  248. {
  249. if (A[i][j] == 0)
  250. continue;
  251.  
  252. if (i > j)
  253. continue;
  254.  
  255. double x = RandomD(0, 1);
  256.  
  257. if (x > p)
  258. continue;
  259.  
  260. int rndJ;
  261. int rndI;
  262.  
  263. do
  264. {
  265. rndJ = RandomI(NHalf, N - 1);
  266. rndI = RandomI(NHalf, N - 1);
  267. } while (rndJ == rndI || IsWireNeighbors(rndI, rndJ) || j == rndJ || i == rndI || A[rndI][rndJ] == 1);
  268.  
  269. A[i][j] = 0;
  270. A[j][i] = 0;
  271.  
  272. A[rndI][rndJ] = 1;
  273. A[rndJ][rndI] = 1;
  274. }
  275. }
  276. }
  277.  
  278. void FillRandomMatrix()
  279. {
  280. for (int k = 0; k < 4 * NHalf; k++)
  281. {
  282. int i, j;
  283.  
  284. do
  285. {
  286. i = RandomI(NHalf, N - 1);
  287. j = RandomI(NHalf, N - 1);
  288. } while ((i == j) || (A[i][j] == 1));
  289.  
  290. A[i][j] = 1;
  291. A[j][i] = 1;
  292. }
  293. }
  294.  
  295. void Connect(int i, int j)
  296. {
  297. A[i][j] = 1;
  298. A[j][i] = 1;
  299. }
  300.  
  301. void FillLayerConnectionMatrix()
  302. {
  303. //int min = 0;
  304. //int max = NHalf;
  305. //int layerOffset = NHalf;
  306.  
  307. int min = NHalf;
  308. int max = N;
  309. int layerOffset = -NHalf;
  310.  
  311. for (int i = min; i < max; i++)
  312. {
  313. int nextLayerIndex = i + layerOffset;
  314. Connect(i, nextLayerIndex);
  315.  
  316. int leftIndex = i - 1;
  317. if (leftIndex >= min && CheckSameLine(leftIndex, i))
  318. Connect(leftIndex, nextLayerIndex);
  319.  
  320. int rightIndex = i + 1;
  321. if (rightIndex < max && CheckSameLine(rightIndex, i))
  322. Connect(rightIndex, nextLayerIndex);
  323.  
  324. int upIndex = i - WireWidth;
  325. if (upIndex >= min)
  326. Connect(upIndex, nextLayerIndex);
  327.  
  328. int downIndex = i + WireWidth;
  329. if (downIndex < max)
  330. Connect(downIndex, nextLayerIndex);
  331.  
  332. int leftUpIndex = i - WireWidth - 1;
  333. if (leftUpIndex >= min && CheckAdjacentLine(leftUpIndex, i))
  334. Connect(leftUpIndex, nextLayerIndex);
  335.  
  336. int rightUpIndex = i - WireWidth + 1;
  337. if (rightUpIndex >= min && CheckAdjacentLine(rightUpIndex, i))
  338. Connect(rightUpIndex, nextLayerIndex);
  339.  
  340. int leftDownIndex = i + WireWidth - 1;
  341. if (leftDownIndex < max && CheckAdjacentLine(leftDownIndex, i))
  342. Connect(leftDownIndex, nextLayerIndex);
  343.  
  344. int rightDownIndex = i + WireWidth + 1;
  345. if (rightDownIndex < max && CheckAdjacentLine(rightDownIndex, i))
  346. Connect(rightDownIndex, nextLayerIndex);
  347. }
  348. }
  349.  
  350. void FillFullNetworkNeuronMatrix()
  351. {
  352. for (int i = NHalf; i < N; i++)
  353. {
  354. for (int j = NHalf; j < N; j++)
  355. {
  356. A[i][j] = 1;
  357. if (i == j)
  358. {
  359. A[i][j] = 0;
  360. }
  361. }
  362. }
  363. }
  364.  
  365. void FillsigmaMatrix()
  366. {
  367. for (int i = 0; i < N; i++)
  368. {
  369. for (int j = 0; j < N; j++)
  370. {
  371. if ((i >= 0 && i < NHalf) && (j >= 0 || j < NHalf))
  372. {
  373. sigma[i][j] = sigma_G;
  374. }
  375. if ((((i >= NHalf && i < N) && (j >= 0 && j < NHalf)) || ((i >= 0 && i < NHalf) && (j >= NHalf && j < N))))
  376. {
  377. sigma[i][j] = sigma_GN;
  378. }
  379. if ((i >= NHalf && i < N) && (j >= NHalf && j < N))
  380. {
  381. sigma[i][j] = sigma_N;
  382. }
  383. }
  384. }
  385. }
  386.  
  387. bool Approximately(double a, double b)
  388. {
  389. if (a < 0)
  390. a = -a;
  391.  
  392. if (b < 0)
  393. b = -b;
  394.  
  395. return a - b <= 0.000001;
  396. }
  397.  
  398. void FillBCMatrix()
  399. {
  400. for (int i = 0; i < N; i++)
  401. {
  402. int bIndex = 0;
  403. C[i] = 0;
  404. for (int j = 0; j < N; j++)
  405. {
  406. if (A[i][j] == 1)
  407. {
  408. B[i][bIndex] = j;
  409. bIndex++;
  410. C[i]++;
  411. }
  412. }
  413. }
  414. }
  415.  
  416. int main(int argc, char *argv[])
  417. {
  418. sscanf(argv[1], "%lf", &sigma_G_1);
  419. sscanf(argv[2], "%lf", &sigma_N_1);
  420.  
  421. sigma_G = sigma_G_1 / 17;
  422. sigma_GN = sigma_G;
  423. sigma_N = sigma_N_1 / 17;
  424.  
  425. FILE *fp0;
  426. srand(time(NULL));
  427.  
  428. A = malloc(N * sizeof(double));
  429. for (int i = 0; i < N; i++)
  430. A[i] = malloc(N * sizeof(double));
  431.  
  432. B = malloc(N * sizeof(double));
  433. for (int i = 0; i < N; i++)
  434. B[i] = malloc(N * sizeof(double));
  435.  
  436. C = malloc(N * sizeof(double));
  437.  
  438. sigma = malloc(N * sizeof(double));
  439. for (int i = 0; i < N; i++)
  440. sigma[i] = malloc(N * sizeof(double));
  441.  
  442. omega = malloc(N * sizeof(double));
  443.  
  444. theta = malloc(N * sizeof(double));
  445.  
  446. // omega_init open for write. begin
  447. for (int i = 0; i < NHalf; i++)
  448. omega[i] = RandomD(omega_rand_glial_min, omega_rand_glial_max);
  449.  
  450. for (int i = NHalf; i < N; i++)
  451. omega[i] = RandomD(omega_rand_neuron_min, omega_rand_neuron_max);
  452.  
  453. fp0 = fopen("omega_init.txt", "w+");
  454. for (int i = 0; i < N; i++)
  455. {
  456. fprintf(fp0, "%f\n", omega[i]);
  457. }
  458. fclose(fp0);
  459. // omega_init open for write. end
  460.  
  461. // omega_init open for read. begin
  462. /*fp0 = fopen("omega_init.txt", "r");
  463. for (int i = 0; i < N; i++)
  464. {
  465. fscanf(fp0, "%lf", &omega[i]);
  466. }*/
  467. // omega_init open for read. end
  468.  
  469. // theta_init open for write. begin
  470. for (int i = 0; i < N; i++)
  471. theta[i] = RandomD(theta_rand_min, theta_rand_max);
  472.  
  473. fp0 = fopen("theta_init.txt", "w+");
  474. for (int i = 0; i < N; i++)
  475. {
  476. fprintf(fp0, "%f\n", theta[i]);
  477. }
  478. fclose(fp0);
  479. // theta_init open for write.end
  480.  
  481. // theta_init open for read. begin
  482. /*fp0 = fopen("theta_init.txt", "r");
  483. for (int i = 0; i < N; i++)
  484. {
  485. fscanf(fp0, "%lf", &theta[i]);
  486. }
  487. fclose(fp0);*/
  488. // theta_init open for read.end
  489.  
  490. fp0 = fopen("A.txt", "w+");
  491.  
  492. FillAMatrixZero();
  493. FillGlialWireMatrix();
  494. FillNetworkWireMatrix();
  495. FillLayerConnectionMatrix();
  496. //FillRandomMatrix();
  497. RandomizeWireMatrix();
  498.  
  499. FillBCMatrix();
  500.  
  501. for (int i = 0; i < N; i++)
  502. {
  503. for (int j = 0; j < N; j++)
  504. {
  505. /*printf("i: %d\n", i);
  506. printf("j: %d\n", j);
  507. printf("A: %d\n", A[i][j]);*/
  508. fprintf(fp0, "%d\t", (int)A[i][j]);
  509. }
  510. fprintf(fp0, "\n");
  511. }
  512. fclose(fp0);
  513.  
  514. fp0 = fopen("B.txt", "w+");
  515.  
  516. for (int i = 0; i < N; i++)
  517. {
  518. for (int j = 0; j < C[i]; j++)
  519. {
  520. fprintf(fp0, "%d\t", (int)B[i][j]);
  521. }
  522. fprintf(fp0, "\n");
  523. }
  524.  
  525. fclose(fp0);
  526.  
  527. fp0 = fopen("C.txt", "w+");
  528.  
  529. for (int i = 0; i < N; i++)
  530. {
  531. fprintf(fp0, "%d\n", (int)C[i]);
  532. }
  533.  
  534. fclose(fp0);
  535.  
  536. FillsigmaMatrix();
  537.  
  538. fp0 = fopen("sigma.txt", "w+");
  539. for (int i = 0; i < N; i++)
  540. {
  541. for (int j = 0; j < N; j++)
  542. {
  543. fprintf(fp0, "%f\t", sigma[i][j]);
  544. }
  545. fprintf(fp0, "\n");
  546. }
  547.  
  548. fclose(fp0);
  549.  
  550. //Пишем в файл число связей у каждого осциллятора в четвертом квадранте
  551. fp0 = fopen("links.txt", "w+");
  552. for (int i = NHalf; i < N; i++)
  553. {
  554. int links_count = 0;
  555. for (int j = NHalf; j < N; j++)
  556. {
  557. if (A[i][j] == 1)
  558. {
  559. links_count++;
  560. }
  561. }
  562. fprintf(fp0, "%d\n", (int)links_count);
  563.  
  564. }
  565. fclose(fp0);
  566.  
  567. const double t_start = 0;
  568. const double t_max = 2000; //2000
  569. const double dt = 0.05; //0.05
  570.  
  571. double t = t_start;
  572.  
  573. fp0 = fopen("results.txt", "w+");
  574. //setlocale(LC_NUMERIC, "French_Canada.1252");
  575.  
  576. clock_t start_rk4, end_rk4;
  577. start_rk4 = clock();
  578. int lastPercent = -1;
  579.  
  580. while (t < t_max || Approximately(t, t_max))
  581. {
  582. fprintf(fp0, "%f\t", t);
  583. for (int i = 0; i < N; i++)
  584. {
  585. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", theta[i]);
  586. }
  587. fprintf(fp0, "\n");
  588.  
  589. double theta_next[N];
  590.  
  591. RungeKutta(dt, theta, theta_next);
  592. CopyArray(theta_next, theta);
  593.  
  594. t += dt;
  595.  
  596. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  597. if (percent != lastPercent)
  598. {
  599. printf("Progress: %d%%\n", percent);
  600. lastPercent = percent;
  601. }
  602. }
  603.  
  604. fp0 = fopen("s_G_s_N_Delta_rho.txt", "a");
  605. fprintf(fp0, "%f\t%f\t", sigma_G_1, sigma_N_1);
  606. fclose(fp0);
  607.  
  608. end_rk4 = clock();
  609. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  610. int minutes = (int)extime_rk4 / 60;
  611. int seconds = (int)extime_rk4 % 60;
  612. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  613.  
  614. fclose(fp0);
  615.  
  616. fp0 = fopen("time_exec.txt", "w+");
  617. fprintf(fp0, "%f\n", extime_rk4);
  618. fclose(fp0);
  619.  
  620. for (int i = 0; i < N; i++)
  621. free(A[i]);
  622. free(A);
  623.  
  624. for (int i = 0; i < N; i++)
  625. free(B[i]);
  626. free(B);
  627.  
  628. for (int i = 0; i < N; i++)
  629. free(sigma[i]);
  630. free(sigma);
  631.  
  632. free(C);
  633.  
  634. free(omega);
  635.  
  636. free(theta);
  637.  
  638. }
Advertisement
Add Comment
Please, Sign In to add comment