diff --git a/.gitignore b/.gitignore index b2ccdef..db0551d 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,28 @@ app.*.map.json */android/app/debug */android/app/profile */android/app/release + +*.aux +*.glo +*.idx +*.log +*.toc +*.ist +*.acn +*.acr +*.alg +*.bbl +*.blg +*.dvi +*.glg +*.gls +*.ilg +*.ind +*.lof +*.lot +*.maf +*.mtc +*.mtc1 +*.out +*.synctex.gz +*/_minted-example-work/ \ No newline at end of file diff --git a/tex/example-work.aux b/tex/example-work.aux index 7940a1d..4baa12b 100644 --- a/tex/example-work.aux +++ b/tex/example-work.aux @@ -25,54 +25,63 @@ \citation{Algo_2013} \@writefile{toc}{\contentsline {section}{\numberline {1}\IeC {\CYRV }\IeC {\cyrv }\IeC {\cyre }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre }}{4}{section.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {1.1}\IeC {\CYRG }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyrery }}{4}{subsection.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}\IeC {\CYRO }\IeC {\cyrs }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrn }\IeC {\cyrery }\IeC {\cyre } \IeC {\cyro }\IeC {\cyrp }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya }}{4}{subsection.1.2}\protected@file@percent } \@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces \IeC {\CYRP }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrr } \IeC {\cyro }\IeC {\cyrr }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }\relax }}{4}{figure.caption.2}\protected@file@percent } \providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}} \newlabel{fig:orgrapf_example}{{1}{4}{Пример орграфа\relax }{figure.caption.2}{}} +\citation{intuit} \@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces \IeC {\CYRP }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrr } \IeC {\cyrn }\IeC {\cyre }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyri }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }\relax }}{5}{figure.caption.3}\protected@file@percent } \newlabel{fig:grapf_example}{{2}{5}{Пример неориентированного графа\relax }{figure.caption.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {2}\IeC {\CYRI }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrya } \IeC {\cyrs }\IeC {\cyro }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya } \IeC {\cyrya }\IeC {\cyrz }\IeC {\cyrery }\IeC {\cyrk }\IeC {\cyra } SQL}{6}{section.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}\IeC {\CYRS }\IeC {\cyro }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyri }}{6}{subsection.2.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}\IeC {\CYRE }\IeC {\cyrshch }\IeC {\cyre } \IeC {\cyrerev }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyri }\IeC {\cyrch }\IeC {\cyre }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrt }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyra }}{6}{subsection.2.2}\protected@file@percent } -\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces \IeC {\CYRN }\IeC {\cyre }\IeC {\cyrishrt }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrn }\relax }}{6}{figure.caption.4}\protected@file@percent } -\newlabel{neuron}{{3}{6}{Нейрон\relax }{figure.caption.4}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}\IeC {\CYRS }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyra } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyri }\IeC {\cyrch }\IeC {\cyre }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyri }\IeC {\cyrishrt } \IeC {\cyrt }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt }}{7}{subsection.2.3}\protected@file@percent } -\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces \IeC {\CYRA }\IeC {\cyrr }\IeC {\cyrh }\IeC {\cyri }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrt }\IeC {\cyru }\IeC {\cyrr }\IeC {\cyra } \IeC {\cyrm }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrl }\IeC {\cyro }\IeC {\cyrishrt }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrishrt } \IeC {\cyrs }\IeC {\cyre }\IeC {\cyrt }\IeC {\cyri } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyrya }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrr }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya }\relax }}{8}{figure.caption.5}\protected@file@percent } -\newlabel{net1}{{4}{8}{Архитектура многослойной сети прямого распространения\relax }{figure.caption.5}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces \IeC {\CYRP }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrr } \IeC {\cyrn }\IeC {\cyre }\IeC {\cyrishrt }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrn }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrishrt } \IeC {\cyrs }\IeC {\cyre }\IeC {\cyrt }\IeC {\cyri }\relax }}{8}{figure.caption.6}\protected@file@percent } -\newlabel{net2}{{5}{8}{Пример нейронной сети\relax }{figure.caption.6}{}} -\@writefile{toc}{\contentsline {section}{\numberline {3}\IeC {\CYRR }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl } \IeC {\cyrs } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyri }}{9}{section.3}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrf }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyrm }\IeC {\cyru }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyri } \IeC {\cyri } \IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrishrt }}{9}{subsection.3.1}\protected@file@percent } -\newlabel{eq:ex01}{{1}{9}{Текст с формулами и леммой}{equation.3.1}{}} -\newlabel{lem:1}{{1}{9}{}{lem.1}{}} -\newlabel{it:1lem1}{{{1}}{9}{}{Item.1}{}} -\newlabel{it:2lem1}{{{2}}{9}{}{Item.2}{}} -\newlabel{eq:ex02}{{2}{9}{}{equation.3.2}{}} -\newlabel{eq:ex03}{{3}{9}{Текст с формулами и леммой}{equation.3.3}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}\IeC {\CYRN }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrd }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyra }}{10}{subsection.3.2}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}\IeC {\CYRB }\IeC {\cyro }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyre } \IeC {\cyrm }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyrk }\IeC {\cyri }\IeC {\cyrishrt } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }}{10}{subsubsection.3.2.1}\protected@file@percent } -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrt }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyre }\IeC {\cyrishrt }}{10}{subsubsection.3.2.2}\protected@file@percent } -\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces \IeC {\CYRR }\IeC {\cyre }\IeC {\cyrz }\IeC {\cyru }\IeC {\cyrl }\IeC {\cyrsftsn }\IeC {\cyrt }\IeC {\cyra }\IeC {\cyrt } \IeC {\cyrs }\IeC {\cyro }\IeC {\cyrk }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrshch }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya } \IeC {\cyrs }\IeC {\cyrl }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrishrt } \IeC {\cyrn }\IeC {\cyre }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrp }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrv }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrishrt } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyri } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrshch }\IeC {\cyri } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrk }\relax }}{10}{table.caption.7}\protected@file@percent } -\newlabel{table-1}{{1}{10}{Результат сокращения словарей неисправностей при помощи масок\relax }{table.caption.7}{}} -\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.3}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrk }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyro }\IeC {\cyrm } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyrery }}{11}{subsubsection.3.2.3}\protected@file@percent } -\@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces \IeC {\CYRM }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs }\IeC {\cyri }\IeC {\cyrv }\IeC {\cyrery } \texttt {column}, \texttt {value} \IeC {\cyri } \texttt {rowIndex}\relax }}{12}{table.caption.8}\protected@file@percent } -\newlabel{tab:mat-arrays}{{2}{12}{Массивы \texttt {column}, \texttt {value} и \texttt {rowIndex}\relax }{table.caption.8}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}\IeC {\CYRP }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrd }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyra }\IeC {\cyrv }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }}{5}{subsection.1.3}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces \IeC {\CYRR }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs }\IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrery }\IeC {\cyrishrt } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\relax }}{6}{figure.caption.4}\protected@file@percent } +\newlabel{fig:graph_prim1}{{3}{6}{Рассматриваемый граф\relax }{figure.caption.4}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.1}\IeC {\CYRP }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrch }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrerev }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyro }\IeC {\cyrv }}{6}{subsubsection.1.3.1}\protected@file@percent } +\newlabel{ref:list}{{1.3.1}{6}{Перечисление элементов}{subsubsection.1.3.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.2}\IeC {\CYRM }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra } \IeC {\cyrs }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrzh }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{6}{subsubsection.1.3.2}\protected@file@percent } +\newlabel{ref:smej}{{1.3.2}{6}{Матрица смежности}{subsubsection.1.3.2}{}} +\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces \IeC {\CYRP }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrr } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyrery } \IeC {\cyrs }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrzh }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }\relax }}{6}{table.caption.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.3}\IeC {\CYRM }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra } \IeC {\cyri }\IeC {\cyrn }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{6}{subsubsection.1.3.3}\protected@file@percent } +\newlabel{ref:incident}{{1.3.3}{6}{Матрица инцидентности}{subsubsection.1.3.3}{}} +\@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces \IeC {\CYRP }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrr } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyrery } \IeC {\cyri }\IeC {\cyrn }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }\relax }}{7}{table.caption.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.4}\IeC {\CYRS }\IeC {\cyrp }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyri } \IeC {\cyrs }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrzh }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{7}{subsubsection.1.3.4}\protected@file@percent } +\newlabel{ref:spisok}{{1.3.4}{7}{Списки смежности}{subsubsection.1.3.4}{}} +\citation{dart_web} +\@writefile{toc}{\contentsline {section}{\numberline {2}\IeC {\CYRI }\IeC {\cyrn }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrery }}{8}{section.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Dart}{8}{subsection.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Flutter}{8}{subsection.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3}\IeC {\CYRR }\IeC {\cyre }\IeC {\cyra }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrz }\IeC {\cyra }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrya }}{8}{section.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrf }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyrm }\IeC {\cyru }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyri } \IeC {\cyri } \IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrishrt }}{8}{subsection.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}\IeC {\CYRN }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrd }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyra }}{8}{subsection.3.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}\IeC {\CYRB }\IeC {\cyro }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyre } \IeC {\cyrm }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyrk }\IeC {\cyri }\IeC {\cyrishrt } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }}{8}{subsubsection.3.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrt }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyre }\IeC {\cyrishrt }}{8}{subsubsection.3.2.2}\protected@file@percent } +\@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces \IeC {\CYRR }\IeC {\cyre }\IeC {\cyrz }\IeC {\cyru }\IeC {\cyrl }\IeC {\cyrsftsn }\IeC {\cyrt }\IeC {\cyra }\IeC {\cyrt } \IeC {\cyrs }\IeC {\cyro }\IeC {\cyrk }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrshch }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya } \IeC {\cyrs }\IeC {\cyrl }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrishrt } \IeC {\cyrn }\IeC {\cyre }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrp }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrv }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrishrt } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyri } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrshch }\IeC {\cyri } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrk }\relax }}{8}{table.caption.7}\protected@file@percent } +\newlabel{table-1}{{3}{8}{Результат сокращения словарей неисправностей при помощи масок\relax }{table.caption.7}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.3}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrk }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyro }\IeC {\cyrm } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyrery }}{8}{subsubsection.3.2.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\cyrillictext \CYRZ \CYRA \CYRK \CYRL \CYRYU \CYRCH \CYRE \CYRN \CYRI \CYRE }{8}{section*.8}\protected@file@percent } \bibstyle{gost780uv} \bibdata{thesis} -\@writefile{toc}{\contentsline {section}{\cyrillictext \CYRZ \CYRA \CYRK \CYRL \CYRYU \CYRCH \CYRE \CYRN \CYRI \CYRE }{14}{section*.9}\protected@file@percent } \bibcite{IITMMM_2017}{1} \bibcite{Algo_2013}{2} -\@writefile{toc}{\contentsline {section}{\cyrillictext \CYRS \CYRP \CYRI \CYRS \CYRO \CYRK \ \CYRI \CYRS \CYRP \CYRO \CYRL \CYRSFTSN \CYRZ \CYRO \CYRV \CYRA \CYRN \CYRN \CYRERY \CYRH \ \CYRI \CYRS \CYRT \CYRO \CYRCH \CYRN \CYRI \CYRK \CYRO \CYRV }{15}{section*.10}\protected@file@percent } +\bibcite{intuit}{3} +\bibcite{dart_web}{4} +\@writefile{toc}{\contentsline {section}{\cyrillictext \CYRS \CYRP \CYRI \CYRS \CYRO \CYRK \ \CYRI \CYRS \CYRP \CYRO \CYRL \CYRSFTSN \CYRZ \CYRO \CYRV \CYRA \CYRN \CYRN \CYRERY \CYRH \ \CYRI \CYRS \CYRT \CYRO \CYRCH \CYRN \CYRI \CYRK \CYRO \CYRV }{10}{section*.9}\protected@file@percent } \@writefile{toc}{\redeflsection } \@writefile{toc}{\ttl@change@i {\@ne }{section}{3ex}{\hspace {-3ex}}{\appendixname ~\thecontentslabel \hspace {2ex}}{\hspace {2.3em}}{\titlerule *[0.98ex]{.}\contentspage }\relax } \@writefile{toc}{\ttl@change@v {section}{}{}{}\relax } -\@writefile{toc}{\contentsline {section}{\numberline {\CYRA }\IeC {\CYRN }\IeC {\cyru }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrery }\IeC {\cyre } \IeC {\cyro }\IeC {\cyrb }\IeC {\cyrhrdsn }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrv } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrl }\IeC {\cyro }\IeC {\cyrzh }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyri }}{16}{appendix.A}\protected@file@percent } -\@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces Results of pass-fail dictionary reduction with the help of masks\relax }}{16}{table.caption.11}\protected@file@percent } -\newlabel{table-2}{{3}{16}{Results of pass-fail dictionary reduction with the help of masks\relax }{table.caption.11}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces \IeC {\CYRP }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrp }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrsftsn } \IeC {\cyrk } \IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyru }\IeC {\cyrn }\IeC {\cyrk }\IeC {\cyru }\relax }}{16}{figure.caption.12}\protected@file@percent } -\newlabel{fig:f3}{{6}{16}{Подпись к рисунку\relax }{figure.caption.12}{}} -\@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces \relax }}{16}{table.caption.13}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {\CYRB }\IeC {\CYRL }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }\IeC {\cyrn }\IeC {\cyrg } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyrery }}{17}{appendix.B}\protected@file@percent } -\newlabel{pril-1}{{\CYRB }{17}{Листинг программы}{appendix.B}{}} -\@writefile{toc}{\contentsline {section}{\numberline {\CYRV }\IeC {\CYRM }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrch }\IeC {\cyrn }\IeC {\cyra }\IeC {\cyrya } \IeC {\cyrt }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra }}{19}{appendix.C}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {\CYRA }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } main.dart}{11}{appendix.A}\protected@file@percent } +\newlabel{mainD}{{\CYRA }{11}{Код main.dart}{appendix.A}{}} +\@writefile{toc}{\contentsline {section}{\numberline {\CYRB }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyrery } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri }}{12}{appendix.B}\protected@file@percent } +\newlabel{buttons}{{\CYRB }{12}{Код страницы отрисовки}{appendix.B}{}} +\@writefile{toc}{\contentsline {section}{\numberline {\CYRV }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }}{23}{appendix.C}\protected@file@percent } +\newlabel{painter}{{\CYRV }{23}{Код отрисовки графа}{appendix.C}{}} +\@writefile{toc}{\contentsline {section}{\numberline {\CYRG }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrk }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs }\IeC {\cyra } \IeC {\cyrd }\IeC {\cyrl }\IeC {\cyrya } \IeC {\cyrr }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyro }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrs } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyro }\IeC {\cyrm }}{30}{appendix.D}\protected@file@percent } +\newlabel{graph}{{\CYRG }{30}{Код класса для работы с графом}{appendix.D}{}} +\gdef\minted@oldcachelist{, + default-pyg-prefix.pygstyle, + default.pygstyle, + 548449C97F6698D1087AC91A858CF238CE04D0281233DEC882812002753B51D5.pygtex, + F63A6C6CFE2A71C32A62566A5FF402950791E7A7418ABF68C6F476205A17F326.pygtex, + E0D93F1B1C464B10E1DFD3A5FDD7CB2DE3F55DFCBF3BE5E86CD03B6A6A01C07B.pygtex, + 61D1074515C38F77A84FF03851DA34D2D1904B5EABA5B13629C0C626E1849883.pygtex} \ttl@finishall -\gdef \@abspage@last{19} +\gdef \@abspage@last{44} diff --git a/tex/example-work.bbl b/tex/example-work.bbl index 1c21d1d..8ebf3cf 100644 --- a/tex/example-work.bbl +++ b/tex/example-work.bbl @@ -21,7 +21,20 @@ \BibAuthor{Кормен,~Томас~Х.} \BibTitle{Алгоритмы: построение и анализ, 2-е издание}~/ Томас~Х.~Кормен, Чарльз~И.~Лейзерсон, Роналд~Л.~Ривест, Клиффорд~Штайн. "--- -\newblock Издательский дом \"Вильямс\", 2013. "--- +\newblock Издательский дом ''Вильямс'', 2013. "--- \newblock P.~1296. +\bibitem{intuit} +\selectlanguageifdefined{english} +\BibTitle{Лекция 45: Алгоритмы на графах. алгоритмы обхода графa. + [{Э}лектронный ресурс]}. "--- +\newblock URL:~\url{https://intuit.ru/studies/courses/648/504/lecture/11474} + (Дата обращения 20.11.2021). Загл. с экр. Яз. рус. + +\bibitem{dart_web} +\selectlanguageifdefined{english} +\BibTitle{Dart overview. [{Э}лектронный ресурс]}. "--- +\newblock URL:~\url{https://dart.dev/overview} (Дата обращения 20.11.2021). + Загл. с экр. Яз. англ. + \end{thebibliography} diff --git a/tex/example-work.blg b/tex/example-work.blg index 35022a0..c1d7ab5 100644 --- a/tex/example-work.blg +++ b/tex/example-work.blg @@ -11,9 +11,9 @@ Reallocated glb_str_end (elt_size=4) to 10 items from 0. Database file #1: thesis.bib Here's how much of BibTeX's memory you used: - Cites: 2 out of 750 - Fields: 34 out of 5000 - Hash table: 18794 out of 19000 - Strings: 665 out of 19000 - Free string pool: 5758 out of 65000 + Cites: 4 out of 750 + Fields: 96 out of 5000 + Hash table: 18792 out of 19000 + Strings: 671 out of 19000 + Free string pool: 6092 out of 65000 Wizard functions: 2649 out of 3000 diff --git a/tex/example-work.out b/tex/example-work.out index 0b753a7..1cfa318 100644 --- a/tex/example-work.out +++ b/tex/example-work.out @@ -1,18 +1,24 @@ \BOOKMARK [1][-]{section*.1}{\376\377\004\022\004\022\004\025\004\024\004\025\004\035\004\030\004\025}{}% 1 \BOOKMARK [1][-]{section.1}{\376\377\004\022\004\062\004\065\004\064\004\065\004\075\004\070\004\065}{}% 2 \BOOKMARK [2][-]{subsection.1.1}{\376\377\004\023\004\100\004\060\004\104\004\113}{section.1}% 3 -\BOOKMARK [1][-]{section.2}{\376\377\004\030\004\101\004\102\004\076\004\100\004\070\004\117\000\040\004\101\004\076\004\067\004\064\004\060\004\075\004\070\004\117\000\040\004\117\004\067\004\113\004\072\004\060\000\040\000S\000Q\000L}{}% 4 -\BOOKMARK [2][-]{subsection.2.1}{\376\377\004\041\004\076\004\067\004\064\004\060\004\102\004\065\004\073\004\070}{section.2}% 5 -\BOOKMARK [2][-]{subsection.2.2}{\376\377\004\025\004\111\004\065\000\040\004\115\004\073\004\065\004\074\004\065\004\075\004\102\004\113\000\040\004\074\004\060\004\102\004\065\004\074\004\060\004\102\004\070\004\107\004\065\004\101\004\072\004\076\004\063\004\076\000\040\004\102\004\065\004\072\004\101\004\102\004\060}{section.2}% 6 -\BOOKMARK [2][-]{subsection.2.3}{\376\377\004\041\004\075\004\076\004\062\004\060\000\040\004\074\004\060\004\102\004\065\004\074\004\060\004\102\004\070\004\107\004\065\004\101\004\072\004\070\004\071\000\040\004\102\004\065\004\072\004\101\004\102}{section.2}% 7 -\BOOKMARK [1][-]{section.3}{\376\377\004\040\004\060\004\067\004\064\004\065\004\073\000\040\004\101\000\040\004\077\004\076\004\064\004\100\004\060\004\067\004\064\004\065\004\073\004\060\004\074\004\070}{}% 8 -\BOOKMARK [2][-]{subsection.3.1}{\376\377\004\042\004\065\004\072\004\101\004\102\000\040\004\101\000\040\004\104\004\076\004\100\004\074\004\103\004\073\004\060\004\074\004\070\000\040\004\070\000\040\004\073\004\065\004\074\004\074\004\076\004\071}{section.3}% 9 -\BOOKMARK [2][-]{subsection.3.2}{\376\377\004\035\004\060\004\067\004\062\004\060\004\075\004\070\004\065\000\040\004\064\004\100\004\103\004\063\004\076\004\063\004\076\000\040\004\077\004\076\004\064\004\100\004\060\004\067\004\064\004\065\004\073\004\060}{section.3}% 10 -\BOOKMARK [3][-]{subsubsection.3.2.1}{\376\377\004\021\004\076\004\073\004\065\004\065\000\040\004\074\004\065\004\073\004\072\004\070\004\071\000\040\004\077\004\076\004\064\004\100\004\060\004\067\004\064\004\065\004\073}{subsection.3.2}% 11 -\BOOKMARK [3][-]{subsubsection.3.2.2}{\376\377\004\042\004\065\004\072\004\101\004\102\000\040\004\101\000\040\004\102\004\060\004\061\004\073\004\070\004\106\004\065\004\071}{subsection.3.2}% 12 -\BOOKMARK [3][-]{subsubsection.3.2.3}{\376\377\004\042\004\065\004\072\004\101\004\102\000\040\004\101\000\040\004\072\004\076\004\064\004\076\004\074\000\040\004\077\004\100\004\076\004\063\004\100\004\060\004\074\004\074\004\113}{subsection.3.2}% 13 -\BOOKMARK [1][-]{section*.9}{\376\377\004\027\004\020\004\032\004\033\004\056\004\047\004\025\004\035\004\030\004\025}{}% 14 -\BOOKMARK [1][-]{section*.10}{\376\377\004\041\004\037\004\030\004\041\004\036\004\032\000\040\004\030\004\041\004\037\004\036\004\033\004\054\004\027\004\036\004\022\004\020\004\035\004\035\004\053\004\045\000\040\004\030\004\041\004\042\004\036\004\047\004\035\004\030\004\032\004\036\004\022}{}% 15 -\BOOKMARK [1][-]{appendix.A}{\376\377\004\035\004\103\004\074\004\065\004\100\004\103\004\065\004\074\004\113\004\065\000\040\004\076\004\061\004\112\004\065\004\072\004\102\004\113\000\040\004\062\000\040\004\077\004\100\004\070\004\073\004\076\004\066\004\065\004\075\004\070\004\070}{}% 16 -\BOOKMARK [1][-]{appendix.B}{\376\377\004\033\004\070\004\101\004\102\004\070\004\075\004\063\000\040\004\077\004\100\004\076\004\063\004\100\004\060\004\074\004\074\004\113}{}% 17 -\BOOKMARK [1][-]{appendix.C}{\376\377\004\034\004\075\004\076\004\063\004\076\004\101\004\102\004\100\004\060\004\075\004\070\004\107\004\075\004\060\004\117\000\040\004\102\004\060\004\061\004\073\004\070\004\106\004\060}{}% 18 +\BOOKMARK [2][-]{subsection.1.2}{\376\377\004\036\004\101\004\075\004\076\004\062\004\075\004\113\004\065\000\040\004\076\004\077\004\100\004\065\004\064\004\065\004\073\004\065\004\075\004\070\004\117}{section.1}% 4 +\BOOKMARK [2][-]{subsection.1.3}{\376\377\004\037\004\100\004\065\004\064\004\101\004\102\004\060\004\062\004\073\004\065\004\075\004\070\004\065\000\040\004\063\004\100\004\060\004\104\004\060}{section.1}% 5 +\BOOKMARK [3][-]{subsubsection.1.3.1}{\376\377\004\037\004\065\004\100\004\065\004\107\004\070\004\101\004\073\004\065\004\075\004\070\004\065\000\040\004\115\004\073\004\065\004\074\004\065\004\075\004\102\004\076\004\062}{subsection.1.3}% 6 +\BOOKMARK [3][-]{subsubsection.1.3.2}{\376\377\004\034\004\060\004\102\004\100\004\070\004\106\004\060\000\040\004\101\004\074\004\065\004\066\004\075\004\076\004\101\004\102\004\070}{subsection.1.3}% 7 +\BOOKMARK [3][-]{subsubsection.1.3.3}{\376\377\004\034\004\060\004\102\004\100\004\070\004\106\004\060\000\040\004\070\004\075\004\106\004\070\004\064\004\065\004\075\004\102\004\075\004\076\004\101\004\102\004\070}{subsection.1.3}% 8 +\BOOKMARK [3][-]{subsubsection.1.3.4}{\376\377\004\041\004\077\004\070\004\101\004\072\004\070\000\040\004\101\004\074\004\065\004\066\004\075\004\076\004\101\004\102\004\070}{subsection.1.3}% 9 +\BOOKMARK [1][-]{section.2}{\376\377\004\030\004\075\004\101\004\102\004\100\004\103\004\074\004\065\004\075\004\102\004\113}{}% 10 +\BOOKMARK [2][-]{subsection.2.1}{\376\377\000D\000a\000r\000t}{section.2}% 11 +\BOOKMARK [2][-]{subsection.2.2}{\376\377\000F\000l\000u\000t\000t\000e\000r}{section.2}% 12 +\BOOKMARK [1][-]{section.3}{\376\377\004\040\004\065\004\060\004\073\004\070\004\067\004\060\004\106\004\070\004\117}{}% 13 +\BOOKMARK [2][-]{subsection.3.1}{\376\377\004\042\004\065\004\072\004\101\004\102\000\040\004\101\000\040\004\104\004\076\004\100\004\074\004\103\004\073\004\060\004\074\004\070\000\040\004\070\000\040\004\073\004\065\004\074\004\074\004\076\004\071}{section.3}% 14 +\BOOKMARK [2][-]{subsection.3.2}{\376\377\004\035\004\060\004\067\004\062\004\060\004\075\004\070\004\065\000\040\004\064\004\100\004\103\004\063\004\076\004\063\004\076\000\040\004\077\004\076\004\064\004\100\004\060\004\067\004\064\004\065\004\073\004\060}{section.3}% 15 +\BOOKMARK [3][-]{subsubsection.3.2.1}{\376\377\004\021\004\076\004\073\004\065\004\065\000\040\004\074\004\065\004\073\004\072\004\070\004\071\000\040\004\077\004\076\004\064\004\100\004\060\004\067\004\064\004\065\004\073}{subsection.3.2}% 16 +\BOOKMARK [3][-]{subsubsection.3.2.2}{\376\377\004\042\004\065\004\072\004\101\004\102\000\040\004\101\000\040\004\102\004\060\004\061\004\073\004\070\004\106\004\065\004\071}{subsection.3.2}% 17 +\BOOKMARK [3][-]{subsubsection.3.2.3}{\376\377\004\042\004\065\004\072\004\101\004\102\000\040\004\101\000\040\004\072\004\076\004\064\004\076\004\074\000\040\004\077\004\100\004\076\004\063\004\100\004\060\004\074\004\074\004\113}{subsection.3.2}% 18 +\BOOKMARK [1][-]{section*.8}{\376\377\004\027\004\020\004\032\004\033\004\056\004\047\004\025\004\035\004\030\004\025}{}% 19 +\BOOKMARK [1][-]{section*.9}{\376\377\004\041\004\037\004\030\004\041\004\036\004\032\000\040\004\030\004\041\004\037\004\036\004\033\004\054\004\027\004\036\004\022\004\020\004\035\004\035\004\053\004\045\000\040\004\030\004\041\004\042\004\036\004\047\004\035\004\030\004\032\004\036\004\022}{}% 20 +\BOOKMARK [1][-]{appendix.A}{\376\377\004\032\004\076\004\064\000\040\000m\000a\000i\000n\000.\000d\000a\000r\000t}{}% 21 +\BOOKMARK [1][-]{appendix.B}{\376\377\004\032\004\076\004\064\000\040\004\101\004\102\004\100\004\060\004\075\004\070\004\106\004\113\000\040\004\076\004\102\004\100\004\070\004\101\004\076\004\062\004\072\004\070}{}% 22 +\BOOKMARK [1][-]{appendix.C}{\376\377\004\032\004\076\004\064\000\040\004\076\004\102\004\100\004\070\004\101\004\076\004\062\004\072\004\070\000\040\004\063\004\100\004\060\004\104\004\060}{}% 23 +\BOOKMARK [1][-]{appendix.D}{\376\377\004\032\004\076\004\064\000\040\004\072\004\073\004\060\004\101\004\101\004\060\000\040\004\064\004\073\004\117\000\040\004\100\004\060\004\061\004\076\004\102\004\113\000\040\004\101\000\040\004\063\004\100\004\060\004\104\004\076\004\074}{}% 24 diff --git a/tex/example-work.pdf b/tex/example-work.pdf index e0420dd..b1b677d 100644 Binary files a/tex/example-work.pdf and b/tex/example-work.pdf differ diff --git a/tex/example-work.synctex.gz b/tex/example-work.synctex.gz index e93bf0d..341bd9f 100644 Binary files a/tex/example-work.synctex.gz and b/tex/example-work.synctex.gz differ diff --git a/tex/example-work.tex b/tex/example-work.tex index 9e65060..35ab388 100644 --- a/tex/example-work.tex +++ b/tex/example-work.tex @@ -116,7 +116,7 @@ % Раздел "Введение" \intro -Целью настоящей работы является изучение работы фреймворка для кроссплатформенной разработки "Flutter", и разработка приложения для создания графов и взаимодействия с ними. +Целью настоящей работы является изучение работы фреймворка для кроссплатформенной разработки "Flutter" и разработка приложения для создания графов и взаимодействия с ними. Поставлены задачи: \begin{itemize} @@ -132,6 +132,8 @@ графа. Другое множество состоит из пар вершин, эти пары называются \textit{ребрами} графа.~\cite{IITMMM_2017} +\subsection{Основные определения} + \textbf{Ориентированный граф} определяется как пара \textit{(V, E)}, где \textit{V} --- конечное множество, а \textit{E} --- бинарное отношение на \textit{V}, т.~е. подмножество множества ${V \times V}$. Ориентированный граф для краткости называют \textbf{орграфом}. Множетсво $V$ называют \textbf{множеством вершин графа}, а его элемент называют \textbf{вершиной} графа. Множество $E$ называют \textbf{множеством рёбер}, а его элементы называют \textbf{рёбрами}. Граф может содержать \textbf{рёбра-циклы}, соединяющие вершину с собой. На рисунке~\ref{fig:orgrapf_example} изображен оринетированный граф с множеством вершин \{0, 1, 2, 3, 4\}.~\citenum{Algo_2013} \begin{figure}[!ht] @@ -150,224 +152,106 @@ Пример неориентированного графа} \end{figure} -\section{История создания языка SQL} -\subsection{Создатели} -Создателями языка SQL являются Реймонд Боус (англ. Ray Boyce) и Дональд Чемберлин (англ. Donald Chamberlin) +Вершина \textit{v} \textbf{смежна} с вершиной \textit{u}, если в графе имеется ребро $\{u, v\}$. Для неориентированных графов отношение смежности является симметричным, но для ориентированных графов это не обязательно. +\textbf{Степенью} вершины в неориентированном графе называется число инцидентных ей рёбер. Для ориентированного графа различают исходящую степень, определяемую как число выходящих из неё рёбер, и входящую степень, определяемую как число входящих в неё рёбер. Сумма исходяшей и входящей степеней называется степенью вершины. -\subsection{Еще элементы математического текста} -Нейрон является составной частью нейронной сети. Он состоит из -элементов трех типов: умножителей (синапсов), сумматора и -нелинейного преобразователя. Синапсы осуществляют связь между -нейронами, умножают входной сигнал на число, характеризующее силу -связи (вес синапса). Сумматор выполняет сложение сигналов, -поступающих по синаптическим связям от других нейронов, и внешних -входных сигналов. Нелинейный преобразователь реализует нелинейную -функцию одного аргумента "--- выхода сумматора. Эта функция -называется функцией активации или передаточной функцией. На рисунке~\ref{neuron} приведено строение одного нейрона. +\textbf{Маршрутом} в графе называется конечная чередующаяся последовательность смежных вершин и ребер, соединяющих эти вершины. -Нейрон в целом реализует скалярную функцию векторного аргумента. -Математическая модель нейрона: -\[ - s = \sum\limits_{i = 1}^n w_i x_i + b, -\] -\[ - y = f(s), -\] -где $w_i $ "--- вес синапса; $i = 1,\ldots ,n$; $b$ "--- значение -смещения; $s$ "--- результат суммирования; $x_i $ "--- $i$-тый -компонент входного вектора (входной сигнал), \linebreak $i = 1,\ldots, n$; -$y$ "--- выходной сигнал нейрона; $n$ "--- число входов нейрона; -$f(s)$ "--- нелинейное преобразование (функция активации). -\begin{figure}[ht] +Маршрут называется открытым, если его начальная и конечная вершины различны, в противном случае он называется замкнутым. + +Маршрут называется \textbf{цепью}, если все его ребра различны. Открытая цепь называется \textbf{путем}, если все ее вершины различны. + +Замкнутая цепь называется \textbf{циклом}, если различны все ее вершины, за исключением концевых. + +Граф называется \textbf{связным}, если для любой пары вершин существует соединяющий их путь.~\cite{intuit} + +\subsection{Представление графа} +Граф можно описать несколькими способами. + +\begin{enumerate} + \item Перечисление элементов:~\ref{ref:list}. + \item Матрица смежности:~\ref{ref:smej}. + \item Матрица инцидентности:~\ref{ref:incident}. + \item Список смежности:~\ref{ref:spisok}. +\end{enumerate} + +Рассмотрим на примере графа на рисунке~\ref{fig:graph_prim1}. + +\begin{figure} \centering - %\includegraphics{Neuron} - \caption{Нейрон}\label{neuron} + \includegraphics[width=9cm]{./pic/prim1.png} + \caption{\label{fig:graph_prim1} + Рассматриваемый граф} \end{figure} -В качестве функции активации нейронов берут обычно одну из -следующих: +\subsubsection{Перечисление элементов}\label{ref:list} +Исходя из определения, для того, чтобы задать граф, достаточно перечислить его вершины и ребра (т.е. пары вершин). + +Пример: +$$ V = \{a, b, c, d, e\} $$ +$$ E = \{(a, b), (a, c), (a, e), (b, c), (b, d), (c, e), (d, e)\}$$ + +\subsubsection{Матрица смежности}\label{ref:smej} +Пусть $G$ --- граф с $n$ вершинами, пронумерованными числами от 1 до $n$. \textbf{Матрица смежности} --- это таблица с $n$ строками и $n$ столбцами, в которой элемент, стоящий на пересечении строки с номером $i$ и столбца с номером $j$, равен 1, еcли вершины с номерами $i$ и $j$ смежны, и 0, если они не смежны. + +\begin{table}[!ht] + %\centering + \caption{Пример матрицы смежности} + \begin{tabular}{|p{15pt}|p{15pt}|p{15pt}|p{15pt}|p{15pt}|} + \hline 0 & 1 & 1 & 0 & 1\\ + \hline 1 & 0 & 1 & 1 & 0\\ + \hline 1 & 1 & 0 & 0 & 1\\ + \hline 0 & 1 & 0 & 0 & 1\\ + \hline 1 & 0 & 1 & 1 & 0\\ + \hline + \end{tabular} +\end{table} + +\subsubsection{Матрица инцидентности}\label{ref:incident} + +Пусть $G$ --- граф с вершинами, пронумерованными числами от 1 до $n$, и ребрами, пронумеровнными от 1 до $m$. В матрице инцидентности строки соответствуют вершинам, а столбцы рёбрам. На пересечении строки с номером $i$ и столбца с номером $j$ стоит 1, если вершина с номером $i$ инцидентна ребру с номером $j$, и 0 в противном случае. + +\begin{table}[!ht] + %\centering + \caption{Пример матрицы инцидентности} + \begin{tabular}{|p{15pt}|p{15pt}|p{15pt}|p{15pt}|p{15pt}|p{15pt}|p{15pt}|} + \hline 1 & 1 & 1 & 0 & 0 & 0 & 0\\ + \hline 1 & 0 & 0 & 1 & 1 & 0 & 0\\ + \hline 0 & 1 & 0 & 1 & 0 & 1 & 0\\ + \hline 0 & 0 & 0 & 0 & 1 & 0 & 1\\ + \hline 0 & 0 & 1 & 0 & 0 & 1 & 1\\ + \hline + \end{tabular} +\end{table} + +\subsubsection{Списки смежности}\label{ref:spisok} +Списки смежности часто используются для компьютерного представления графов. Для каждой вершины задается список всех смежных с ней вершин. В структурах данных, применяемых в программировании, списки смежности могут быть реализованы как массив линейных списков. + +Указывается номер или имя вершины и перечисляются все смежные с ней вершины. + +Пример: \begin{itemize} - \item пороговая функция активации; - \item экспоненциальная сигмоида; - \item рациональная сигмоида; - \item гиперболический тангенс. + \item[1] : 2, 3, 5 + \item[2] : 1, 3, 4 + \item[3] : 1, 2, 5 + \item[4] : 2, 5 + \item[5] : 1, 3, 4 \end{itemize} -Данные функции активации обладают таким важным свойством как -нелинейность. Нелинейность функции активации принципиальна для -построения нейронных сетей. Если бы нейроны были линейными -элементами, то любая последовательность нейронов также производила -бы линейное преобразование и вся нейронная сеть была бы -эквивалентна одному нейрону (или одному слою нейронов в случае -нескольких выходов). Нелинейность разрушает суперпозицию и -приводит к тому, что возможности нейросети существенно выше -возможностей отдельных нейронов. +\section{Инструменты} +Рассмотрим используемый язык и библиотеку для отрисовки. +\subsection{Dart} +В качестве основы используется язык \textbf{Dart}, разработанный компанией Google, и широко используемый для кросс-платформенной разработки~\cite{dart_web}. +\subsection{Flutter} -\subsection{Снова математический текст} -Опишем самую популярную архитектуру - "--- многослойный персептрон с последовательными связями и -сигмоидальной функцией активации (\foreignlanguage{english}{Feedforward Artifitial Neural -Network, FANN}). - -В многослойных нейронных сетях с последовательными связями нейроны -делятся на группы с общим входным сигналом "--- слои. Стандартная -сеть состоит из $L$ слоев, пронумерованных слева направо. Каждый -слой содержит совокупность нейронов с едиными входными сигналами. -Внешние входные сигналы подаются на входы нейронов входного слоя -(его часто нумеруют как нулевой), а выходами сети являются -выходные сигналы последнего слоя. Кроме входного и выходного слоев -в многослойной нейронной сети есть один или несколько скрытых -слоев, соединенных последовательно в прямом направлении и не -содержащих связей между элементами внутри слоя и обратных связей -между слоями. Число нейронов в слое может быть любым и не зависит -от количества нейронов в других слоях. Архитектура нейронной сети -прямого распространения сигнала приведена на рисунке~\ref{net1}. - -На каждый нейрон первого слоя подаются все элементы внешнего -входного сигнала. Все выходы нейронов $i$-го слоя подаются на -каждый нейрон слоя $i+1$. - -Нейроны выполняют взвешенное суммирование элементов входных -сигналов. К сумме прибавляется смещение нейрона. Над результатом -суммирования выполняется нелинейное преобразование "--- функция -активации (передаточная функция). Значение функции активации есть -выход нейрона. Приведем схему многослойного персептрона. Нейроны -представлены кружками, связи между нейронами "--- линиями со -стрелками. - -\begin{figure}[ht] - \centering - %\includegraphics{NN-Scheme} - \caption{Архитектура многослойной сети прямого - распространения}\label{net1} -\end{figure} - -Функционирование сети выполняется в соответствии с формулами: -\[ - s_j^{\left[ k \right]} = \sum\limits_{i = 1}^{N_{k - 1} } - {w_{ji}^{\left[ k \right]} y_i^{\left[ {k - 1} \right]} + - b_j^{[k]} ,\ \ j = 1,\ldots ,N_k ,\ \ k = 1,\ldots ,L;} -\] -\[ - y_j^{\left[ k \right]} = f(s_j^{\left[ k \right]} ),\ \ j = - 1,\ldots ,N_k ,\ \ k = 1,\ldots ,L-1, -\] -\[ - y_j^{\left[ L \right]} = s_j^{\left[ L \right]} , -\] -где -\begin{itemize} - \item - $y_i^{\left[ {k - 1} \right]}$ "--- выходной сигнал $i$-го нейрона - $(k - 1)$-го слоя; \item $w_{ji}^{\left[ k \right]}$ "--- вес связи - между $j$-м нейроном слоя $(k-1)$ и $i$-м нейроном $k$-го - слоя; - \item - $b_j^{\left[ k \right]}$ "--- значение смещения $j$-го - нейрона $k$-го слоя; - \item - $y = f(s)$ "--- функция активации; - \item - $y_j^{\left[ k \right]}$ "--- выходной сигнал $j$-го - нейрона $k$-го слоя; - \item - $N_k$ "--- число узлов слоя $k$; - \item - $L$ "--- общее число основных слоев; - \item - $n = N_0$ "--- размерность входного вектора; - \item - $m = N_L$ "--- - размерность выходного вектора сети. -\end{itemize} - -На рисунке~\ref{net2} представлена сеть прямого распространения -сигнала с 5 входами, 3 нейронами в скрытом слое и 2 нейронами в -выходном слое. -\begin{figure}[hb] - \centering - %\includegraphics{NN-Persep} - \caption{Пример нейронной сети}\label{net2} -\end{figure} - - -\section{Раздел с подразделами} +\section{Реализация} \subsection{Текст с формулами и леммой} -Обозначим $[y_0,y_1,\ldots,y_p;f]$ разделенную разность порядка $p$ функции $f$ по узлам $y_0> впервые был предложен Гарри Марковицем. В 1989 он был награжден премией имени Джона фон Неймана в том числе и за вклад в теорию методов для разреженных матриц. - -В большинстве источников, разреженной матрицей называется матрица, в которой мало ненулевых элементов. Это нельзя назвать определением из-за слова <<мало>>. В понятие разреженной матрицы определяется так: <<Мы можем называть матрицу разреженной, если применение к ней методов, описываемых в книге, экономит память и/или время>>. Таким образом, следует дать определение алгоритму для разреженных матриц. Алгоритмом для разреженных матриц будем называть алгоритм, у которого время работы и необходимый объем памяти зависят от количества ненулевых элементов в матрице. - -Размерность квадратной матрицы $A$ будем обозначать $n$, а количество ненулевых элементов в ней $|A|$. - -Плотные матрицы обычно хранятся в качестве двумерного массива $n\times n$. Будем обозначать такой массив a. Разреженные матрицы не стоит хранить таким способом из-за слишком большого потребления памяти, которая будет занята в основном нулевыми элементами. - -Один из вариантов представления разреженных матриц в памяти компьютера "--- в виде трех массивов: \verb"column", \verb"value" и \verb"rowIndex". Размеры массивов \verb"column" и \verb"value" равны $|A|$. Размер \verb"rowIndex" равен $n+1$. Ненулевые элементы матрицы $A$ хранятся последовательно по строкам в этих массивах. Элемент \verb"column[i]" содержит номер столбца, в котором содержится \verb"i"-й ненулевой элемент, а \verb"value[i]" "--- его величину. Массив \verb"rowIndex[i]" содержит в себе индекс первого ненулевого элемента \verb"i"-й строки. Все ненулевые элементы \verb"i"-й строки содержатся в массивах \verb"column" и \verb"value" в элементах с индексами от \verb"rowIndex[i]" по \verb"rowIndex[i + 1]-1". Для удобства полагают \verb"rowIndex["$n$\verb"]"$=|A|$. - -Для примера рассмотрим следующую матрицу: -\[ - \left( - \begin{matrix} - 1 & 0 & 5 & 0 & 0 \\ - 0 & 2 & 7 & 4 & 0 \\ - 0 & 0 & 1 & 0 & 0 \\ - 9 & 6 & 0 & 3 & 0 \\ - 0 & 0 & 3 & 0 & 5 - \end{matrix} - \right) -\] - -Массивы \verb"column", \verb"value" и \verb"rowIndex" для этой матрицы представлены в таблице~\ref{tab:mat-arrays}. -\begin{table}[ht]\small - \caption{Массивы \texttt{column}, \texttt{value} и \texttt{rowIndex}}\label{tab:mat-arrays} - \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|c|} \cline{2-13} - \multicolumn{1}{c|}{} & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 \\ \cline{2-13}\hline - \verb"column" & 0 & 2 & 1 & 2 & 3 & 2 & 0 & 1 & 3 & 2 & 4 & \\ \hline\hline - \verb"value" & 1 & 5 & 2 & 7 & 4 & 1 & 9 & 6 & 3 & 3 & 5 & \\ \hline\hline - \verb"rowIndex" & 0 & 2 & 5 & 6 & 9 & 11 & & & & & & \\ \hline - \end{tabular} -\end{table} - -Неизвестный вектор и вектор правой части хранятся в виде массивов размера $n$. Массив неизвестного вектора обозначают \verb"x", а массив правой части "--- \verb"rhs". - -Рассмотрим пример алгоритма для разреженных матриц. Алгоритм решения СЛАУ, представленной нижнетреугольной матрицей \verb"a", можно реализовать двумя вложенными циклами по \verb"n": -\begin{Verbatim}[fontsize=\small, numbers=left] -for(int i = 0; i $<$ n; ++i){ - x[i] = rhs[i]; - for(int j = 0; j $<$ i; ++j) - x[i] -= a[i][j] * x[j]; - x[i] /= a[i][i]; -} -\end{Verbatim} - -Но, если матрица \verb"a" хранится в разреженном виде, то в данном алгоритме можно проходить только по ненулевым элементам \verb"a": -\begin{Verbatim}[fontsize=\small, numbers=left] -for(int i = 0; i $<$ n; ++i){ - x[i] = rhs[i]; - for(int j = rowIndex[i]; j $<$ rowIndex[i + 1] - 1; ++j) - x[i] -= value[j] * x[column[j]]; - x[i] /= value[rowIndex[i + 1] - 1]; -} -\end{Verbatim} -В первом случае оценка времени работы будет $O(n^{2})$, а во втором $O(|A|)$. - -Методы для разреженных матриц основаны на следующих главных принципах % Раздел "Заключение" @@ -482,78 +308,21 @@ for(int i = 0; i $<$ n; ++i){ % Каждая последующая секция документа будет являться приложением \appendix -\section{Нумеруемые объекты в приложении} +\section{Код main.dart}\label{mainD} +Точка входа в программу. +\inputminted[fontsize=\footnotesize, linenos]{dart}{./lib/main.dart} -\begin{table}[!ht] - \footnotesize - \caption{Results of pass-fail dictionary reduction with the help - of masks} \label{table-2} - \begin{tabular}{|p{1.5cm}| - p{1.5cm}| - p{1.5cm}| - p{1.5cm}| - p{1cm}| - p{1.5cm}| - p{1.5cm}| - p{1cm}|} - \hline \centering Circuit & Number of modelled faults & Number of test - vectors in the test set & The volume of pass-fail dictionary, - \linebreak bit & The volume of found mask & The volume of - masked dictionary, \linebreak bit & \raggedright \% of pass-fail dictionary - & CPU running time, \linebreak min - \\ - \hline S298 & 177 & 322 & 56994 & 30 & 5310 & 9,32\% & 0,07\\ - \hline S344 & 240 & 127 & 30480 & 29 & 6960 & 22,83\% & 0,04\\ - \hline S349 & 243 & 134 & 32562 & 35 & 8505 & 26,12\% & 0,05\\ - \hline S382 & 190 & 2074 & 394060 & 28 & 5320 & 1,35\% & 0,43\\ - \hline S386 & 274 & 286 & 78364 & 65 & 17810 & 22,73\% & 0,26\\ - \hline S400 & 194 & 2214 & 429516 & 32 & 6208 & 1,45\% & 0,99\\ - \hline S444 & 191 & 2240 & 427840 & 30 & 5730 & 1,34\% & 0,98\\ - \hline S526 & 138 & 2258 & 311604 & 28 & 3864 & 1,24\% & 0,61\\ - \hline S641 & 345 & 209 & 72105 & 58 & 20010 & 27,75\% & 0,24\\ - \hline S713 & 343 & 173 & 59339 & 58 & 19894 & 33,53\% & 0,19\\ - \hline S820 & 712 & 1115 & 793880 & 147 & 104664 & 13,18\% & 9,09\\ - \hline S832 & 719 & 1137 & 817503 & 151 & 108569 & 13,28\% & 9,20\\ - \hline S953 & 326 & 14 & 4564 & 13 & 4238 & 92,86\% & 0,01\\ - \hline S1423 & 293 & 150 & 43950 & 58 & 16994 & 38,67\% & 0,15\\ - \hline S1488 & 1359 & 1170 & 1590030 & 158 & 214722 & 13,50\% & 26,69\\ - \hline - \end{tabular} -\end{table} +\section{Код страницы отрисовки}\label{buttons} +Описание интерфейса и базовые функции для взаимодействия с информацией. +\inputminted[fontsize=\footnotesize, linenos]{dart}{./lib/pages/drawing_page.dart} -\begin{equation} - F(x)=\int\limits_a^bf(x)\,dx. -\end{equation} +\section{Код отрисовки графа}\label{painter} +Выводит на экран информацияю из графа. +\inputminted[fontsize=\footnotesize, linenos]{dart}{./lib/src/curve_painter.dart} - -\begin{figure}[!ht] - \centering - \includegraphics[width=6cm]{fig2.png} - \caption{\label{fig:f3}% - Подпись к рисунку} -\end{figure} - - -\begin{table}[!ht] -\caption{} -\begin{tabular}{|c|c|} - \hline - 0 & 1\cr - \hline - 1 & 0\cr - \hline -\end{tabular} -\end{table} - - -\section{Листинг программы}\label{pril-1} -Код приложения \verb"task.pl". - -\VerbatimInput[fontsize=\small, numbers=left, numbersep=2pt]{task.pl} - - - -\section{Многостраничная таблица} +\section{Код класса для работы с графом}\label{graph} +Основной класс для хранения и взаимодействия с информацией. +\inputminted[fontsize=\footnotesize, linenos]{dart}{./lib/src/graph.dart} \noindent diff --git a/tex/example-work.toc b/tex/example-work.toc index 4e3ec57..1a9e1c1 100644 --- a/tex/example-work.toc +++ b/tex/example-work.toc @@ -2,22 +2,28 @@ \contentsline {section}{\cyrillictext \CYRV \CYRV \CYRE \CYRD \CYRE \CYRN \CYRI \CYRE }{3}{section*.1}% \contentsline {section}{\numberline {1}\IeC {\CYRV }\IeC {\cyrv }\IeC {\cyre }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre }}{4}{section.1}% \contentsline {subsection}{\numberline {1.1}\IeC {\CYRG }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyrery }}{4}{subsection.1.1}% -\contentsline {section}{\numberline {2}\IeC {\CYRI }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrya } \IeC {\cyrs }\IeC {\cyro }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya } \IeC {\cyrya }\IeC {\cyrz }\IeC {\cyrery }\IeC {\cyrk }\IeC {\cyra } SQL}{6}{section.2}% -\contentsline {subsection}{\numberline {2.1}\IeC {\CYRS }\IeC {\cyro }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyri }}{6}{subsection.2.1}% -\contentsline {subsection}{\numberline {2.2}\IeC {\CYRE }\IeC {\cyrshch }\IeC {\cyre } \IeC {\cyrerev }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyri }\IeC {\cyrch }\IeC {\cyre }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrt }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyra }}{6}{subsection.2.2}% -\contentsline {subsection}{\numberline {2.3}\IeC {\CYRS }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyra } \IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyri }\IeC {\cyrch }\IeC {\cyre }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyri }\IeC {\cyrishrt } \IeC {\cyrt }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt }}{7}{subsection.2.3}% -\contentsline {section}{\numberline {3}\IeC {\CYRR }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl } \IeC {\cyrs } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyri }}{9}{section.3}% -\contentsline {subsection}{\numberline {3.1}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrf }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyrm }\IeC {\cyru }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyri } \IeC {\cyri } \IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrishrt }}{9}{subsection.3.1}% -\contentsline {subsection}{\numberline {3.2}\IeC {\CYRN }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrd }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyra }}{10}{subsection.3.2}% -\contentsline {subsubsection}{\numberline {3.2.1}\IeC {\CYRB }\IeC {\cyro }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyre } \IeC {\cyrm }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyrk }\IeC {\cyri }\IeC {\cyrishrt } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }}{10}{subsubsection.3.2.1}% -\contentsline {subsubsection}{\numberline {3.2.2}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrt }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyre }\IeC {\cyrishrt }}{10}{subsubsection.3.2.2}% -\contentsline {subsubsection}{\numberline {3.2.3}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrk }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyro }\IeC {\cyrm } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyrery }}{11}{subsubsection.3.2.3}% -\contentsline {section}{\cyrillictext \CYRZ \CYRA \CYRK \CYRL \CYRYU \CYRCH \CYRE \CYRN \CYRI \CYRE }{14}{section*.9}% -\contentsline {section}{\cyrillictext \CYRS \CYRP \CYRI \CYRS \CYRO \CYRK \ \CYRI \CYRS \CYRP \CYRO \CYRL \CYRSFTSN \CYRZ \CYRO \CYRV \CYRA \CYRN \CYRN \CYRERY \CYRH \ \CYRI \CYRS \CYRT \CYRO \CYRCH \CYRN \CYRI \CYRK \CYRO \CYRV }{15}{section*.10}% +\contentsline {subsection}{\numberline {1.2}\IeC {\CYRO }\IeC {\cyrs }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrn }\IeC {\cyrery }\IeC {\cyre } \IeC {\cyro }\IeC {\cyrp }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrya }}{4}{subsection.1.2}% +\contentsline {subsection}{\numberline {1.3}\IeC {\CYRP }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrd }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyra }\IeC {\cyrv }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }}{5}{subsection.1.3}% +\contentsline {subsubsection}{\numberline {1.3.1}\IeC {\CYRP }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrch }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrerev }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyro }\IeC {\cyrv }}{6}{subsubsection.1.3.1}% +\contentsline {subsubsection}{\numberline {1.3.2}\IeC {\CYRM }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra } \IeC {\cyrs }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrzh }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{6}{subsubsection.1.3.2}% +\contentsline {subsubsection}{\numberline {1.3.3}\IeC {\CYRM }\IeC {\cyra }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra } \IeC {\cyri }\IeC {\cyrn }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{6}{subsubsection.1.3.3}% +\contentsline {subsubsection}{\numberline {1.3.4}\IeC {\CYRS }\IeC {\cyrp }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrk }\IeC {\cyri } \IeC {\cyrs }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrzh }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }}{7}{subsubsection.1.3.4}% +\contentsline {section}{\numberline {2}\IeC {\CYRI }\IeC {\cyrn }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyrt }\IeC {\cyrery }}{8}{section.2}% +\contentsline {subsection}{\numberline {2.1}Dart}{8}{subsection.2.1}% +\contentsline {subsection}{\numberline {2.2}Flutter}{8}{subsection.2.2}% +\contentsline {section}{\numberline {3}\IeC {\CYRR }\IeC {\cyre }\IeC {\cyra }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrz }\IeC {\cyra }\IeC {\cyrc }\IeC {\cyri }\IeC {\cyrya }}{8}{section.3}% +\contentsline {subsection}{\numberline {3.1}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrf }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyrm }\IeC {\cyru }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyri } \IeC {\cyri } \IeC {\cyrl }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyro }\IeC {\cyrishrt }}{8}{subsection.3.1}% +\contentsline {subsection}{\numberline {3.2}\IeC {\CYRN }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyre } \IeC {\cyrd }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyra }}{8}{subsection.3.2}% +\contentsline {subsubsection}{\numberline {3.2.1}\IeC {\CYRB }\IeC {\cyro }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyre } \IeC {\cyrm }\IeC {\cyre }\IeC {\cyrl }\IeC {\cyrk }\IeC {\cyri }\IeC {\cyrishrt } \IeC {\cyrp }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrz }\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrl }}{8}{subsubsection.3.2.1}% +\contentsline {subsubsection}{\numberline {3.2.2}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrt }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyre }\IeC {\cyrishrt }}{8}{subsubsection.3.2.2}% +\contentsline {subsubsection}{\numberline {3.2.3}\IeC {\CYRT }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrs }\IeC {\cyrt } \IeC {\cyrs } \IeC {\cyrk }\IeC {\cyro }\IeC {\cyrd }\IeC {\cyro }\IeC {\cyrm } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyrery }}{8}{subsubsection.3.2.3}% +\contentsline {section}{\cyrillictext \CYRZ \CYRA \CYRK \CYRL \CYRYU \CYRCH \CYRE \CYRN \CYRI \CYRE }{8}{section*.8}% +\contentsline {section}{\cyrillictext \CYRS \CYRP \CYRI \CYRS \CYRO \CYRK \ \CYRI \CYRS \CYRP \CYRO \CYRL \CYRSFTSN \CYRZ \CYRO \CYRV \CYRA \CYRN \CYRN \CYRERY \CYRH \ \CYRI \CYRS \CYRT \CYRO \CYRCH \CYRN \CYRI \CYRK \CYRO \CYRV }{10}{section*.9}% \redeflsection \ttl@change@i {\@ne }{section}{3ex}{\hspace {-3ex}}{\appendixname ~\thecontentslabel \hspace {2ex}}{\hspace {2.3em}}{\titlerule *[0.98ex]{.}\contentspage }\relax \ttl@change@v {section}{}{}{}\relax -\contentsline {section}{\numberline {\CYRA }\IeC {\CYRN }\IeC {\cyru }\IeC {\cyrm }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyre }\IeC {\cyrm }\IeC {\cyrery }\IeC {\cyre } \IeC {\cyro }\IeC {\cyrb }\IeC {\cyrhrdsn }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrv } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrl }\IeC {\cyro }\IeC {\cyrzh }\IeC {\cyre }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyri }}{16}{appendix.A}% -\contentsline {section}{\numberline {\CYRB }\IeC {\CYRL }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyri }\IeC {\cyrn }\IeC {\cyrg } \IeC {\cyrp }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrm }\IeC {\cyrm }\IeC {\cyrery }}{17}{appendix.B}% -\contentsline {section}{\numberline {\CYRV }\IeC {\CYRM }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrg }\IeC {\cyro }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrch }\IeC {\cyrn }\IeC {\cyra }\IeC {\cyrya } \IeC {\cyrt }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyrl }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyra }}{19}{appendix.C}% +\contentsline {section}{\numberline {\CYRA }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } main.dart}{11}{appendix.A}% +\contentsline {section}{\numberline {\CYRB }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyri }\IeC {\cyrc }\IeC {\cyrery } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri }}{12}{appendix.B}% +\contentsline {section}{\numberline {\CYRV }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyro }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyri }\IeC {\cyrs }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }\IeC {\cyri } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyra }}{23}{appendix.C}% +\contentsline {section}{\numberline {\CYRG }\IeC {\CYRK }\IeC {\cyro }\IeC {\cyrd } \IeC {\cyrk }\IeC {\cyrl }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrs }\IeC {\cyra } \IeC {\cyrd }\IeC {\cyrl }\IeC {\cyrya } \IeC {\cyrr }\IeC {\cyra }\IeC {\cyrb }\IeC {\cyro }\IeC {\cyrt }\IeC {\cyrery } \IeC {\cyrs } \IeC {\cyrg }\IeC {\cyrr }\IeC {\cyra }\IeC {\cyrf }\IeC {\cyro }\IeC {\cyrm }}{30}{appendix.D}% \contentsfinish diff --git a/tex/lib/main.dart b/tex/lib/main.dart new file mode 100644 index 0000000..a4f99ca --- /dev/null +++ b/tex/lib/main.dart @@ -0,0 +1,24 @@ +import 'package:graphs/pages/drawing_page.dart'; +import 'package:desktop_window/desktop_window.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +Future setupWindow() async { + await DesktopWindow.setMinWindowSize(const Size(850, 700)); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + setupWindow(); + return const MaterialApp( + title: "Graphs", + home: DrawingPage(), + ); + } +} diff --git a/tex/lib/pages/drawing_page.dart b/tex/lib/pages/drawing_page.dart new file mode 100644 index 0000000..aadccff --- /dev/null +++ b/tex/lib/pages/drawing_page.dart @@ -0,0 +1,509 @@ +import 'package:graphs/src/graph.dart'; +import 'package:graphs/src/curve_painter.dart'; + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; + +Graphs getGraph() { + List d = []; + d.add(Dot.fromTwoLists("1", [2], [3])); + d.add(Dot.fromTwoLists("2", [3], [1])); + d.add(Dot.fromTwoLists("3", [1], [2])); + return Graphs.fromList("Имя графа", d, true, true); +} + +class DrawingPage extends StatefulWidget { + const DrawingPage({Key? key}) : super(key: key); + + @override + State createState() => _DrawingPageState(); +} + +class _DrawingPageState extends State { + double screenSize = 0; + Graphs graphData = getGraph(); + List? intListPath; + List? dfsAccessTable; + //List? dijkstraTable; + String op = Operations.none; + int? startDot; + int? endDot; + String? dropdownValue1; + String? dropdownValue2; + String currOp = ""; + + final _textNameController = TextEditingController(); + final _textLnthController = TextEditingController(); + final _textGrNmController = TextEditingController(); + + void clearInputData() { + setState(() { + _textLnthController.clear(); + _textNameController.clear(); + dropdownValue1 = null; + dropdownValue2 = null; + }); + } + + void clearDropDownVals() { + setState(() { + startDot = null; + intListPath = null; + dfsAccessTable = null; + endDot = null; + currOp = ""; + op = Operations.none; + }); + } + + // *************buttons************* + ElevatedButton createButton(String txt, void Function() onPressing) { + return ElevatedButton( + onPressed: onPressing, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.resolveWith( + (states) => Colors.green.shade700)), + child: Text(txt, + style: const TextStyle( + fontSize: 15, + color: Colors.white70, + height: 1, + )), + ); + } + + void showPopUp(String alertTitle, String err) => showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + title: Text(alertTitle, style: const TextStyle(fontSize: 26)), + content: Text( + err, + style: const TextStyle(fontSize: 18), + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context, 'OK'), + child: const Text('OK'), + ), + ], + ), + ); + // *************buttons************* + + // ***addSpace*** + SizedBox addSpaceH(double h) { + return SizedBox(height: h); + } + + SizedBox addSpaceW(double w) { + return SizedBox(width: w); + } + // ***addSpace*** + + // *************inputs************* + Container createInputBox(String text, double width, IconData? icon, + TextEditingController? controller) { + if (icon == null) { + return Container( + width: width, + height: 40, + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 5), + child: TextField( + controller: controller, + textAlign: TextAlign.center, + onChanged: (name) => graphData.setName(name), + decoration: InputDecoration( + contentPadding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + filled: true, + fillColor: Colors.white, + //prefixIcon: Icon(icon, color: Colors.black), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(40))), + hintStyle: const TextStyle(color: Colors.black38), + hintText: text), + )); + } + return Container( + width: width, + height: 40, + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 5), + child: TextField( + controller: controller, + textAlign: TextAlign.center, + decoration: InputDecoration( + contentPadding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + filled: true, + fillColor: Colors.white, + prefixIcon: Icon(icon, color: Colors.black), + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(40))), + hintStyle: const TextStyle(color: Colors.black38), + hintText: text), + )); + } + + SizedBox dropList1(double width) { + var button = DropdownButton( + hint: const Text( + 'Select dot', + style: TextStyle(color: Colors.white, fontSize: 13), + ), + alignment: AlignmentDirectional.bottomEnd, + value: dropdownValue1, + isDense: true, + borderRadius: const BorderRadius.all(Radius.circular(20)), + dropdownColor: Colors.green.shade800, + style: const TextStyle( + color: Colors.white, + fontSize: 18, + ), + onChanged: (String? newValue) { + setState(() { + dropdownValue1 = newValue; + }); + }, + items: graphData.getDots().map((location) { + return DropdownMenuItem( + child: Text(location.getName()), + value: location.num.toString(), + ); + }).toList(), + ); + + return SizedBox( + child: button, + width: width, + ); + } + + SizedBox dropList2(double width) { + var button = DropdownButton( + hint: const Text( + 'Select Dot', + style: TextStyle(color: Colors.white, fontSize: 13), + ), + alignment: AlignmentDirectional.centerEnd, + value: dropdownValue2, + isDense: true, + borderRadius: const BorderRadius.all(Radius.circular(20)), + dropdownColor: Colors.green.shade800, + style: const TextStyle( + color: Colors.white, + fontSize: 18, + ), + onChanged: (String? newValue) { + setState(() { + dropdownValue2 = newValue; + }); + }, + items: graphData.getDots().map((location) { + return DropdownMenuItem( + child: Text(location.getName()), + value: location.num.toString(), + ); + }).toList(), + ); + + return SizedBox( + child: button, + width: width, + ); + } +// *************inputs************* + +//*********ButtonsFunctions********* + void addDotPushed() { + clearDropDownVals(); + if (_textNameController.text == "") { + showPopUp("Error", "No name in \"Dot name\" box"); + } else { + setState(() { + String? res = graphData.addIsolated(_textNameController.text); + if (res != null) { + showPopUp("Error", res); + } + }); + } + clearInputData(); + } + + void addPathPushed() { + clearDropDownVals(); + if (dropdownValue1 == null) { + showPopUp("Error", "No dot in first box selected"); + } else if (dropdownValue2 == null) { + showPopUp("Error", "No dot in second box selected"); + } else if (_textLnthController.text == "" && graphData.getUseLengthBool()) { + showPopUp("Error", "No length in \"Input length\" box"); + } else { + int? from = int.parse(dropdownValue1!); + int? to = int.parse(dropdownValue2!); + int? len = int.tryParse(_textLnthController.text); + if (len == null && graphData.getUseLengthBool()) { + showPopUp("Error", + "Can't parse input.\nInts only allowed in \"Input length\""); + } else { + len ??= 0; + setState(() { + String? res = graphData.addPath(from, to, len!); + if (res != null) showPopUp("Error", res); + }); + } + } + clearInputData(); + } + + void changeOriented() { + setState(() { + String? res = graphData.flipUseOrientation(); + if (res != null) showPopUp("Error", res); + }); + } + + void changeLength() { + setState(() { + String? res = graphData.flipUseLength(); + if (res != null) showPopUp("Error", res); + }); + } + + void delPathPushed() { + clearDropDownVals(); + if (dropdownValue1 == null) { + showPopUp("Error", "No dot in first box selected"); + } else if (dropdownValue2 == null) { + showPopUp("Error", "No dot in second box selected"); + } else { + int? from = int.tryParse(dropdownValue1!); + int? to = int.tryParse(dropdownValue2!); + if (from == null || to == null) { + showPopUp("Error", + "Can't parse input.\nInts only allowed in \"Dot number\" and \"Destination number\""); + } else { + setState(() { + String? res = graphData.delPath(from, to); + if (res != null) { + showPopUp("Error", res); + } + }); + } + } + clearInputData(); + } + + void delDotPushed() { + if (dropdownValue1 != null) { + setState(() { + String? res = graphData.delDot(int.parse(dropdownValue1!)); + if (res != null) { + showPopUp("Error", res); + } + }); + } else { + showPopUp("Error", "Nothing in input"); + } + clearDropDownVals(); + clearInputData(); + } + + void fileOpener() async { + FilePickerResult? result = + await FilePicker.platform.pickFiles(allowedExtensions: ["txt"]); + + if (result != null) { + if (!result.files.single.path!.endsWith(".txt")) { + showPopUp("Error", "Can open only \".txt\" files"); + } else { + setState(() { + String? res = + graphData.replaceDataFromFile(result.files.single.path!); + + if (res != null) showPopUp("Error", res); + }); + } + } else { + showPopUp("Error", "No file selected"); + } + clearDropDownVals(); + clearInputData(); + } + + void fileSaver() async { + String? outputFile = await FilePicker.platform.saveFile( + dialogTitle: 'Please select an output file:', + fileName: 'output-file.txt', + allowedExtensions: ["txt"]); + if (outputFile == null) { + showPopUp("Error", "Save cancelled"); + } else { + if (!outputFile.endsWith(".txt")) { + outputFile += ".txt"; + } + graphData.printToFile(outputFile); + } + clearDropDownVals(); + clearInputData(); + } + + void bfsPushed() { + clearDropDownVals(); + if (dropdownValue1 == null) { + showPopUp("Error", "No dot in first box selected"); + } else if (dropdownValue2 == null) { + showPopUp("Error", "No dot in second box selected"); + } else { + setState(() { + startDot = int.parse(dropdownValue1!); + endDot = int.parse(dropdownValue2!); + currOp = "OP: BFS from $startDot to $endDot"; + op = Operations.bfs; + intListPath = graphData.bfsPath(startDot!, endDot!); + }); + if (intListPath == null) { + showPopUp("Info", "There is no path"); + } + } + clearInputData(); + } + + void dfsPushed() { + clearDropDownVals(); + if (dropdownValue1 == null) { + showPopUp("Error", "No dot in first box selected"); + } else { + setState(() { + startDot = int.parse(dropdownValue1!); + op = Operations.dfs; + currOp = "OP: DFS from $startDot"; + dfsAccessTable = graphData.dfsIterative(startDot!); + }); + if (dfsAccessTable == null) { + showPopUp("Err", "report this error."); + } + } + + clearInputData(); + } + + void dijkstraPushed() { + clearDropDownVals(); + if (dropdownValue1 == null) { + showPopUp("Error", "No number in \"Dot number\" box"); + } else { + setState(() { + startDot = int.parse(dropdownValue1!); + currOp = "OP: Dijkstra from $startDot"; + op = Operations.dijkstra; + intListPath = graphData.dijkstra(startDot!); + }); + if (intListPath == null) { + showPopUp("Err", "report this error."); + } + } + clearInputData(); + } + //*********ButtonsFunctions********* + + // build + @override + Widget build(BuildContext context) { + screenSize = MediaQuery.of(context).size.width; + _textGrNmController.text = graphData.getName(); + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Align( + alignment: Alignment.topLeft, + child: Text("Graph name:\n", + style: TextStyle( + fontSize: 18, + color: Colors.white, + ))), + toolbarHeight: 110, + flexibleSpace: Container( + color: Colors.green.shade900, + child: Column(children: [ + const SizedBox(height: 5), + Row(children: [ + addSpaceW(screenSize / 8 + 19), + createButton("\nAdd dot\n", addDotPushed), + createInputBox("Dot name", screenSize / 4 - 25, Icons.label, + _textNameController), + addSpaceW(8), + createButton("\nAdd path\n", addPathPushed), + createInputBox("Input length", screenSize / 4 - 25, + Icons.arrow_right_alt_outlined, _textLnthController), + ]), + addSpaceH(3), + Row(children: [ + addSpaceW(6), + createInputBox( + "Name", screenSize / 8 - 25, null, _textGrNmController), + createButton("\nDel dot \n", delDotPushed), + addSpaceW(54), + dropList1(screenSize / 4 - 80), + addSpaceW(53), + createButton("\nDel path\n", delPathPushed), + addSpaceW(54), + dropList2(screenSize / 4 - 80), + ]), + ]), + ), + actions: [ + IconButton( + onPressed: () { + setState(() { + clearDropDownVals(); + graphData.flushData(); + clearInputData(); + }); + }, + icon: const Icon(Icons.delete_sweep), + iconSize: 60, + ), + ]), + body: CustomPaint( + painter: CurvePainter( + graphData: graphData, + intListPath: intListPath, + dfsAccessTable: dfsAccessTable, + start: startDot, + end: endDot, + op: op), + child: Align( + alignment: Alignment.topRight, + child: ButtonBar( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + currOp, + style: const TextStyle(fontSize: 14, color: Colors.black), + ), + createButton("Bfs", bfsPushed), + createButton("Dfs", dfsPushed), + createButton("Dijkstra", dijkstraPushed), + createButton("Kruskal", () { + clearDropDownVals(); + setState(() { + currOp = "OP: Kruscal algo"; + graphData.kruskal(); + }); + clearInputData(); + }), + createButton("Clear OP", () { + clearDropDownVals(); + clearInputData(); + }), + createButton(graphData.getUseLengthStr(), changeLength), + createButton(graphData.getDoubleSidedStr(), changeOriented), + createButton("Save to file", fileSaver), + createButton("Load from file", fileOpener), + ], + ), + ), + ), + )); + } +} diff --git a/tex/lib/src/curve_painter.dart b/tex/lib/src/curve_painter.dart new file mode 100644 index 0000000..c92ff75 --- /dev/null +++ b/tex/lib/src/curve_painter.dart @@ -0,0 +1,328 @@ +import 'package:arrow_path/arrow_path.dart'; +import 'package:graphs/src/graph.dart'; +import 'package:flutter/material.dart'; +import 'dart:math'; + +class Operations { + static const String bfs = "bfs"; + static const String dfs = "dfs"; + static const String dijkstra = "djkstr"; + static const String none = "none"; +} + +class CurvePainter extends CustomPainter { + CurvePainter({ + Key? key, + required this.graphData, + required this.intListPath, + required this.dfsAccessTable, + required this.start, + required this.end, + required this.op, + }); + + List? intListPath; + List? dfsAccessTable; + String op; + int? start; + int? end; + Graphs graphData; + final double _dotRad = 7; + final double _lineWidth = 1.5; + final Color _lineColor = Colors.black; + final double _aboveHeight = 5; + double _circleRad = 100; + final TextStyle _textStyle = TextStyle( + color: Colors.red.shade900, + decorationColor: Colors.green.shade900, + decorationThickness: 10, + decorationStyle: TextDecorationStyle.dashed, + fontSize: 20, + ); + Map _off = {}; + void _drawLine(Canvas canvas, Offset p1, Offset p2) { + Paint p = Paint(); + p.color = _lineColor; + p.strokeWidth = _lineWidth; + canvas.drawLine(p1, p2, p); + } + + void _drawDot(Canvas canvas, Offset p1, [double plusRad = 0, Color? col]) { + col ??= Colors.yellow.shade900; + var p = Paint(); + p.color = col; + p.strokeWidth = _lineWidth + 2; + canvas.drawCircle(p1, _dotRad + plusRad, p); + } + + void _drawSelfConnect(Canvas canvas, Offset p1) { + var p = Paint(); + p.color = _lineColor; + p.strokeWidth = _lineWidth; + p.style = PaintingStyle.stroke; + canvas.drawCircle(Offset(p1.dx + _dotRad + 20, p1.dy), _dotRad + 20, p); + } + + TextSpan _getTextSpan(String s) => TextSpan(text: s, style: _textStyle); + TextPainter _getTextPainter(String s) => TextPainter( + text: _getTextSpan(s), + textDirection: TextDirection.ltr, + textAlign: TextAlign.center); + + void _drawDotNames(Canvas canvas, Offset place, String s) { + var textPainter = _getTextPainter(s); + textPainter.layout(); + textPainter.paint( + canvas, + Offset((place.dx - textPainter.width), + (place.dy - textPainter.height) - _aboveHeight)); + } + + void _drawDotNum(Canvas canvas, Offset size, String s) { + var textPainter = TextPainter( + text: TextSpan( + text: s, + style: const TextStyle( + color: Colors.black, + fontSize: 17, + )), + textDirection: TextDirection.ltr, + textAlign: TextAlign.center); + textPainter.layout(); + textPainter.paint( + canvas, + Offset((size.dx - textPainter.width) + 25, + (size.dy - textPainter.height) + _aboveHeight + 30)); + } + + int _getHighInputConnections() { + if (graphData.getDots().length != 1 && graphData.getDots().length <= 3) { + return -1; + } + int higest = -1; + for (var i in graphData.getDots()) { + if (i.getL().length > higest) higest = i.num; + } + return higest; + } + + Map _getDotPos(int dotsAm, Size size) { + Map off = {}; + var width = size.width / 2; + var height = size.height / 2; + int add = 0; + int h = _getHighInputConnections(); + for (int i = 0; i < dotsAm; i++) { + if ((i + 1) != h) { + double x = + cos(2 * pi * (i - add) / (dotsAm - add)) * _circleRad + width; + double y = + sin(2 * pi * (i - add) / (dotsAm - add)) * _circleRad + height; + + off[i + 1] = Offset(x, y); + } else if ((i + 1) == h) { + off[i + 1] = Offset(width + 2, height - 2); + add = 1; + h = 0; + } else { + print("GetDotPos error"); + } + } + + return off; + } + + void _drawHArrow(Canvas canvas, Size size, Offset from, Offset to, + [bool doubleSided = false]) { + Path path; + + // The arrows usually looks better with rounded caps. + Paint paint = Paint() + ..color = Colors.black + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeJoin = StrokeJoin.round + ..strokeWidth = _lineWidth; + + var length = sqrt((to.dx - from.dx) * (to.dx - from.dx) + + (to.dy - from.dy) * (to.dy - from.dy)); + + /// Draw a single arrow. + path = Path(); + path.moveTo(from.dx, from.dy); + path.relativeCubicTo( + 0, + 0, + -(from.dx + to.dx + length) / (length) - 40, + -(from.dy + to.dy + length) / (length) - 40, + to.dx - from.dx, + to.dy - from.dy); + path = + ArrowPath.make(path: path, isDoubleSided: doubleSided, tipLength: 16); + canvas.drawPath(path, paint); + } + + void _drawHighArrow(Canvas canvas, Size size, Offset from, Offset to, + [bool doubleSided = false]) { + Path path; + + Paint paint = Paint() + ..color = Colors.black + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeJoin = StrokeJoin.round + ..strokeWidth = _lineWidth; + + var length = sqrt((to.dx - from.dx) * (to.dx - from.dx) + + (to.dy - from.dy) * (to.dy - from.dy)); + + /// Draw a single arrow. + path = Path(); + path.moveTo(from.dx, from.dy); + path.relativeCubicTo( + 0, + 0, + (from.dx + to.dx) / (length * 2) + 40, + (from.dy + to.dy) / (length * 2) + 40, + to.dx - from.dx, + to.dy - from.dy); + path = ArrowPath.make( + path: path, + isDoubleSided: doubleSided, + tipLength: 13, + isAdjusted: false); + canvas.drawPath(path, paint); + } + + void _drawConnections( + Canvas canvas, Size size, List dots, Map off) { + for (var i in dots) { + var list = i.getL(); + var beg = off[i.num]; + for (var d in list.keys) { + if (d == i.num) { + _drawSelfConnect(canvas, off[d]!); + } else { + if (graphData.getDoubleSidedBool()) { + if (d > i.num) { + _drawHArrow(canvas, size, beg!, off[d]!, false); + if (graphData.getUseLengthBool()) { + _drawDotNames( + canvas, + Offset((off[d]!.dx + beg.dx) / 2 - 18, + (off[d]!.dy + beg.dy) / 2 - 18), + i.getL()[d].toString()); + } + } else { + _drawHighArrow(canvas, size, beg!, off[d]!, false); + if (graphData.getUseLengthBool()) { + _drawDotNames( + canvas, + Offset((off[d]!.dx + beg.dx) / 2 + 30, + (off[d]!.dy + beg.dy) / 2 + 30), + i.getL()[d].toString()); + } + } + } else { + _drawLine(canvas, beg!, off[d]!); + if (graphData.getUseLengthBool()) { + _drawDotNames( + canvas, + Offset((off[d]!.dx + beg.dx) / 2, (off[d]!.dy + beg.dy) / 2), + i.getL()[d].toString()); + } + } + } + } + } + } + + void _drawBFS(Canvas canvas) { + if (intListPath != null) { + for (int i = 0; i < intListPath!.length; i++) { + _drawDot(canvas, _off[intListPath![i]]!, 8, Colors.yellow); + } + _drawDot(canvas, _off[start]!, 9, Colors.green); + _drawDot(canvas, _off[end]!, 7, Colors.red.shade200); + for (int i = 0; i < intListPath!.length; i++) { + _drawDotNum(canvas, _off[intListPath![i]]!, "bfs: №${i + 1}"); + } + } + } + + void _drawDFS(Canvas canvas) { + if (dfsAccessTable != null) { + for (int i = 0; i < dfsAccessTable!.length; i++) { + if (dfsAccessTable![i]) { + _drawDot(canvas, _off[i + 1]!, 8, Colors.green.shade500); + _drawDotNum(canvas, _off[i + 1]!, "dfs: visible"); + } else { + _drawDot(canvas, _off[i + 1]!, 7, Colors.red.shade500); + _drawDotNum(canvas, _off[i + 1]!, "dfs: not visible"); + } + } + _drawDot(canvas, _off[start]!, 9, Colors.green.shade900); + } + } + + void _drawDijkstra(Canvas canvas) { + if (intListPath != null) { + _drawDot(canvas, _off[start]!, 9, Colors.green); + for (int i = 0; i < intListPath!.length; i++) { + if (intListPath![i] == null) { + _drawDotNum(canvas, _off[i + 1]!, "len: INF"); + } else { + _drawDotNum(canvas, _off[i + 1]!, "len: ${intListPath![i]}"); + } + } + } + } + + @override + void paint(Canvas canvas, Size size) { + if (size.width > size.height) { + _circleRad = size.height / 3; + } else { + _circleRad = size.width / 3; + } + + _off = _getDotPos(graphData.getDotAmount(), size); //, higest); + for (int i in _off.keys) { + _drawDot(canvas, _off[i]!); + } + + var g = graphData.getDots(); + switch (op) { + case Operations.bfs: + { + _drawBFS(canvas); + break; + } + case Operations.dfs: + { + _drawDFS(canvas); + break; + } + case Operations.dijkstra: + { + _drawDijkstra(canvas); + break; + } + default: + { + break; + } + } + + _drawConnections(canvas, size, g, _off); + for (int i in _off.keys) { + _drawDotNames( + canvas, _off[i]!, "${graphData.getDots()[i - 1].getName()}:[$i]"); + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) { + return true; + } +} diff --git a/tex/lib/src/graph.dart b/tex/lib/src/graph.dart new file mode 100644 index 0000000..c368d71 --- /dev/null +++ b/tex/lib/src/graph.dart @@ -0,0 +1,696 @@ +import 'dart:io'; + +class Separators { + static const String dotToConnections = ": "; + static const String dotToLength = "|"; + static const String space = " "; + static const String hasLength = "Взвешенный"; + static const String hasNoLength = "НеВзвешенный"; + static const String isOriented = "Ориентированный"; + static const String isNotOriented = "НеОриентированный"; + static const String nL = "\n"; + static const String end = "END"; + + Separators(); +} + +class Dot { + //Data + // ignore: prefer_final_fields + String _name = ""; + int num = -1; + Map _ln = {}; + + //****Get**** + String getName() => _name; + bool hasConnection(int n) => _ln.containsKey(n); + Map getL() => _ln; + + int getLength(int x) { + if (hasConnection(x)) { + return _ln[x]!; + } + return -1; + } + //****Get**** + + //Set + void setName(String n) => _name = n; + + //Add + void addPath(int inp, int length) => _ln[inp] = length; + + //Del + void delPath(int n) => _ln.removeWhere((key, value) => + key == n); // удалить обратный путь если не ориентированный + + //Print + void printD() { + stdout.write("$_name: №$num => "); + for (var i in _ln.keys) { + stdout.write("$i|${_ln[i]} "); + } + stdout.write("\n"); + } + + //******Constructor****** + Dot([String name = "Undefined", int n = -1]) { + _name = name; + num = n; + _ln = {}; + } + Dot.fromTwoLists(String name, List num0, List length, + [int n = -1]) { + _name = name; + num = n; + Map nw = {}; + if (num0.length != length.length) { + print("Error in lists"); + } else { + for (var i = 0; i < num0.length; i++) { + nw[num0[i]] = length[i]; + _ln = nw; + } + } + } + Dot.fromMap(String name, Map l, [int n = -1]) { + _name = name; + num = n; + _ln = l; + } + //******Constructor****** + + //Copy + Dot.clone(Dot a) { + _name = a.getName(); + num = a.num; + _ln = a.getL(); + } +} + +class Graphs { + static const int intMax = 0x7fffffffffffffff; + //Data + String _name = "Undefined"; //Имя + int _amount = 0; //Количество вершин + List _dots = []; //Список смежности вершин + Map _nameTable = {}; //Список вершин по именам + bool _useLength = false; //Взвешенность + bool _oriented = false; //Ориентированность + + //*********************Add************************ + String? addDot(Dot a) { + if (getNumByName(a.getName()) != null) { + return ("Dot name \"${a.getName()}\" already in use. Change name or use addPath"); + } + _amount++; + a.num = _amount; + _dots.add(a); + _syncNameTable(); + checkDots(false); + if (!_oriented) _fullFix(); + return null; + } + + bool addDotFromToLists(String name, List num0, List length, + [int n = -1]) { + var a = Dot.fromTwoLists(name, num0, length, n); + if (getNumByName(a.getName()) != null) { + print( + "Dot name ${a.getName()} already in use. Change name or use addPath"); + return false; + } + _amount++; + a.num = _amount; + _dots.add(a); + _syncNameTable(); + checkDots(false); + if (!_oriented) _fixPathAfterInsert(a); + return true; + } + + String? addIsolated(String name) { + var res = addDot(Dot.fromTwoLists(name, [], [])); + _syncNameTable(); + return res; + } + + String? addPath(int from, int to, [int len = 0]) { + if (from <= 0 || from > _amount || to <= 0 && to > _amount) { + return "Index out of range. Have dots 1..$_amount"; + } + _dots[from - 1].addPath(to, len); + if (!_oriented) { + _dots[to - 1].addPath(from, len); + } + return null; + } + //*********************Add************************ + + //*********Delete********* + String? delPath(int from, int to) { + if (from <= 0 || from > _amount || to <= 0 && to > _amount) { + return "Can't find specified path"; + } + if (!_dots[from - 1].hasConnection(to)) { + return "Already no connection between $from and $to"; + } + _dots[from - 1].delPath(to); + if (!_oriented) { + _dots[to - 1].delPath(from); + } + return null; + } + + String? delDot(int inn) { + if (inn > _amount || inn < 1) { + return "Index out of range. Allowed 1..$_amount"; + } + List toDel = []; + for (int i in _dots[inn - 1].getL().keys) { + toDel.add(i); + } + for (int i in toDel) { + delPath(i, inn); + } + _dots.removeAt(inn - 1); + _syncNum(); + _syncNameTable(); + _fixAfterDel(inn); + return null; + } + + void flushData() { + _dots = []; + _amount = 0; + _nameTable = {}; + } + //*********Delete********* + + //******Helper******* + bool checkDots([bool verbose = false]) { + for (var a in _dots) { + for (var i in a.getL().keys) { + try { + if (!_dots[i - 1].getL().containsKey(a.num)) { + if (verbose) print("Can't find ${a.num}"); + return false; + } + } catch (e) { + if (verbose) { + print("Can't find Dot $i for path ${a.num}->$i. Exception $e"); + } + _dots[a.num - 1].getL().remove(i); + return false; + } + } + } + return true; + } + + void _fixAfterDel(int inn) { + for (int i = 0; i < _dots.length; i++) { + Map l = {}; + for (int j in _dots[i].getL().keys) { + if (j >= inn) { + l[j - 1] = _dots[i].getL()[j]!; + } else { + l[j] = _dots[i].getL()[j]!; + } + } + _dots[i] = Dot.fromMap(_dots[i].getName(), l, _dots[i].num); + } + } + + void _fixPathAfterInsert(Dot a) { + //Для неориентированного + for (var i in a.getL().keys) { + if (!_dots[i - 1].getL().containsKey(a.num)) { + addPath(i, a.num, a.getL()[i]!); + } + } + } + + void _fullFix() { + for (var i in _dots) { + _fixPathAfterInsert(i); + } + } + + void _syncNameTable() { + _nameTable = {}; + for (var i in _dots) { + _nameTable[i.num] = i.getName(); + } + } + + void _syncNum() { + _amount = 0; + for (var i in _dots) { + i.num = ++_amount; + } + _syncNameTable(); + } + //******Helper******* + + //*****Setters******* + void setName(String name) => _name = name; + String? flipUseOrientation() { + if (_amount != 0) { + return "Can change use of orientation only in empty graph"; + } + _oriented = !_oriented; + return null; + } + + String? flipUseLength() { + if (_amount != 0) { + return "Can change use of length only in empty graph"; + } + _useLength = !_useLength; + return null; + } + + String? replaceDataFromFile(String path) { + File file = File(path); + List lines = file.readAsLinesSync(); + if (lines.length < 3) { + return "Not enough lines in file"; + } + String name = lines.removeAt(0); + bool oriented; + switch (lines.removeAt(0)) { + case Separators.isOriented: + oriented = true; + break; + case Separators.isNotOriented: + oriented = false; + break; + default: + return "Error on parsing \"IsOriented\""; + } + bool useLength; + switch (lines.removeAt(0).trim()) { + case Separators.hasLength: + useLength = true; + break; + case Separators.hasNoLength: + useLength = false; + break; + default: + return "Error on parsing \"HasLength\""; + } + List dots = []; + for (var l in lines) { + l = l.trimRight(); + if (l != Separators.end) { + var spl = l.split(Separators.space); + List dot = []; + List len = []; + String name = spl.removeAt(0); + name = name.substring(0, name.length - 1); + for (var splitted in spl) { + if (splitted != "") { + var dt = splitted.split(Separators.dotToLength); + if (dt.length == 2) { + int? parsed = int.tryParse(dt[0]); + if (parsed == null) { + return "Error while parsing file\nin parsing int in \"${dt[0]}\""; + } + dot.add(parsed); + if (useLength) { + parsed = int.tryParse(dt[1]); + if (parsed == null) { + return "Error while parsing file\nin parsing int in \"${dt[1]}\""; + } + len.add(parsed); + } else { + len.add(0); + } + } else if (dt.length == 1) { + int? parsed = int.tryParse(splitted); + if (parsed == null) { + return "Error while parsing file\nin parsing int in \"$splitted\""; + } + dot.add(parsed); + len.add(0); + } + } + } + dots.add(Dot.fromTwoLists(name, dot, len)); + } + } + _name = name; + _oriented = oriented; + _useLength = useLength; + _dots = dots; + _syncNum(); + _syncNameTable(); + if (!_oriented) _fullFix(); + return null; + } + //*****Setters******* + + //*****Getters******* + bool getDoubleSidedBool() => _oriented; + String getDoubleSidedStr() { + if (_oriented) return Separators.isOriented; + return Separators.isNotOriented; + } + + bool getUseLengthBool() => _useLength; + String getUseLengthStr() { + if (_useLength) return Separators.hasLength; + return Separators.hasNoLength; + } + + List getDots() => _dots; + String getName() => _name; + String? getNameByNum(int n) => _nameTable[n]; + Map getNameTable() => _nameTable; + int getDotAmount() => _dots.length; + int? getNumByName(String n) { + for (var i in _nameTable.keys) { + if (_nameTable[i] == n) return i; + } + return null; + } + + List>? getLenTable() { + List>? out = >[]; + for (int i = 0; i < _amount; i++) { + List xx = []; + for (int j = 1; j <= _amount; j++) { + xx.add(_dots[i].getLength(j)); + } + out.add(xx); + } + return out; + } + + List>? getPathTable() { + List>? out = >[]; + for (int i = 0; i < _amount; i++) { + List xx = []; + for (int j = 1; j <= _amount; j++) { + if (_dots[i].getLength(j) != -1) { + xx.add(i); + } else { + xx.add(-1); + } + } + out.add(xx); + } + return out; + } + + List? getLongestPath([int start = 1]) { + start--; + if (start < 0 || start >= _amount) { + return null; + } + int max = -1; + int inD = -1; + int out = -1; + List? res = []; + for (int i = start; i < _amount; i++) { + var lens = _dots[i].getL(); + for (var d in lens.keys) { + if (lens[d]! > max) { + max = lens[d]!; + inD = i + 1; + out = d; + } + } + } + if (inD == -1) { + return null; + } + res.add(inD); + res.add(out); + res.add(max); + return res; + } + + List getSortedPathList() { + int max = -1; + int inD = -1; + int out = -1; + List result = []; + for (int i = 0; i < _amount; i++) { + var lens = _dots[i].getL(); + for (var d in lens.keys) { + max = lens[d]!; + inD = i + 1; + out = d; + result.add(LenDotPath(max, inD, out)); + } + } + result.sort((a, b) => a.l.compareTo(b.l)); + return result; + } + + //*****Getters******* + + //******Print****** + void printG() { + stdout.write("$_name: "); + if (_oriented) { + stdout.write("Ориентированный, "); + } else { + stdout.write("Не ориентированный, "); + } + if (_useLength) { + print("Взвешенный"); + } else { + print("Не взвешенный"); + } + for (var i in _dots) { + i.printD(); + } + } + + void printToFile(String name) { + var file = File(name); + file.writeAsStringSync("$_name\n"); + if (_oriented) { + file.writeAsStringSync("${Separators.isOriented}\n", + mode: FileMode.append); + } else { + file.writeAsStringSync("${Separators.isNotOriented}\n", + mode: FileMode.append); + } + if (_useLength) { + file.writeAsStringSync("${Separators.hasLength}\n", + mode: FileMode.append); + } else { + file.writeAsStringSync("${Separators.hasNoLength}\n", + mode: FileMode.append); + } + for (int i = 0; i < _amount; i++) { + file.writeAsStringSync(_dots[i].getName() + Separators.dotToConnections, + mode: FileMode.append); + var d = _dots[i].getL(); + for (var j in d.keys) { + file.writeAsStringSync( + j.toString() + Separators.dotToLength + d[j].toString() + " ", + mode: FileMode.append); + } + file.writeAsStringSync(Separators.nL, mode: FileMode.append); + } + file.writeAsStringSync(Separators.end, mode: FileMode.append); + } + //******Print****** + + //*******Constructor******** + Graphs( + [String name = "Undefined", + bool hasLen = false, + bool isOriented = false]) { + _name = name; + _dots = []; + _useLength = hasLen; + _oriented = isOriented; + _amount = 0; + _nameTable = {}; + } + Graphs.fromList(String name, List dots, bool hasLen, bool oriented) { + _name = name; + _dots = dots; + _useLength = hasLen; + _amount = _dots.length; + _oriented = oriented; + _syncNum(); + if (!_oriented) _fullFix(); + } + Graphs.fromFile(String path) { + replaceDataFromFile(path); + } + //*******Constructor******** + + //Copy + Graphs.clone(Graphs a) { + _name = a.getName(); + _dots = a.getDots(); + _oriented = a.getDoubleSidedBool(); + _useLength = a.getUseLengthBool(); + _amount = _dots.length; + _syncNameTable(); + } + + //************Алгоритмы************ + List? bfsPath(int startDot, int goalDot) { + if (startDot == goalDot) return [startDot]; + //if (!bfsHasPath(startDot, goalDot)) return null; + startDot--; + goalDot--; + List>? graph = getLenTable(); + List used = []; + List dst = []; + List pr = []; + + for (int i = 0; i < _amount; i++) { + dst.add(-1); + used.add(false); + pr.add(0); + } + + List q = []; + q.add(startDot); + used[startDot] = true; + dst[startDot] = 0; + pr[startDot] = + -1; //Пометка, означающая, что у вершины startDot нет предыдущей. + + while (q.isNotEmpty) { + int cur = q.removeAt(0); + int x = 0; + for (int neighbor in graph![cur]) { + if (neighbor != -1) { + if (!used[x]) { + q.add(x); + used[x] = true; + dst[x] = dst[cur] + 1; + pr[x] = cur; //сохранение предыдущей вершины + } + } + x++; + } + } + + //Восстановим кратчайший путь + //Для восстановления пути пройдём его в обратном порядке, и развернём. + List path = []; + + int cur = goalDot; //текущая вершина пути + path.add(cur + 1); + + while (pr[cur] != -1) { + //пока существует предыдущая вершина + cur = pr[cur]; //переходим в неё + path.add(cur + 1); //и дописываем к пути + } + + path = path.reversed.toList(); + + if (path[0] == (startDot + 1) && + path[1] == (goalDot + 1) && + !_dots[startDot].hasConnection(goalDot + 1)) return null; + return path; + } + + List? dfsIterative(int v) { + v--; + List label = []; + for (int i = 0; i < _amount; i++) { + label.add(false); + } + List stack = []; + stack.add(v); + //pos.add(v); + while (stack.isNotEmpty) { + v = stack.removeLast(); + if (!label[v]) { + label[v] = true; + for (int i in _dots[v].getL().keys) { + stack.add(i - 1); + //pos.add(i); + } + } + } + return label; + } + + List dijkstra(int from) { + List d = List.filled(_amount, intMax); + List p = List.filled(_amount, -1); + + d[from - 1] = 0; + List u = List.filled(_amount, false); + for (int i = 0; i < _amount; ++i) { + int v = -1; + for (int j = 0; j < _amount; ++j) { + // int t; + if (!u[j] && (v == -1 || d[j]! < d[v]!)) { + v = j; + } + } + if (d[v] == intMax) break; + u[v] = true; + for (int to in _dots[v].getL().keys) { + int len = _dots[v].getL()[to]!; + if (!_useLength && len == 0) len = 1; + if (d[v]! + len < d[to - 1]!) { + d[to - 1] = d[v]! + len; + p[to - 1] = v; + } + } + } + for (int i = 0; i < d.length; i++) { + // подумать как убрать эту часть + if (d[i] == intMax) d[i] = null; + } + return d; + } + + Graphs? kruskal() { + List g = getSortedPathList(); + //int cost = 0; + List res = []; + for (int i = 0; i < _amount; i++) { + res.add(Dot(_dots[i].getName(), _dots[i].num)); + } + List treeId = List.filled(_amount, 0); + for (int i = 0; i < _amount; ++i) { + treeId[i] = i; + } + for (int i = 0; i < g.length; ++i) { + int a = g[i].d - 1, b = g[i].p - 1; + int l = g[i].l; + if (treeId[a] != treeId[b]) { + //cost += l; + res[a].addPath(b + 1, l); + int oldId = treeId[b], newId = treeId[a]; + for (int j = 0; j < _amount; ++j) { + if (treeId[j] == oldId) { + treeId[j] = newId; + } + } + } + } + _dots = res; + return Graphs.fromList(_name, res, _useLength, _oriented); + } + //************Алгоритмы************ +} + +class LenDotPath { + late int l; + late int d; + late int p; + LenDotPath(int len, dot, path) { + l = len; + d = dot; + p = path; + } +} diff --git a/tex/pic/prim1.png b/tex/pic/prim1.png new file mode 100644 index 0000000..e199a1d Binary files /dev/null and b/tex/pic/prim1.png differ diff --git a/tex/texstudio_0wKOIavs62.png b/tex/texstudio_0wKOIavs62.png new file mode 100644 index 0000000..8aafaa0 Binary files /dev/null and b/tex/texstudio_0wKOIavs62.png differ diff --git a/tex/thesis.bib b/tex/thesis.bib index 5b36cf7..7dfb03d 100644 --- a/tex/thesis.bib +++ b/tex/thesis.bib @@ -9,12 +9,40 @@ pages = {119}, } -@BOOK {Algo_2013, +@BOOK{Algo_2013, author={Кормен, Томас Х. and Лейзерсон, Чарльз И. and Ривест, Роналд Л. and Штайн, Клиффорд}, title={Алгоритмы: построение и анализ, 2-е издание}, year={2013}, pages={1296}, - publisher={Издательский дом \"Вильямс\"}, + publisher={Издательский дом ''Вильямс''}, +} + +@Misc{intuit, + title={Лекция 45: Алгоритмы на графах. Алгоритмы обхода графa. [{Э}лектронный ресурс]}, + note={URL:~\url{https://intuit.ru/studies/courses/648/504/lecture/11474} (Дата обращения 20.11.2021). Загл. с экр. Яз. рус.}, +} + +@TechReport{repo, + title={Репозиторий с иходным кодом программы. [{Э}лектронный ресурс]}, + note={URL:~\url{https://morozovad.ddns.net/lnd212/Graphs_dart}} +} + +@Manual{dart_web, + title={Dart overview. [{Э}лектронный ресурс]}, + note={URL:~\url{https://dart.dev/overview} (Дата обращения 20.11.2021). Загл. с экр. Яз. англ.} +} + +@Book{dartInAction, + author={Баккет, К.}, + title={Dart в действии}, + year={2013}, + pages={528}, + publisher={ДМК Пресс}, +} + +@TechReport{futureOfJavascript, + title={Future of Javascript. [{Э}лектронное письмо]}, + note={URL:~\url{https://markmail.org/message/uro3jtoitlmq6x7t}} } @Comment{jabref-meta: databaseType:bibtex;}