Advertisement
SpaceQuester

Untitled

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