Advertisement
migonne

dziala ale tak se

Feb 20th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <windows.h>
  5. #include <time.h>
  6. #include <fstream>
  7. #include <string>
  8. #include <sstream>
  9. #include <vector>
  10. #include <algorithm>
  11. #include <iomanip>
  12.  
  13.  
  14. using namespace std;
  15.  
  16. struct Wierzcholek
  17. {
  18. string sek_wierzch; //fragment z sekwencji, ktory jest wierzcholkiem
  19. int pozycja; // pozycja wierzcholka w sekwencji
  20. vector<int> jakosc; // qual
  21. int nrsek; //sekwencja, z ktorej pochodzi podciag
  22. //int stwierzch; //stopien wierzcholka;
  23.  
  24. };
  25.  
  26.  
  27. int okno; //przykladowe wartosci
  28. int wiarygodnosc;
  29.  
  30. vector<string> sekwencja;
  31. vector<string> jakosc_sek;
  32. //vector<string> jakosci_wierzcholkow;//
  33. vector<Wierzcholek*> wierzcholki;
  34. vector<int> klika;
  35. vector<int> maxklika;
  36. vector< vector<int> > wektor_kliki;
  37. vector < vector < int > > polaczenia;
  38. //int **macierz_polaczenia2;
  39. vector < vector < int > > macierz_polaczenia;
  40. vector < int > stopnie;
  41.  
  42. void odczyt_pliku()
  43. {
  44. fstream fasta;
  45. fstream qual;
  46. string linia="";
  47. string linia2="";
  48.  
  49. fasta.open( "sample1.fasta");
  50.  
  51. if( fasta.good() == true )
  52. {
  53. cout<<"Uzyskano dostep do pliku fasta "<<endl;
  54.  
  55. while(getline(fasta,linia))
  56. {
  57. if(linia[0] != '>')
  58. {
  59. sekwencja.push_back(linia);
  60.  
  61. }
  62. }
  63. fasta.close();
  64.  
  65. }
  66. else cout << "Dostep do pliku fasta zostal zabroniony!" << endl;
  67.  
  68.  
  69.  
  70. qual.open( "sample1.qual");
  71.  
  72. if( qual.good() == true )
  73. {
  74. cout<<"Uzyskano dostep do pliku qual"<<endl;
  75.  
  76. while(getline(qual,linia2))
  77. {
  78. if(linia2[0] != '>')
  79. {
  80. jakosc_sek.push_back(linia2);
  81.  
  82. }
  83. }
  84. qual.close();
  85.  
  86. }
  87. else cout << "Dostep do pliku qual zostal zabroniony!" << endl;
  88.  
  89.  
  90.  
  91. }
  92.  
  93. void rozdzielacz_wierzcholki()
  94.  
  95. {
  96. for(int i = 0; i < sekwencja.size(); i++) //iterowanie po wektorze sekwencji (tzn po kazdym elemencie wektora, czyli po wszystkich jego sekwencjach)
  97. {
  98. string pomsek = sekwencja[i]; //zmienna pomocnicza, ktora jest aktualnie przetwarzana sekwencja
  99. int dlpomsek = pomsek.length()-1;
  100.  
  101. string s = jakosc_sek[i];
  102. vector<string> jakosc_sek_pom;
  103.  
  104. char delim=' ';
  105. std::stringstream ss(s);
  106. std::string token;
  107. while(std::getline(ss, token, delim))
  108. {
  109. jakosc_sek_pom.push_back(token);
  110. //cout<<token<<" ";
  111. }
  112.  
  113.  
  114. /*
  115. for(int i=0; i<jakosc_sek_pom.size();i++)
  116. {
  117. cout<<jakosc_sek_pom[i]<<" ";
  118. }
  119. */
  120.  
  121. //jakosc_sek[i];
  122.  
  123.  
  124. for(int j=0; j<=dlpomsek-okno+1;j++) //budowane na podstawie prototypowej funkcji rozdzielacz
  125. {
  126. Wierzcholek *wierzcholek = new Wierzcholek;
  127.  
  128. wierzcholek->sek_wierzch = pomsek.substr(j,okno); //podciag bedacy wierzcholkiem
  129. wierzcholek->pozycja = j; // pozycja wierzcholka w sekwencji
  130. wierzcholek->nrsek = i; //index sekwencji do ktorej nalezy wierzcholek
  131.  
  132. for(int k=j; k<(okno+j); k++)
  133. {
  134. int jksc = atoi( jakosc_sek_pom[k].c_str() );
  135. wierzcholek->jakosc.push_back(jksc);
  136. }
  137. wierzcholki.push_back(wierzcholek);
  138. }
  139. }
  140.  
  141.  
  142. }
  143.  
  144.  
  145. void wyswietl_wierzcholki()
  146. {
  147. for(int i=0; i<wierzcholki.size();i++)
  148. {
  149.  
  150. cout<<"wierzcholek "<<wierzcholki[i]->sek_wierzch<<" ";
  151. cout<<"pozycja "<<wierzcholki[i]->pozycja<<" ";
  152. cout<<"nr sekwencji "<<wierzcholki[i]->nrsek<<" ";
  153. //vector<int> pom=wierzcholki[i]->jakosc;
  154. cout<<"jakosc ";
  155. for(int j=0; j<okno;j++)
  156. {
  157. cout<<wierzcholki[i]->jakosc[j]<< " ";
  158. }
  159. //cout<<wierzcholki[i]->nrsek<<" ";
  160. cout<<endl;
  161.  
  162.  
  163. //cout<<wierzcholki[i]->sek_wierzch;
  164.  
  165.  
  166. }
  167. }
  168.  
  169.  
  170. void polacz()
  171. {
  172.  
  173. int delmax;
  174. //delmax=(okno/2)-1;
  175. if(delmax == 4)
  176. delmax = 1;
  177. if(delmax == 5 )
  178. delmax = 1;
  179. if(delmax == 6 )
  180. delmax = 2;
  181. if(delmax == 7 )
  182. delmax = 2;
  183.  
  184. macierz_polaczenia.resize(wierzcholki.size());
  185.  
  186. for(int i=0; i<wierzcholki.size(); i++)
  187. {
  188. macierz_polaczenia[i].resize(wierzcholki.size());
  189. }
  190.  
  191. for (int i=0; i<wierzcholki.size(); i++)
  192. {
  193. for (int j=0; j<wierzcholki.size(); j++)
  194. {
  195. macierz_polaczenia[i][j]=0;
  196. }
  197. }
  198.  
  199.  
  200.  
  201.  
  202. for(int i=0; i<wierzcholki.size(); i++)
  203. {
  204. for(int j=i+1; j<wierzcholki.size(); j++)
  205. {
  206. //sprawdzane czy sa z roznych sekwencji
  207. if(wierzcholki[i]->nrsek != wierzcholki[j]->nrsek) //jesli wierzcholki pochodza z roznych sekwencji
  208. {
  209. //jesli sekwencje sa takie same to logiczne, laczymy krawedzia nieskierowana
  210. if(wierzcholki[i]->sek_wierzch == wierzcholki[j]->sek_wierzch)
  211. {
  212. macierz_polaczenia[i][j]=1;
  213. macierz_polaczenia[j][i]=1;
  214. }
  215.  
  216. if(wierzcholki[i]->sek_wierzch != wierzcholki[j]->sek_wierzch)
  217. {
  218. int pom;
  219. pom=0;
  220.  
  221. string i_pomocnik=wierzcholki[i]->sek_wierzch;
  222. string j_pomocnik=wierzcholki[j]->sek_wierzch;
  223.  
  224.  
  225. for(int k=0; k<okno; k++)
  226. {
  227. if(wierzcholki[j]->jakosc[k] < wiarygodnosc) //gdy jakosc danego nukleotydu z podciagu (wierzcholka
  228. { // jest mniejsza niz nasza wiarygodnosc
  229. i_pomocnik.erase(pom,1); //usuwam nukleotyd na pozycji pom
  230. }
  231. else{pom++;}; // jest mniejsza niz nasza delmax
  232. }
  233.  
  234.  
  235. if(i_pomocnik.size() > delmax)
  236. {
  237. if(wierzcholki[j]->sek_wierzch.find(i_pomocnik) != string::npos)
  238. {
  239. macierz_polaczenia[i][j]=1;
  240. macierz_polaczenia[j][i]=1;
  241. }
  242. }
  243.  
  244.  
  245. }
  246.  
  247.  
  248. }
  249. }
  250. }
  251.  
  252. }
  253.  
  254.  
  255.  
  256. void stopnie_wierzcholkow()
  257. {
  258. /*
  259. int st=0;
  260. for(int i=0; i<wierzcholki.size(); i++)
  261. {
  262. for(int j=0; j<wierzcholki.size(); j++)
  263. {
  264. st=macierz_polaczenia[i][j]+st;
  265. }
  266. wierzcholki[i]->stwierzch = st;
  267. st=0;
  268. }
  269.  
  270. */
  271. for(int i=0; i<wierzcholki.size(); i++)
  272. stopnie.push_back(0);
  273.  
  274. for(int i=0; i<wierzcholki.size(); i++)
  275. {
  276. for(int j=0; j<wierzcholki.size(); j++)
  277. {
  278. if(macierz_polaczenia[i][j]==1)
  279. {
  280. stopnie[i]++;
  281. }
  282. }
  283. }
  284.  
  285.  
  286.  
  287. for(int i=0; i<stopnie.size(); i++)
  288. {
  289. cout<<stopnie[i]<<" ";
  290. }
  291.  
  292.  
  293. }
  294.  
  295.  
  296. vector<int> sasiedzi_wierzcholka(int index_wierzch) // znajduje sasiadow danego wierzcholka i zwraca ich vektor
  297. {
  298. vector <int> sasiedzi_wierzcholka;
  299. for(int i = 0; i < wierzcholki.size(); i++)
  300. {
  301. if(macierz_polaczenia[index_wierzch][i] == 1)
  302. {
  303. sasiedzi_wierzcholka.push_back(i);
  304. }
  305. }
  306. return sasiedzi_wierzcholka;
  307. }
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315. int wierzcholek_naj_stopien(vector<int> wyb_sasiedzi) // znajduje wierzcholek o najwyzszym stopniu
  316. {
  317. int najst_wierzch=0;
  318. int najst=0;
  319. int dany_sasiad_index;
  320.  
  321. for (int i = 0; i < i<wyb_sasiedzi.size(); i++)
  322. {
  323. dany_sasiad_index = wyb_sasiedzi[i];
  324. if(stopnie[dany_sasiad_index] > najst)
  325. {
  326. najst = stopnie[dany_sasiad_index];
  327. najst_wierzch = dany_sasiad_index;
  328. }
  329. }
  330. return najst_wierzch;
  331. }
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339. vector<int> najsasiedzi_wierzcholka(int iwierzch, int st) //sasiedzi wierzcholka o najwyzszym stopniu
  340. {
  341. vector <int> sasiedzi_najstwierzch;
  342.  
  343. for(int i = 0; i < wierzcholki.size(); i++)
  344. {
  345. if(macierz_polaczenia[iwierzch][i] == 1 && stopnie[i] >= st)
  346. {
  347. sasiedzi_najstwierzch.push_back(i);
  348. }
  349. }
  350. return sasiedzi_najstwierzch;
  351. }
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358. vector<int>wspolni_sasiedzi(vector<int> _wyb_sasiedzi, vector<int> _sasiedzi_najstwierzch)
  359. {
  360. vector<int> wsp_sasiedzi;
  361. sort(_wyb_sasiedzi.begin(), _wyb_sasiedzi.end());
  362. sort(_sasiedzi_najstwierzch.begin(), _sasiedzi_najstwierzch.end());
  363.  
  364. set_intersection(_wyb_sasiedzi.begin(), _wyb_sasiedzi.end(), _sasiedzi_najstwierzch.begin(), _sasiedzi_najstwierzch.end(), back_inserter(wsp_sasiedzi));
  365.  
  366. return wsp_sasiedzi;
  367. }
  368.  
  369.  
  370.  
  371. vector<int> &clique_heu(vector<int> &mozliwe_do_kliki, vector<int> &sasiedzi, int roz, int &max)
  372. {
  373. if (sasiedzi.empty()) //warunek zakonczenia rekurencji
  374. {
  375. if (roz > max)
  376. return mozliwe_do_kliki;
  377. }
  378.  
  379.  
  380. int wierzch_o_naj_st = wierzcholek_naj_stopien(sasiedzi); //szukanie sasiada o najwyzszym stopniu
  381. mozliwe_do_kliki.push_back(wierzch_o_naj_st); //i dodajemy go do kliki
  382.  
  383. for (int i = 0; i < sasiedzi.size(); i++) // usuwanie wierzchołka o najwyższym stopniu
  384. {
  385. if (sasiedzi[i] == wierzch_o_naj_st)
  386. sasiedzi.erase(sasiedzi.begin()+i); //usuwamy go z wektora sasiedzi
  387. }
  388.  
  389.  
  390. vector<int> sasiedzi_wierzch_o_naj_st = najsasiedzi_wierzcholka(wierzch_o_naj_st, max);
  391. vector<int> wsp_sasiedzi = wspolni_sasiedzi(sasiedzi, sasiedzi_wierzch_o_naj_st);
  392.  
  393. clique_heu(mozliwe_do_kliki, wsp_sasiedzi, roz + 1, max);
  394.  
  395. return mozliwe_do_kliki;
  396.  
  397. }
  398.  
  399.  
  400. vector<int> max_clique_heu(int max)
  401. {
  402. vector<int> mozliwe_do_kliki;
  403.  
  404. for (int i = 0; i < wierzcholki.size(); i++)
  405. {
  406. mozliwe_do_kliki.push_back(i);
  407.  
  408. if (stopnie[i] >= max)
  409. {
  410. vector<int> wyb_sasiedzi;
  411. vector<int> sasiedzi = sasiedzi_wierzcholka(i); //szuka sasiadow badanego wierzcholka i dodaje go do wektora
  412. cout<<"TEST MAX CLIQUE "<<endl;
  413. for (int j = 0; j < sasiedzi.size(); j++)
  414. {
  415. int tmp = sasiedzi[j]; //indeks sasiada
  416.  
  417. if (stopnie[tmp] >= max)
  418. wyb_sasiedzi.push_back(tmp);
  419. }
  420.  
  421. if(!wyb_sasiedzi.empty())
  422. klika= clique_heu(mozliwe_do_kliki, wyb_sasiedzi, 1, max);
  423.  
  424. if(klika.size() > maxklika.size())
  425. {
  426. wektor_kliki.push_back(klika);
  427. maxklika = klika;
  428. }
  429.  
  430. }
  431. mozliwe_do_kliki.clear();
  432. }
  433. }
  434.  
  435.  
  436.  
  437. void lewo2(vector <vector <int> > &wektor_kliki) //poszerzanie w lewo
  438. {
  439. for(int i = 0; i < wektor_kliki[0].size(); i++)
  440. {
  441. if(wektor_kliki[0][i] == 0)
  442. return;
  443. if(wierzcholki[wektor_kliki[0][i]]->nrsek != wierzcholki[wektor_kliki[0][i]-1]->nrsek)
  444. return;
  445.  
  446. for(int j = i+1; j < wektor_kliki[0].size(); j++)
  447. {
  448. if(macierz_polaczenia[wektor_kliki[0][i]-1][wektor_kliki[0][j]-1] != 1)
  449. return;
  450. }
  451. }
  452. vector <int> tmp;
  453. for(int i =0; i < wektor_kliki[0].size(); i++)
  454. {
  455. tmp.push_back(wektor_kliki[0][i]-1);
  456. }
  457.  
  458. wektor_kliki.insert(wektor_kliki.begin(), tmp);
  459. lewo2(wektor_kliki);
  460. return;
  461. }
  462.  
  463.  
  464. void prawo2(vector <vector <int> > &wektor_kliki)
  465. {
  466.  
  467. for(int i = 0; i < wektor_kliki[wektor_kliki.size()-1].size(); i++)
  468. {
  469.  
  470. if(wektor_kliki[wektor_kliki.size()-1][i] == wierzcholki.size()-1)
  471. return;
  472. if(wierzcholki[wektor_kliki[wektor_kliki.size()-1][i]]->nrsek != wierzcholki[wektor_kliki[wektor_kliki.size()-1][i]+1]->nrsek)
  473. return;
  474.  
  475. for(int j = i+1; j < wektor_kliki[wektor_kliki.size()-1].size(); j++)
  476. {
  477. if(macierz_polaczenia[wektor_kliki[wektor_kliki.size()-1][i]+1][wektor_kliki[wektor_kliki.size()-1][j]+1] !=1)
  478. return;
  479. }
  480. }
  481. vector <int> tmp;
  482. for(int i =0; i < wektor_kliki[wektor_kliki.size()-1].size(); i++)
  483. {
  484. tmp.push_back(wektor_kliki[wektor_kliki.size()-1][i]+1);
  485. }
  486. wektor_kliki.push_back(tmp);
  487. prawo2(wektor_kliki);
  488. return;
  489. }
  490.  
  491.  
  492.  
  493. void wypisz (vector <vector <int> > &wektor_kliki )
  494. {
  495. int nr_sekwencji = 0;
  496. int poczatek = 0;
  497. int koniec = 0;
  498. int dlugosc = 0;
  499. //cout << wektor_kliki.size() << endl;
  500. // cout << endl << endl;
  501.  
  502.  
  503. for(int j = 0; j < wektor_kliki[0].size(); j++)
  504. {
  505. nr_sekwencji = wierzcholki[wektor_kliki[0][j]]->nrsek;
  506. cout << "W sekwencji nr " << nr_sekwencji << ": ";
  507. // cout << instancja.m_sekwencje[nr_sekwencji]->m_nukleotydy << endl;
  508. poczatek = wierzcholki[wektor_kliki[0][j]]->pozycja;
  509. koniec = wierzcholki[wektor_kliki[wektor_kliki.size()-1][j]]->pozycja + okno-1;
  510. cout << "Start " << poczatek << " Koniec " << koniec << ": ";
  511. dlugosc = koniec - poczatek +1;
  512. cout << sekwencja[nr_sekwencji].substr(poczatek, dlugosc) << endl;
  513. }
  514. }
  515.  
  516.  
  517.  
  518.  
  519.  
  520. int main()
  521. {
  522.  
  523.  
  524. cout << "Dlugosc okna (4-7): ";
  525. cin >> okno;
  526. while(1){
  527. if(okno < 4 || okno > 7){
  528. cout << "Wartosc nie nalezy do zakresu. Prosze podac prawidlowa wartosc: ";
  529. cin >> okno;
  530. }else{
  531. break;
  532. }
  533. }
  534.  
  535. cout << "Wiarygodnosc (wartosc ponizej ktorej nukleotyd moze ulegac delecji (0-40): ";
  536. cin >> wiarygodnosc;
  537.  
  538. while(1){
  539. if(wiarygodnosc > 40 || wiarygodnosc<0){
  540. cout << "Wartosc nie nalezy do zakresu. Prosze podac prawidlowa wartosc: ";
  541. cin >> wiarygodnosc;
  542. }else{
  543. break;
  544. }
  545. }
  546.  
  547. cout<<endl;
  548. odczyt_pliku();
  549. cout<<endl;
  550. cout<<"Rozmiar wektora sekwencje: "<<sekwencja.size()<<endl;
  551. cout<<endl;
  552. cout<<"test1"<<endl;
  553. rozdzielacz_wierzcholki();
  554.  
  555.  
  556.  
  557. for(int i=0; i<wierzcholki.size();i++)
  558. {
  559.  
  560. cout<<"wierzcholek "<<wierzcholki[i]->sek_wierzch<<" ";
  561. cout<<"pozycja "<<wierzcholki[i]->pozycja<<" ";
  562. cout<<"nr sekwencji "<<wierzcholki[i]->nrsek<<" ";
  563. //vector<int> pom=wierzcholki[i]->jakosc;
  564. cout<<"jakosc ";
  565. for(int j=0; j<okno;j++)
  566. {
  567. cout<<wierzcholki[i]->jakosc[j]<< " ";
  568. }
  569. //cout<<wierzcholki[i]->nrsek<<" ";
  570. cout<<endl;
  571.  
  572.  
  573. //cout<<wierzcholki[i]->sek_wierzch;
  574.  
  575. }
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582. cout<<endl;
  583. cout<<"test2"<<endl;
  584. polacz();
  585. cout<<"test3"<<endl;
  586. stopnie_wierzcholkow();
  587.  
  588. //cout<<"stopnie size " <<stopnie.size()<<endl;
  589. //cout<<"wierzcholki " <<wierzcholki.size()<<endl;
  590. // cout<<"test4"<<endl;
  591.  
  592. // /*
  593.  
  594. max_clique_heu(3);
  595.  
  596. cout<<endl;
  597.  
  598. sort(maxklika.begin(), maxklika.end());
  599. wektor_kliki.push_back(maxklika);
  600.  
  601. lewo2(wektor_kliki);
  602. prawo2(wektor_kliki);
  603. wypisz(wektor_kliki);
  604.  
  605.  
  606. // */
  607.  
  608. return 0;
  609.  
  610. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement