diff --git a/README.md b/README.md index 9be7aef..a5495db 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ 1. [Version control](./README.md#version-control) 1. [Contribution guidelines](./.github/CONTRIBUTING.md) 1. [Project documents](./docs) - 1. [Approach - WIP](./docs/Approach.pdf) + 1. [Approach](./docs/Approach.pdf) 1. [Pull request guidelines](./.github/PULL_REQUEST_TEMPLATE.md) 1. [Initial setup](./README.md#initial-setup) 1. [Unit tests](./README.md#run-unit-tests-and-pylint-ratings) diff --git a/docs/Approach.pdf b/docs/Approach.pdf new file mode 100644 index 0000000..162d189 Binary files /dev/null and b/docs/Approach.pdf differ diff --git a/docs/latex/Approach.aux b/docs/latex/Approach.aux new file mode 100644 index 0000000..01b1fdd --- /dev/null +++ b/docs/latex/Approach.aux @@ -0,0 +1,17 @@ +\relax +\providecommand\@newglossary[4]{} +\@newglossary{main}{glg}{gls}{glo} +\@newglossary{symbols}{glg}{sym}{sbl} +\providecommand\@glsorder[1]{} +\providecommand\@istfilename[1]{} +\@istfilename{Approach.ist} +\@glsorder{word} +\@writefile{toc}{\contentsline {section}{\numberline {1}Travelling Salesman Problem}{3}\protected@file@percent } +\newlabel{section:TSP}{{1}{3}{Travelling Salesman Problem}{}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Transportation Problem}{3}\protected@file@percent } +\newlabel{section:Transportation}{{2}{3}{Transportation Problem}{}{}} +\gdef \LT@i {\LT@entry + {1}{28.72194pt}\LT@entry + {1}{219.0021pt}\LT@entry + {1}{46.5021pt}} +\@writefile{toc}{\contentsline {section}{Nomenclature}{4}\protected@file@percent } diff --git a/docs/latex/Approach.bbl b/docs/latex/Approach.bbl new file mode 100644 index 0000000..e69de29 diff --git a/docs/latex/Approach.blg b/docs/latex/Approach.blg new file mode 100644 index 0000000..7c7e28d --- /dev/null +++ b/docs/latex/Approach.blg @@ -0,0 +1,48 @@ +This is BibTeX, Version 0.99d (TeX Live 2019/Debian) +Capacity: max_strings=200000, hash_size=200000, hash_prime=170003 +The top-level auxiliary file: Approach.aux +I found no \citation commands---while reading file Approach.aux +I found no \bibdata command---while reading file Approach.aux +I found no \bibstyle command---while reading file Approach.aux +You've used 0 entries, + 0 wiz_defined-function locations, + 83 strings with 490 characters, +and the built_in function-call counts, 0 in all, are: += -- 0 +> -- 0 +< -- 0 ++ -- 0 +- -- 0 +* -- 0 +:= -- 0 +add.period$ -- 0 +call.type$ -- 0 +change.case$ -- 0 +chr.to.int$ -- 0 +cite$ -- 0 +duplicate$ -- 0 +empty$ -- 0 +format.name$ -- 0 +if$ -- 0 +int.to.chr$ -- 0 +int.to.str$ -- 0 +missing$ -- 0 +newline$ -- 0 +num.names$ -- 0 +pop$ -- 0 +preamble$ -- 0 +purify$ -- 0 +quote$ -- 0 +skip$ -- 0 +stack$ -- 0 +substring$ -- 0 +swap$ -- 0 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 0 +warning$ -- 0 +while$ -- 0 +width$ -- 0 +write$ -- 0 +(There were 3 error messages) diff --git a/docs/latex/Approach.dvi b/docs/latex/Approach.dvi new file mode 100644 index 0000000..d1c0108 Binary files /dev/null and b/docs/latex/Approach.dvi differ diff --git a/docs/latex/Approach.fdb_latexmk b/docs/latex/Approach.fdb_latexmk new file mode 100644 index 0000000..ebaa17c --- /dev/null +++ b/docs/latex/Approach.fdb_latexmk @@ -0,0 +1,123 @@ +# Fdb version 3 +["cusdep glo gls Approach"] 0 "Approach.glo" "Approach.gls" "Approach" 1632906704 + "Approach.glo" 1632906703 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + (generated) + "Approach.gls" +["pdflatex"] 1632906703 "Approach.tex" "Approach.pdf" "Approach" 1632906704 + "/etc/texmf/web2c/texmf.cnf" 1629013707 475 c0e671620eb5563b2130f56340a5fde8 "" + "/usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmbx10.tfm" 1136768653 1328 c834bbb027764024c09d3d2bf908b5f0 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmbx12.tfm" 1136768653 1324 c910af8c371558dc20f2d7822f66fe64 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm" 1136768653 992 662f679a0b3d2d53c1b94050fdaa3f50 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1136768653 1524 4414a8315f39513458b80dfc63bff03a "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1136768653 1512 f21f83efb36853c0b70002322c1ab3ad "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1136768653 1520 eccf95517727cb11801f4f1aee3a21b4 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1136768653 1288 655e228510b4c2a1abe905c368440826 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr17.tfm" 1136768653 1292 296a67155bdbfc32aa9c636f21e91433 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr6.tfm" 1136768653 1300 b62933e007d01cfd073f79b963c01526 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr8.tfm" 1136768653 1292 21c1c5bfeaebccffdb478fd231a0997d "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1136768653 1116 933a60c408fc0a863a92debe84b2d294 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1136768653 1120 8b7d695260f3cff42e636090a8002094 "" + "/usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmti10.tfm" 1136768653 1480 aa8e34af0eb6a2941b776984cf1dfdc4 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb" 1248133631 34811 78b52f49e893bcba91bd7581cdc144c0 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb" 1248133631 32080 340ef9bf63678554ee606688e7b5339d "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb" 1248133631 30251 6afa5cb1d0204815a708a080681d4674 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1248133631 36299 5f9df58c2139e7edcf37c8fca4bd384d "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb" 1248133631 36281 c355509802a035cadc5f15869451dcee "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1248133631 35752 024fb6c41858982481f6968b5fc26508 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb" 1248133631 32722 d7379af29a190c3f453aba36302ff5a9 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb" 1248133631 32362 179c33bbf43f19adbb3825bb4e36e57a "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb" 1248133631 32569 5e5ddc8df908dea60932f3c484a54c0d "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb" 1248133631 32716 08e384dc442464e7285e891af9f45947 "" + "/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb" 1248133631 37944 359e864bd06cde3b1cf57bb20757fb06 "" + "/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b "" + "/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e "" + "/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty" 1573336935 6902 30fdaf7dc5636b8e3afa306210c45cae "" + "/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb "" + "/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed "" + "/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty" 1576624944 13807 952b0226d4efca026f0e19dd266dcc22 "" + "/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1576624883 18552 1e1cc7b75da0dfaacce7cdcb27d306bf "" + "/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex" 1417732693 19231 26434a5656c684f5ffb1f26f98006baa "" + "/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex" 1403829539 7677 6f5ce7c1124cad7ec57d05b2562bd8fe "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1523134290 2211 ca7ce284ab93c8eecdc6029dc5ccbd73 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty" 1523134290 4161 7f6eb9092061a11f87d08ed13515b48d "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty" 1580683321 85660 baee036978c7a91f4e2bba43f05e5945 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty" 1523134290 4116 32e6abd27229755a83a8b7f18e583890 "" + "/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty" 1523134290 2432 8ff93b1137020e8f21930562a874ae66 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/article.cls" 1580683321 20023 e427dd9e17e239bf926ef3aab67fe35e "" + "/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty" 1580683321 5159 892429808d9e0e2b3548aaefd9a06ed0 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty" 1580683321 5050 8933a39ad74377accd18991c5eb90c58 "" + "/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo" 1580683321 8446 9874cccac5fee462272c582807dbbf56 "" + "/usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-base.sty" 1569706369 93620 4e9f9aa754a2337e89df3eeca1527291 "" + "/usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-fp.sty" 1569706369 3944 92aa06b5428fcc1b751c82409f23f92f "" + "/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce "" + "/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1569190624 45259 743c52a37a6e5ed83cfe0e128b2da10d "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/defpattern.sty" 1137110169 1081 6a8d78d0e6b2d89334f92fd122c1da99 "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-addons.sty" 1137110169 1275 fe903646b72b3e877914d78f2db9ddda "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-basic.sty" 1137110169 29695 b6366b50463dfb367cf560419d0cea8d "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-eqn.sty" 1137110169 11336 afed7aa5dbc4bf246950282b95e522c2 "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-eval.sty" 1137110169 6220 eeeffd00d1235e73c380c6dc9f30ac43 "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-exp.sty" 1547588415 16965 df20a610ce368cd126fd73d1a4e4fef1 "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-pas.sty" 1137110169 3006 6fd5da0dc83ba1d19525f1fb08dca7df "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-random.sty" 1137110169 3702 6e54ac63212901d59e6ea2a32b0a7689 "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-snap.sty" 1137110169 6519 c1e5d3c6aed32ba782f756d79578d87b "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-trigo.sty" 1137110169 28969 342a2de338e342de95d2551557e50f06 "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp-upn.sty" 1137110169 7154 78a835a719e27a484e63f1f98ba4df11 "" + "/usr/share/texlive/texmf-dist/tex/latex/fp/fp.sty" 1137110169 983 d84df22b060ce125f89a32c403dcab31 "" + "/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a "" + "/usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries-compatible-307.sty" 1581719257 17594 b1f30c100e6c4a84fc324e679cdad469 "" + "/usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries.sty" 1581719257 246983 dc09ee79208a213e473ad8f4b820c489 "" + "/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty" 1581719257 4624 86487b9ee26fafb70a235fa3725f7556 "" + "/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty" 1581719257 5510 b7efff6f530fc5cc5465fac1a02d43a3 "" + "/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty" 1581719257 7924 9aaf12b8ac695d99ce7a6bf93f76e7bb "" + "/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty" 1581719257 8941 65bace05e177a95d8c3c2b8f6bf67936 "" + "/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty" 1581719257 11406 5537c52bce993c8383e369666b0bfa31 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def" 1515537368 17334 520b9b85ad8a2a48eda3f643e27a5179 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty" 1580683321 16932 04729abe63b66ec59ea56edcd722b058 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty" 1580683321 9067 1b996612394a52e1efe89c8bfe8a5892 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty" 1580683321 2590 e3b24ff953e5b58d924f163d25380312 "" + "/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty" 1580683321 3976 d7fa7d81d2870d509d25b17d0245e735 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty" 1579642962 13244 0070bcab7b5a88187847128d22faf4d8 "" + "/usr/share/texlive/texmf-dist/tex/latex/hyphenat/hyphenat.sty" 1252025529 5798 0437b031e663035b68539cf7ac7c8eeb "" + "/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1575152344 22520 c4c2dab203104295e1e618be7e5c0f5b "" + "/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def" 1580854751 25404 9d60f463a00d154207ec0048dee27cf0 "" + "/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af "" + "/usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty" 1579298046 55081 be7d8405cd93834f75bdf98c6521d2a0 "" + "/usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty" 1496786006 5317 cf75154a8a7e6436f05a5be497f0b05e "" + "/usr/share/texlive/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty" 1510693693 12293 1ffb9177486ec6129ddddbf1de7b2220 "" + "/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 "" + "/usr/share/texlive/texmf-dist/tex/latex/sectsty/sectsty.sty" 1137110779 22423 d476012cd03f82f9475ad54ba6cd3267 "" + "/usr/share/texlive/texmf-dist/tex/latex/setspace/setspace.sty" 1324344192 22913 a27d7908fc6f0385466454a966a316eb "" + "/usr/share/texlive/texmf-dist/tex/latex/sttools/cuted.sty" 1350599623 17058 21763634ae8a2f38e062576e588fbf25 "" + "/usr/share/texlive/texmf-dist/tex/latex/substr/substr.sty" 1258848659 5724 d3505925e87b345f11a5f17d58550dea "" + "/usr/share/texlive/texmf-dist/tex/latex/supertabular/supertabular.sty" 1580769125 15405 31e477e611bb77761a134e5593e8119d "" + "/usr/share/texlive/texmf-dist/tex/latex/textcase/textcase.sty" 1568497026 2156 a092fd3ecd0a13fd597725ee6894b032 "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty" 1580683321 10216 5efd55f2010055e7b7875afd6a75be82 "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty" 1580683321 3469 19b6cb25f21abe53fb90b9fe27615441 "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty" 1580683321 12133 b1e3e65b69714dbfcc5e6c0b19d66b50 "" + "/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty" 1580683321 31532 04852e45d7c17cb384689d2f83b628d3 "" + "/usr/share/texlive/texmf-dist/tex/latex/xfor/xfor.sty" 1233902931 2689 44855b72da58344b1c1d9b3087bce6ca "" + "/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty" 1417732693 4962 9c1069474ff71dbc47d5006555e352d3 "" + "/usr/share/texlive/texmf-dist/web2c/texmf.cnf" 1581979058 38841 ce3692aa899bb693b90b87eaa5d4d84e "" + "/usr/share/texmf/web2c/texmf.cnf" 1581979058 38841 ce3692aa899bb693b90b87eaa5d4d84e "" + "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1629013737 4770781 1ed1abab22da9c3e2cc82e4db562318b "" + "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1629013778 8275483 40edf9b62d347bc6d0b0ac01feb0d598 "" + "Approach.aux" 1632906704 767 fe02c0f19331742d29727545189556c9 "pdflatex" + "Approach.gls" 1632905608 6 9f404503043ec80c08484be9f659189e "cusdep glo gls Approach" + "Approach.lot" 1632906703 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex" + "Approach.sym" 1632905608 1852 07d5601c401c4c26b84fcd5af6b78fa5 "" + "Approach.tex" 1632906703 7698 5ac2bae96fbc87f17e54af5607ebf400 "" + "Approach.toc" 1632906704 181 b53321529a6b183e488c99dcde40e4af "pdflatex" + (generated) + "Approach.lot" + "Approach.sbl" + "Approach.pdf" + "Approach.ist" + "Approach.glo" + "Approach.toc" + "Approach.aux" + "Approach.log" diff --git a/docs/latex/Approach.fls b/docs/latex/Approach.fls new file mode 100644 index 0000000..f1156fe --- /dev/null +++ b/docs/latex/Approach.fls @@ -0,0 +1,197 @@ +PWD /media/ph33r/Data/Project/mllib/Git/docs/latex +INPUT /etc/texmf/web2c/texmf.cnf +INPUT /usr/share/texmf/web2c/texmf.cnf +INPUT /usr/share/texlive/texmf-dist/web2c/texmf.cnf +INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt +INPUT Approach.tex +OUTPUT Approach.log +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/article.cls +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/sectsty/sectsty.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/sectsty/sectsty.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyphenat/hyphenat.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyphenat/hyphenat.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/setspace/setspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/setspace/setspace.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/sttools/cuted.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/sttools/cuted.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +INPUT /usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +INPUT /usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +INPUT /usr/share/texlive/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/textcase/textcase.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/textcase/textcase.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xfor/xfor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/xfor/xfor.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substr/substr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/substr/substr.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-fp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-fp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/defpattern.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/defpattern.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-basic.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-basic.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-addons.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-addons.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-snap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-snap.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-exp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-exp.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-trigo.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-trigo.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-pas.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-pas.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-random.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-random.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-eqn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-eqn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-upn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-upn.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-eval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/fp/fp-eval.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/supertabular/supertabular.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries-compatible-307.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries-compatible-307.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/supertabular/supertabular.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/supertabular/supertabular.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty +OUTPUT Approach.glo +OUTPUT Approach.sbl +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +INPUT Approach.aux +INPUT Approach.aux +OUTPUT Approach.aux +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +INPUT /usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr17.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr12.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr6.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmex10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +OUTPUT Approach.pdf +OUTPUT Approach.ist +INPUT /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmbx10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmbx12.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmr12.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmbx12.tfm +INPUT Approach.toc +INPUT Approach.toc +OUTPUT Approach.toc +INPUT Approach.lot +INPUT Approach.lot +OUTPUT Approach.lot +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/cm/cmti10.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +INPUT /usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm +INPUT Approach.gls +INPUT Approach.gls +INPUT Approach.gls +INPUT Approach.sym +INPUT Approach.sym +INPUT Approach.sym +INPUT Approach.aux +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb +INPUT /usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb diff --git a/docs/latex/Approach.glg b/docs/latex/Approach.glg new file mode 100644 index 0000000..5744112 --- /dev/null +++ b/docs/latex/Approach.glg @@ -0,0 +1,7 @@ +This is makeindex, version 2.15 [TeX Live 2019] (kpathsea + Thai support). +Scanning style file ./Approach.ist.............................done (29 attributes redefined, 0 ignored). +Scanning input file Approach.sbl....done (102 entries accepted, 0 rejected). +Sorting entries....done (813 comparisons). +Generating output file Approach.sym....done (36 lines written, 0 warnings). +Output written in Approach.sym. +Transcript written in Approach.glg. diff --git a/docs/latex/Approach.glo b/docs/latex/Approach.glo new file mode 100644 index 0000000..e69de29 diff --git a/docs/latex/Approach.gls b/docs/latex/Approach.gls new file mode 100644 index 0000000..7024956 --- /dev/null +++ b/docs/latex/Approach.gls @@ -0,0 +1 @@ +\null diff --git a/docs/latex/Approach.ist b/docs/latex/Approach.ist new file mode 100644 index 0000000..e4b548c --- /dev/null +++ b/docs/latex/Approach.ist @@ -0,0 +1,31 @@ +% makeindex style file created by the glossaries package +% for document 'Approach' on 2021-9-29 +actual '?' +encap '|' +level '!' +quote '"' +keyword "\\glossaryentry" +preamble "\\glossarysection[\\glossarytoctitle]{\\glossarytitle}\\glossarypreamble\n\\begin{theglossary}\\glossaryheader\n" +postamble "\%\n\\end{theglossary}\\glossarypostamble\n" +group_skip "\\glsgroupskip\n" +item_0 "\%\n" +item_1 "\%\n" +item_2 "\%\n" +item_01 "\%\n" +item_x1 "\\relax \\glsresetentrylist\n" +item_12 "\%\n" +item_x2 "\\relax \\glsresetentrylist\n" +delim_0 "\{\\glossaryentrynumbers\{\\relax " +delim_1 "\{\\glossaryentrynumbers\{\\relax " +delim_2 "\{\\glossaryentrynumbers\{\\relax " +delim_t "\}\}" +delim_n "\\delimN " +delim_r "\\delimR " +headings_flag 1 +heading_prefix "\\glsgroupheading\{" +heading_suffix "\}\\relax \\glsresetentrylist " +symhead_positive "glssymbols" +numhead_positive "glsnumbers" +page_compositor "." +suffix_2p "" +suffix_3p "" diff --git a/docs/latex/Approach.log b/docs/latex/Approach.log new file mode 100644 index 0000000..c269fc3 --- /dev/null +++ b/docs/latex/Approach.log @@ -0,0 +1,546 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex 2021.8.15) 29 SEP 2021 14:41 +entering extended mode + restricted \write18 enabled. + file:line:error style messages enabled. + %&-line parsing enabled. +**Approach.tex +(./Approach.tex +LaTeX2e <2020-02-02> patch level 2 +L3 programming layer <2020-02-14> (/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2019/12/20 v1.4l Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2019/12/20 v1.4l Standard LaTeX file (size option) +) +\c@part=\count167 +\c@section=\count168 +\c@subsection=\count169 +\c@subsubsection=\count170 +\c@paragraph=\count171 +\c@subparagraph=\count172 +\c@figure=\count173 +\c@table=\count174 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen134 +) (/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +Package: multicol 2019/12/09 v1.8y multicolumn formatting (FMi) +\c@tracingmulticols=\count175 +\mult@box=\box45 +\multicol@leftmargin=\dimen135 +\c@unbalance=\count176 +\c@collectmore=\count177 +\doublecol@number=\count178 +\multicoltolerance=\count179 +\multicolpretolerance=\count180 +\full@width=\dimen136 +\page@free=\dimen137 +\premulticols=\dimen138 +\postmulticols=\dimen139 +\multicolsep=\skip49 +\multicolbaselineskip=\skip50 +\partial@page=\box46 +\last@line=\box47 +\maxbalancingoverflow=\dimen140 +\mult@rightbox=\box48 +\mult@grightbox=\box49 +\mult@gfirstbox=\box50 +\mult@firstbox=\box51 +\@tempa=\box52 +\@tempa=\box53 +\@tempa=\box54 +\@tempa=\box55 +\@tempa=\box56 +\@tempa=\box57 +\@tempa=\box58 +\@tempa=\box59 +\@tempa=\box60 +\@tempa=\box61 +\@tempa=\box62 +\@tempa=\box63 +\@tempa=\box64 +\@tempa=\box65 +\@tempa=\box66 +\@tempa=\box67 +\@tempa=\box68 +\@tempa=\box69 +\@tempa=\box70 +\@tempa=\box71 +\@tempa=\box72 +\@tempa=\box73 +\@tempa=\box74 +\@tempa=\box75 +\@tempa=\box76 +\@tempa=\box77 +\@tempa=\box78 +\@tempa=\box79 +\@tempa=\box80 +\@tempa=\box81 +\@tempa=\box82 +\@tempa=\box83 +\@tempa=\box84 +\@tempa=\box85 +\@tempa=\box86 +\@tempa=\box87 +\@tempa=\box88 +\c@minrows=\count181 +\c@columnbadness=\count182 +\c@finalcolumnbadness=\count183 +\last@try=\dimen141 +\multicolovershoot=\dimen142 +\multicolundershoot=\dimen143 +\mult@nat@firstbox=\box89 +\colbreak@box=\box90 +\mc@col@check@num=\count184 +) (/usr/share/texlive/texmf-dist/tex/latex/mathtools/mathtools.sty +Package: mathtools 2020/01/17 v1.23 mathematical typesetting tools + (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks14 +) (/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty +Package: calc 2017/05/25 v4.3 Infix arithmetic (KKT,FJ) +\calc@Acount=\count185 +\calc@Bcount=\count186 +\calc@Adimen=\dimen144 +\calc@Bdimen=\dimen145 +\calc@Askip=\skip51 +\calc@Bskip=\skip52 +LaTeX Info: Redefining \setlength on input line 80. +LaTeX Info: Redefining \addtolength on input line 81. +\calc@Ccount=\count187 +\calc@Cskip=\skip53 +) (/usr/share/texlive/texmf-dist/tex/latex/mathtools/mhsetup.sty +Package: mhsetup 2017/03/31 v1.3 programming setup (MH) +) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/01/20 v2.17e AMS math features +\@mathmargin=\skip54 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks15 +\ex@=\dimen146 +)) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen147 +) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count188 +LaTeX Info: Redefining \frac on input line 227. +\uproot@=\count189 +\leftroot@=\count190 +LaTeX Info: Redefining \overline on input line 389. +\classnum@=\count191 +\DOTSCASE@=\count192 +LaTeX Info: Redefining \ldots on input line 486. +LaTeX Info: Redefining \dots on input line 489. +LaTeX Info: Redefining \cdots on input line 610. +\Mathstrutbox@=\box91 +\strutbox@=\box92 +\big@size=\dimen148 +LaTeX Font Info: Redeclaring font encoding OML on input line 733. +LaTeX Font Info: Redeclaring font encoding OMS on input line 734. +\macc@depth=\count193 +\c@MaxMatrixCols=\count194 +\dotsspace@=\muskip16 +\c@parentequation=\count195 +\dspbrk@lvl=\count196 +\tag@help=\toks16 +\row@=\count197 +\column@=\count198 +\maxfields@=\count199 +\andhelp@=\toks17 +\eqnshift@=\dimen149 +\alignsep@=\dimen150 +\tagshift@=\dimen151 +\tagwidth@=\dimen152 +\totwidth@=\dimen153 +\lineht@=\dimen154 +\@envbody=\toks18 +\multlinegap=\skip55 +\multlinetaggap=\skip56 +\mathdisplay@stack=\toks19 +LaTeX Info: Redefining \[ on input line 2859. +LaTeX Info: Redefining \] on input line 2860. +) +LaTeX Info: Thecontrolsequence`\('isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\)'isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\['isalreadyrobust on input line 129. +LaTeX Info: Thecontrolsequence`\]'isalreadyrobust on input line 129. +\g_MT_multlinerow_int=\count266 +\l_MT_multwidth_dim=\dimen155 +\origjot=\skip57 +\l_MT_shortvdotswithinadjustabove_dim=\dimen156 +\l_MT_shortvdotswithinadjustbelow_dim=\dimen157 +\l_MT_above_intertext_sep=\dimen158 +\l_MT_below_intertext_sep=\dimen159 +\l_MT_above_shortintertext_sep=\dimen160 +\l_MT_below_shortintertext_sep=\dimen161 +) (/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + (/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + (/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2019/11/07 v1.0c TeX engine tests +)) +\Gm@cnth=\count267 +\Gm@cntv=\count268 +\c@Gm@tempcnt=\count269 +\Gm@bindingoffset=\dimen162 +\Gm@wd@mp=\dimen163 +\Gm@odd@mp=\dimen164 +\Gm@even@mp=\dimen165 +\Gm@layoutwidth=\dimen166 +\Gm@layoutheight=\dimen167 +\Gm@layouthoffset=\dimen168 +\Gm@layoutvoffset=\dimen169 +\Gm@dimlist=\toks20 +) (/usr/share/texlive/texmf-dist/tex/latex/tools/enumerate.sty +Package: enumerate 2015/07/23 v3.00 enumerate extensions (DPC) +\@enLab=\toks21 +) (/usr/share/texlive/texmf-dist/tex/latex/sectsty/sectsty.sty +Package: sectsty 2002/02/25 v2.0.2 Commands to change all sectional heading styles + + +LaTeX Warning: Command \underbar has changed. + Check if current package is valid. + + +LaTeX Warning: Command \underline has changed. + Check if current package is valid. + +) (/usr/share/texlive/texmf-dist/tex/latex/hyphenat/hyphenat.sty +Package: hyphenat 2009/09/02 v2.3c hyphenation utilities +\langwohyphens=\language85 +LaTeX Info: Redefining \_ on input line 43. +) (/usr/share/texlive/texmf-dist/tex/latex/setspace/setspace.sty +Package: setspace 2011/12/19 v6.7a set line spacing +) (/usr/share/texlive/texmf-dist/tex/latex/sttools/cuted.sty +Package: cuted 2012/10/04 v1.5 Mixing onecolumn and twocolumn modes +\At@ViperColsBreak=\toks22 +\v@aaa=\box93 +\v@ccc=\box94 +\lastskip@a=\skip58 +\lastskip@b=\skip59 +\lastskip@d=\skip60 +\lastbox@a=\box95 +\stripsep=\skip61 +\@viper=\box96 +\viper@penalty=\count270 +\hold@viper=\box97 +\ht@viper=\dimen170 +) (/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + (/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) + (/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO) +) (/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +)) (/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) + (/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO) + (/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +\c@section@level=\count271 +LaTeX Info: Redefining \ref on input line 356. +LaTeX Info: Redefining \pageref on input line 356. +) (/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2018/08/11 v1.3c Input encoding file +\inpenc@prehook=\toks23 +\inpenc@posthook=\toks24 +) (/usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries.sty +Package: glossaries 2020/02/13 v4.45 (NLCT) + (/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC) +) (/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2014/12/03 v2.7a package option processing (HA) + (/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks25 +\XKV@tempa@toks=\toks26 +) +\XKV@depth=\count272 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) (/usr/share/texlive/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty +Package: mfirstuc 2017/11/14 v2.06 (NLCT) + (/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2019/09/21 v2.5h e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count273 +) +\@glsmfirst=\toks27 +\@glsmrest=\toks28 +) (/usr/share/texlive/texmf-dist/tex/latex/textcase/textcase.sty +Package: textcase 2019/09/14 v1.00 Text only upper/lower case changing (DPC) +) (/usr/share/texlive/texmf-dist/tex/latex/xfor/xfor.sty +Package: xfor 2009/02/05 v1.05 (NLCT) +) (/usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-base.sty +Package: datatool-base 2019/09/27 v2.32 (NLCT) + (/usr/share/texlive/texmf-dist/tex/latex/substr/substr.sty +Package: substr 2009/10/20 v1.2 Handle substrings +\c@su@anzahl=\count274 +) (/usr/share/texlive/texmf-dist/tex/latex/datatool/datatool-fp.sty +Package: datatool-fp 2019/09/27 v2.32 (NLCT) + (/usr/share/texlive/texmf-dist/tex/latex/fp/fp.sty +Package: fp 1995/04/02 + `Fixed Point Package', Version 0.8, April 2, 1995 (C) Michael Mehlich (/usr/share/texlive/texmf-dist/tex/latex/fp/defpattern.sty +Package: defpattern 1994/10/12 +\actioncount=\count275 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-basic.sty +Package: fp-basic 1996/05/13 +\FP@xs=\count276 +\FP@xia=\count277 +\FP@xib=\count278 +\FP@xfa=\count279 +\FP@xfb=\count280 +\FP@rega=\count281 +\FP@regb=\count282 +\FP@regs=\count283 +\FP@times=\count284 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-addons.sty +Package: fp-addons 1995/03/15 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-snap.sty +Package: fp-snap 1995/04/05 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-exp.sty +Package: fp-exp 1995/04/03 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-trigo.sty +Package: fp-trigo 1995/04/14 +) +(/usr/share/texlive/texmf-dist/tex/latex/fp/fp-pas.sty +Package: fp-pas 1994/08/29 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-random.sty +Package: fp-random 1995/02/23 +\FPseed=\count285 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-eqn.sty +Package: fp-eqn 1995/04/03 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-upn.sty +Package: fp-upn 1996/10/21 +) (/usr/share/texlive/texmf-dist/tex/latex/fp/fp-eval.sty +Package: fp-eval 1995/04/03 +))) +\@dtl@toks=\toks29 +\@dtl@tmpcount=\count286 +\dtl@tmplength=\skip62 +\dtl@sortresult=\count287 +\@dtl@numgrpsepcount=\count288 +\@dtl@datatype=\count289 +\dtl@codeA=\count290 +\dtl@codeB=\count291 +\@dtl@foreach@level=\count292 +) (/usr/share/texlive/texmf-dist/tex/latex/glossaries/base/glossaries-compatible-307.sty +Package: glossaries-compatible-307 2020/02/13 v4.45 (NLCT) +) +\gls@level=\count293 +\@gls@tmpb=\toks30 +\gls@tmplen=\skip63 +\glskeylisttok=\toks31 +\glslabeltok=\toks32 +\glsshorttok=\toks33 +\glslongtok=\toks34 + (/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty +Package: glossary-hypernav 2020/02/13 v4.45 (NLCT) +) (/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty +Package: glossary-list 2020/02/13 v4.45 (NLCT) +\glslistdottedwidth=\skip64 +) (/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty +Package: glossary-long 2020/02/13 v4.45 (NLCT) + (/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip65 +\LTright=\skip66 +\LTpre=\skip67 +\LTpost=\skip68 +\LTchunksize=\count294 +\LTcapwidth=\dimen171 +\LT@head=\box98 +\LT@firsthead=\box99 +\LT@foot=\box100 +\LT@lastfoot=\box101 +\LT@cols=\count295 +\LT@rows=\count296 +\c@LT@tables=\count297 +\c@LT@chunks=\count298 +\LT@p@ftn=\toks35 +) +\glsdescwidth=\skip69 +\glspagelistwidth=\skip70 +) (/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty +Package: glossary-super 2020/02/13 v4.45 (NLCT) + (/usr/share/texlive/texmf-dist/tex/latex/supertabular/supertabular.sty +Package: supertabular 2020/02/02 v4.1g the supertabular environment +\c@tracingst=\count299 +\ST@wd=\dimen172 +\ST@rightskip=\skip71 +\ST@leftskip=\skip72 +\ST@parfillskip=\skip73 +\ST@pageleft=\dimen173 +\ST@headht=\dimen174 +\ST@tailht=\dimen175 +\ST@pagesofar=\dimen176 +\ST@pboxht=\dimen177 +\ST@lineht=\dimen178 +\ST@prevht=\dimen179 +\ST@toadd=\dimen180 +\ST@dimen=\dimen181 +\ST@pbox=\box102 +)) (/usr/share/texlive/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty +Package: glossary-tree 2020/02/13 v4.45 (NLCT) +\glstreeindent=\skip74 +)) + +Package glossaries Warning: Use of \makeglossary with glossaries.sty is +(glossaries) deprecated. Use \makeglossaries instead. If you +(glossaries) need the original definition of \makeglossary use +(glossaries) the package options kernelglossredefs=false (to +(glossaries) restore the former definition of \makeglossary) and +(glossaries) nomain (if the file extensions cause a conflict) on input line 24. + +\glswrite=\write3 +\glo@main@file=\write4 +\openout4 = `Approach.glo'. + +Package glossaries Info: Writing glossary file Approach.glo on input line 24. +\glo@symbols@file=\write5 +\openout5 = `Approach.sbl'. + +Package glossaries Info: Writing glossary file Approach.sbl on input line 24. +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +File: l3backend-pdfmode.def 2020-02-03 L3 backend support: PDF mode +\l__kernel_color_stack_int=\count300 +\l__pdf_internal_box=\box103 +) (./Approach.aux) +\openout1 = `Approach.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 182. +LaTeX Font Info: ... okay on input line 182. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 182. +LaTeX Font Info: ... okay on input line 182. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 182. +LaTeX Font Info: ... okay on input line 182. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 182. +LaTeX Font Info: ... okay on input line 182. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 182. +LaTeX Font Info: ... okay on input line 182. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 182. +LaTeX Font Info: ... okay on input line 182. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 182. +LaTeX Font Info: ... okay on input line 182. + (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR) + (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR) + (/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) (/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. + (/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex + (/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count301 +\scratchdimen=\dimen182 +\scratchbox=\box104 +\nofMPsegments=\count302 +\nofMParguments=\count303 +\everyMPshowfont=\toks36 +\MPscratchCnt=\count304 +\MPscratchDim=\dimen183 +\MPnumerator=\count305 +\makeMPintoPDFobject=\count306 +\everyMPtoPDFconversion=\toks37 +))) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 485. + (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Live +)) +\Gin@req@height=\dimen184 +\Gin@req@width=\dimen185 +) +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(81.94394pt, 433.62pt, 81.94394pt) +* v-part:(T,H,B)=(106.75473pt, 578.15999pt, 160.13213pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=433.62pt +* \textheight=578.15999pt +* \oddsidemargin=9.67395pt +* \evensidemargin=9.67395pt +* \topmargin=-2.51526pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=10.0pt +* \footskip=30.0pt +* \marginparwidth=65.0pt +* \marginparsep=11.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +[1 + +\openout3 = `Approach.ist'. + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] +Underfull \hbox (badness 10000) in paragraph at lines 190--191 + + [] + + +./Approach.tex:201: LaTeX Error: \begin{enumerate} on input line 198 ended by \end{itemize}. + +See the LaTeX manual or LaTeX Companion for explanation. +Type H for immediate help. + ... + +l.201 \end{itemize} + +Your command was ignored. +Type I to replace it with another command, +or to continue without it. + +[1] (./Approach.toc) +\tf@toc=\write6 +\openout6 = `Approach.toc'. + + (./Approach.lot) +\tf@lot=\write7 +\openout7 = `Approach.lot'. + + [2] [3] (./Approach.gls) (./Approach.sym) [4] (./Approach.aux) ) +Here is how much of TeX's memory you used: + 8253 strings out of 481239 + 126682 string characters out of 5920377 + 457089 words of memory out of 5000000 + 23342 multiletter control sequences out of 15000+600000 + 538067 words of font info for 44 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 51i,15n,47p,988b,535s stack positions out of 5000i,500n,10000p,200000b,80000s + +Output written on Approach.pdf (5 pages, 125066 bytes). +PDF statistics: + 64 PDF objects out of 1000 (max. 8388607) + 45 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/docs/latex/Approach.lot b/docs/latex/Approach.lot new file mode 100644 index 0000000..e69de29 diff --git a/docs/latex/Approach.pdf b/docs/latex/Approach.pdf new file mode 100644 index 0000000..162d189 Binary files /dev/null and b/docs/latex/Approach.pdf differ diff --git a/docs/latex/Approach.sbl b/docs/latex/Approach.sbl new file mode 100644 index 0000000..2218d16 --- /dev/null +++ b/docs/latex/Approach.sbl @@ -0,0 +1,116 @@ +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{03?\glossentry{city_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{03?\glossentry{city_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{05?\glossentry{distance}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{06?\glossentry{dv_xij}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{07?\glossentry{av_ui}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{08?\glossentry{av_uj}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{03?\glossentry{city_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{03?\glossentry{city_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{06?\glossentry{dv_xij}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{05?\glossentry{distance}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{06?\glossentry{dv_xij}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{06?\glossentry{dv_xij}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{07?\glossentry{av_ui}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{08?\glossentry{av_uj}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{04?\glossentry{city_count}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{06?\glossentry{dv_xij}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{04?\glossentry{city_count}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{04?\glossentry{city_count}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{04?\glossentry{city_count}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{091?\glossentry{supply_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{093?\glossentry{demand_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{094?\glossentry{cost}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{096?\glossentry{supply_qty}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{097?\glossentry{demand_qty}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{095?\glossentry{dv_xsd}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{091?\glossentry{supply_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{093?\glossentry{demand_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{095?\glossentry{dv_xsd}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{094?\glossentry{cost}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{093?\glossentry{demand_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{095?\glossentry{dv_xsd}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{096?\glossentry{supply_qty}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{091?\glossentry{supply_set}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{095?\glossentry{dv_xsd}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{097?\glossentry{demand_qty}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{3} +\glossaryentry{03?\glossentry{city_set}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{01?\glossentry{city_source}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{02?\glossentry{city_destination}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{09?\glossentry{supply_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{4} +\glossaryentry{092?\glossentry{demand_node}|setentrycounter[]{page}\glsnumberformat}{4} diff --git a/docs/latex/Approach.sym b/docs/latex/Approach.sym new file mode 100644 index 0000000..8dfaec2 --- /dev/null +++ b/docs/latex/Approach.sym @@ -0,0 +1,36 @@ +\glossarysection[\glossarytoctitle]{\glossarytitle}\glossarypreamble +\begin{theglossary}\glossaryheader +\glsgroupheading{glsnumbers}\relax \glsresetentrylist % +\glossentry{city_source}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3\delimN 4}}}% +\glossentry{city_destination}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3\delimN 4}}}% +\glossentry{city_set}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3\delimN 4}}}% +\glossentry{city_count}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{distance}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{dv_xij}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{av_ui}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{av_uj}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{supply_node}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{supply_set}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{demand_node}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{demand_set}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{cost}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{dv_xsd}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{supply_qty}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\glossentry{demand_qty}{\glossaryentrynumbers{\relax + \setentrycounter[]{page}\glsnumberformat{3}}}% +\end{theglossary}\glossarypostamble diff --git a/docs/latex/Approach.synctex.gz b/docs/latex/Approach.synctex.gz new file mode 100644 index 0000000..3aa7db7 Binary files /dev/null and b/docs/latex/Approach.synctex.gz differ diff --git a/docs/latex/Approach.tex b/docs/latex/Approach.tex new file mode 100644 index 0000000..08d0e9d --- /dev/null +++ b/docs/latex/Approach.tex @@ -0,0 +1,348 @@ +\documentclass[titlepage]{article} +\usepackage{multicol} +\usepackage{mathtools} +\usepackage{amsmath} +\usepackage[a4paper, total={6in, 8in}]{geometry} +\usepackage{enumerate} +\usepackage{sectsty} +\usepackage[none]{hyphenat} +\usepackage{setspace} +\usepackage{cuted} +\usepackage{nameref} +\usepackage[utf8]{inputenc} + +\DeclareMathOperator*{\argmin}{argmin} +\DeclareMathOperator*{\argmax}{argmax} + +%-------------------------------------------------------------------------------- +% Notations + +\usepackage[nopostdot, style=long3col, nonumberlist, toc]{glossaries} + +\newglossary{symbols}{sym}{sbl}{Nomenclature} + +\makeglossary + + +\newglossaryentry{city_source} +{ +type=symbols, +name={\ensuremath{i}}, +sort={01}, +description={Source city} +} + +\newglossaryentry{city_destination} +{ +type=symbols, +name={\ensuremath{j}}, +sort={02}, +description={Destination city} +} + +\newglossaryentry{city_set} +{ +type=symbols, +name={\ensuremath{I}}, +sort={03}, +description={Set of cities} +} + +\newglossaryentry{city_count} +{ +type=symbols, +name={\ensuremath{N}}, +sort={04}, +description={Total number of cities (\gls{city_set})} +} + +\newglossaryentry{distance} +{ +type=symbols, +name={\ensuremath{D_{\gls{city_source}\gls{city_destination}}}}, +sort={05}, +description={Distance between source city \gls{city_source} and destination city \gls{city_destination}} +} + +\newglossaryentry{dv_xij} +{ +type=symbols, +name={\ensuremath{X_{\gls{city_source}\gls{city_destination}}}}, +sort={06}, +description={Binary flag, sales man travels from source city \gls{city_source} to desination city \gls{city_destination}} +} + +\newglossaryentry{av_ui} +{ +type=symbols, +name={\ensuremath{U_{\gls{city_source}}}}, +sort={07}, +description={Integer, artificial variable for source city \gls{city_source}} +} + +\newglossaryentry{av_uj} +{ +type=symbols, +name={\ensuremath{U_{\gls{city_destination}}}}, +sort={08}, +description={Integer, artificial variable for destination city \gls{city_destination}} +} + + +\newglossaryentry{supply_node} +{ +type=symbols, +name={\ensuremath{s}}, +sort={09}, +description={Supply node} +} + +\newglossaryentry{supply_set} +{ +type=symbols, +name={\ensuremath{S}}, +sort={091}, +description={List of supply nodes \gls{supply_node}} +} + +\newglossaryentry{demand_node} +{ +type=symbols, +name={\ensuremath{d}}, +sort={092}, +description={Demand node} +} + +\newglossaryentry{demand_set} +{ +type=symbols, +name={\ensuremath{D}}, +sort={093}, +description={List of demand nodes \gls{demand_node}} +} + + +\newglossaryentry{cost} +{ +type=symbols, +name={\ensuremath{C_{\gls{supply_node}\gls{demand_node}}}}, +sort={094}, +description={Cost to transport one unit from supply node \gls{supply_node} to demand node \gls{demand_node}} +} + +\newglossaryentry{dv_xsd} +{ +type=symbols, +name={\ensuremath{X_{\gls{supply_node}\gls{demand_node}}}}, +sort={095}, +description={Integer, quantity transported from supply node \gls{supply_node} to demand node \gls{demand_node}} +} + +\newglossaryentry{supply_qty} +{ +type=symbols, +name={\ensuremath{Q_{\gls{supply_node}}}}, +sort={096}, +description={Supply quantity for node \gls{supply_node}} +} + +\newglossaryentry{demand_qty} +{ +type=symbols, +name={\ensuremath{Q_{\gls{demand_node}}}}, +sort={097}, +description={Demand quantity for node \gls{demand_node}} +} + + +%-------------------------------------------------------------------------------- +%Title and section font sizes + +\parttitlefont{\Large} +\sectionfont{\large} + +%-------------------------------------------------------------------------------- + +\renewenvironment{abstract} + {\par\noindent\textbf{\Large\abstractname}\\ \ignorespaces} + {\par\medskip} + + +%-------------------------------------------------------------------------------- +% Title + +\title{Optimization module} +\author{ +Diptesh Basak\\ +\and +Madhu Tangudu\\ +} +\date{\today} + +\begin{document} + +\maketitle + +%-------------------------------------------------------------------------------- + +\pagebreak + +\begin{abstract} +\hrule +\hfill +\doublespacing +\newline The objective of this document is to provide a structure for all +future documentation for all products. In this paper, we illustrate some of the optimization techniques which has +been implemented namely: + +\begin{enumerate}[i] + \item Travelling salesman problem + \item Transportation problem +\end{itemize} + +\end{abstract} + +\pagebreak + +\tableofcontents + +\listoftables + +\pagebreak + +\hrule + +\begin{multicols}{2} + +\section{Travelling Salesman Problem} +\label{section:TSP} + +The travelling salesman problem (TSP) is about given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once and returns to the origin city. + +\begin{flushleft} +{ +\emph{Data Used:} +\begin{flalign} +\nonumber & \gls{city_source} \in \gls{city_set} & \\ +\nonumber & \gls{city_destination} \in \gls{city_set} & \\ +\nonumber & \gls{distance} & +\end{flalign} +} + +\emph{Decision variables:}\\ + +\vspace{0.3cm} +$ + \hspace{0.2cm} + \gls{dv_xij}= + \begin{cases} + 1,&\text{if salesman travels from \gls{city_source} to \gls{city_destination}} \\ + 0, & \text{otherwise} + \end{cases} + \vspace{0.2cm} +$ + +$ + \hspace{0.2cm} + \vspace{0.2cm} + \gls{av_ui} \in Integer +$ + +$ + \hspace{0.2cm} + \gls{av_uj} \in Integer + \vspace{0.2cm} +$ +\vspace{0.2cm} + +\emph{Objective function:} + +\begin{equation} +\min \sum_{\gls{city_source} \in \gls{city_set}} \sum_{\gls{city_destination} \in \gls{city_set}} \gls{dv_xij} \times \gls{distance} +\end{equation} + +\end{flushleft} + +\emph{s.t.} +\\ +% \vspace{2mm} +Each node should be entered and exited exactly once + +\begin{flalign} +& \sum_{\gls{city_source}} \gls{dv_xij} = 1 & \forall \gls{city_destination} +\end{flalign} + +\begin{flalign} +& \sum_{\gls{city_destination}} \gls{dv_xij} = 1 & \forall \gls{city_source} +\end{flalign} +Eliminate subtours: +\begin{equation} +\begin{split} +\gls{av_ui} - \gls{av_uj} + \gls{city_count} \times \gls{dv_xij} = \gls{city_count} - 1 \\ + & \forall \gls{city_source} \in 1,2..\gls{city_count}-1 \\ + & \gls{city_destination} \in 2, 3 .. \gls{city_count} +\end{split} +\end{equation} + +\section{Transportation Problem} +\label{section:Transportation} +Transportation problem is about goods being transported from a set of sources to a set of destinations subject to the supply and demand of the sources and destination respectively such that the total cost of transportation is minimized. It is also sometimes called as Hitchcock problem. + +\begin{flushleft} +{ +\emph{Data Used:} +\begin{flalign} +\nonumber & \gls{supply_node} \in \gls{supply_set} & \\ +\nonumber & \gls{demand_node} \in \gls{demand_set} & \\ +\nonumber & \gls{cost}, \gls{supply_qty}, \gls{demand_qty} & +\end{flalign} +} + +\emph{Decision variables:} + +$ + \hspace{0.2cm} + \vspace{0.2cm} + \gls{dv_xsd} \in Integer +$ + +\emph{Objective function:} + +\begin{equation} +\min \sum_{\gls{supply_node} \in \gls{supply_set}} \sum_{\gls{demand_node} \in \gls{demand_set}} \gls{dv_xsd} \times \gls{cost} +\end{equation} +\end{flushleft} + +\emph{s.t.} +\\ +% \vspace{2mm} +For a supply node, units shipped must be less than or equal to the supply quantity + +\begin{flalign} +& \sum_{\gls{demand_node} \in \gls{demand_set}} \gls{dv_xsd} <= \gls{supply_qty} & \forall \gls{supply_node} +\end{flalign} +For a demand node, units shipped must be greater than or equal to the demand quantity + +\begin{flalign} +& \sum_{\gls{supply_node} \in \gls{supply_set}} \gls{dv_xsd} >= \gls{demand_qty} & \forall \gls{demand_node} +\end{flalign} + + +\end{multicols} + + + +%-------------------------------------------------------------------------------- +% Notations + +\pagebreak + +\hrule + +\printglossaries + +%-------------------------------------------------------------------------------- + +\end{document} + +%-------------------------------------------------------------------------------- diff --git a/docs/latex/Approach.toc b/docs/latex/Approach.toc new file mode 100644 index 0000000..4ba8b88 --- /dev/null +++ b/docs/latex/Approach.toc @@ -0,0 +1,3 @@ +\contentsline {section}{\numberline {1}Travelling Salesman Problem}{3}% +\contentsline {section}{\numberline {2}Transportation Problem}{3}% +\contentsline {section}{Nomenclature}{4}% diff --git a/logs/cov.out b/logs/cov.out index eed6fca..cbee523 100644 --- a/logs/cov.out +++ b/logs/cov.out @@ -5,6 +5,7 @@ Name Stmts Miss Cover /media/ph33r/Data/Project/mllib/Git/mllib/lib/cluster.py 103 0 100% /media/ph33r/Data/Project/mllib/Git/mllib/lib/knn.py 70 0 100% /media/ph33r/Data/Project/mllib/Git/mllib/lib/model.py 44 0 100% +/media/ph33r/Data/Project/mllib/Git/mllib/lib/opt.py 157 0 100% /media/ph33r/Data/Project/mllib/Git/mllib/lib/tree.py 79 0 100% ----------------------------------------------------------------------------------------- -TOTAL 310 0 100% +TOTAL 467 0 100% diff --git a/logs/pylint/lib-opt-py.out b/logs/pylint/lib-opt-py.out new file mode 100644 index 0000000..d7495ee --- /dev/null +++ b/logs/pylint/lib-opt-py.out @@ -0,0 +1,4 @@ + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + diff --git a/logs/pylint/tests-test_opt-py.out b/logs/pylint/tests-test_opt-py.out new file mode 100644 index 0000000..d7495ee --- /dev/null +++ b/logs/pylint/tests-test_opt-py.out @@ -0,0 +1,4 @@ + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + diff --git a/mllib/__main__.py b/mllib/__main__.py index d5bc8be..6286c01 100644 --- a/mllib/__main__.py +++ b/mllib/__main__.py @@ -31,6 +31,8 @@ from lib.knn import KNN # noqa: F841 from lib.tree import RandomForest # noqa: F841 from lib.tree import XGBoost # noqa: F841 +from lib.opt import TSP # noqa: F841 +from lib.opt import Transport # noqa: F841 # ============================================================================= # --- DO NOT CHANGE ANYTHING FROM HERE @@ -118,6 +120,31 @@ print("\nXGBoost\n") for k, v in mod.model_summary.items(): print(k, str(v).rjust(69 - len(k))) + print(elapsed_time("Time", start_t), + sep="\n") + # --- Travelling salesman + start_t = time.time_ns() + df_ip = pd.read_csv(path + "input/us_city.csv") + df_ip = df_ip.iloc[:10, :] + tsp = TSP() + opt = tsp.solve(loc=df_ip["city"].tolist(), + lat=df_ip["lat"].tolist(), + lon=df_ip["lng"].tolist(), + debug=False) + print("\nTSP\n") + print("Optimal value:", round(opt[1], 3)) + print(elapsed_time("Time", start_t), + sep="\n") + # --- Transportation + start_t = time.time_ns() + c_loc = ["1", "5", "10", "11", "100", "127", "324"] + c_demand = [20, 10, 15, 0, 0, 25, 0] + c_supply = [0, 0, 0, 30, 12, 0, 28] + c_lat = [42.1, 43.0, 40.3, 46.8, 43.9, 41.6, 45.2] + c_lon = [-102.1, -103.0, -100.3, -106.8, -103.9, -101.6, -105.2] + prob = Transport(c_loc, c_demand, c_supply, c_lat, c_lon, 1) + opt_out = prob.solve(0) + print("\nTransportation\n") print(elapsed_time("Time", start_t), sep="\n") # --- EOF diff --git a/mllib/lib/opt.py b/mllib/lib/opt.py new file mode 100644 index 0000000..fe529bd --- /dev/null +++ b/mllib/lib/opt.py @@ -0,0 +1,657 @@ +""" +Optimization module. + +**Available routines:** + +- class ``TSP``: Solve the Traveling salesman problem using integer + programming/nearest neighbour algorithm. +- class ``Transport``: Solve the Transportation problem using integer + programming. + +Credits +------- +:: + + Authors: + - Diptesh + - Madhu + + Date: Sep 28, 2021 +""" + +# ============================================================================= +# --- DO NOT CHANGE ANYTHING FROM HERE +# ============================================================================= + +# pylint: disable=invalid-name +# pylint: disable-msg=too-many-arguments +# pylint: disable=too-many-instance-attributes + +# ============================================================================= +# --- Import libraries +# ============================================================================= + +from typing import List, Tuple, Dict + +import copy +import math +import pandas as pd +import numpy as np +import pulp + +# ============================================================================= +# --- User defined functions +# ============================================================================= + + +class TSP: + """ + Travelling salesman problem. + + Module for `Travelling salesman problem + `_ using + integer programming or nearest neighbour algorithm. + + Methods + ------- + :func:`~opt.TSP.integer_program` + Determining optimal path using integer programming. + + :func:`~opt.TSP.nearest_neighbour` + Determining optimal path using nearest neighbour algorithm. + + :func:`~opt.TSP.solve` + Determining optimal path using integer programming or nearest neighbour + algorithm based on count of locations. + + """ + + _paired_loc = None + + @staticmethod + def haversine_np(lon1: List[float], + lat1: List[float], + lon2: List[float], + lat2: List[float], + dist: str = "mi" + ) -> np.ndarray: + """ + Haversine distance formula. + + Calculate the euclidean distance in miles between two points + specified in decimal degrees using + `Haversine formula `_. + + Parameters + ---------- + lon1, lat1, lon2, lat2 : float + + Pair of Latitude and Longitude. All args must be of equal length. + + dist : str, `optional` + + Output distance in miles ('mi') or kilometers ('km') + (the default is mi) + + Returns + ------- + numpy.ndarray + + Euclidean distance between two points in miles. + + """ + if dist == "km": # pragma: no cover + R = 6372.8 + else: + R = 3959.87433 + lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2]) + dlon = lon2 - lon1 + dlat = lat2 - lat1 + a = (np.sin(dlat / 2.0) ** 2 + + np.cos(lat1) * np.cos(lat2) + * np.sin(dlon / 2.0) ** 2) + op = R * 2 * np.arcsin(np.sqrt(a)) + return op + + @staticmethod + def pair_dist(loc: List[str], + lat: List[float], + lon: List[float] + ) -> Tuple[List[str], + Dict[Tuple[str, str], + float]]: + """ + Create pairwise euclidean distance in miles between all locations. + + Parameters + ---------- + loc : list + + A list containing the location names. + + lat : list + + List of latitude in decimal degrees. + + lon : list + + List of longitude in decimal degrees. + + Returns + ------- + loc : list + + A list containing the location names. + + dist : dict + + A dictionary containg the pairwise locations as Key and distances + as values. + + """ + df = pd.DataFrame(data={'loc': loc, 'x': lat, 'y': lon}) + df["key"] = 1 + df = pd.merge(df, + df, + how="outer", + on="key", + copy=False) + df = df.drop(labels=["key"], axis=1) + df = df[df["loc_x"] != df["loc_y"]] + df["dist"] = TSP.haversine_np(df["y_x"], df["x_x"], + df["y_y"], df["x_y"]) + df = df[["loc_x", "loc_y", "dist"]] + df = dict(zip(zip(df.loc_x, df.loc_y), df.dist)) + return (loc, df) + + @staticmethod + def integer_program(loc: List[str], + dist: Dict[Tuple[str, str], + float], + debug_mode: bool = False + ) -> Tuple[str, + float, + zip]: + """ + Travelling Salesman Problem using integer programming. + + Parameters + ---------- + loc : list + + A list containing the location names. + + dist : dict + + A dictionary containg the pairwise locations as Key and distances + as values. + + debug_mode : bool, optional, default : False + + Print log in console. + + Returns + ------- + tuple + + Containing the following:: + + Optimization solution status : str + Objective function value : float + Optimal path with distance : zip object containing + - list of tuples + - locations : str + - distances : float + + """ + # Initiate IP formulation model + model = pulp.LpProblem("Travelling Salesman Problem", pulp.LpMinimize) + # Decision variables - 1 if chosen, 0 otherwise + dv_leg = pulp.LpVariable.dicts("Decision variable leg", dist, + lowBound=0, upBound=1, cat='Binary') + # Objective function - Minimize total distance + model += pulp.lpSum([dv_leg[(i, j)] * dist[(i, j)] for (i, j) in dist]) + # Constraints + # Con 01 - 02: Each node should be entered and exited exactly once + for k in loc: + model += pulp.lpSum([dv_leg[(i, k)] + for i in loc if (i, k) in dv_leg]) == 1 + model += pulp.lpSum([dv_leg[(k, i)] + for i in loc if (k, i) in dv_leg]) == 1 + # Con 03: Eliminate subtours + u = pulp.LpVariable.dicts("Relative position of each tour leg", loc, + lowBound=0, upBound=len(loc)-1, + cat='Integer') + for i in loc: + for j in loc: + if (i != j) and (i != loc[0] and j != loc[0]) and\ + (i, j) in dv_leg: + model += u[i] - u[j] <= (len(loc))*(1 - dv_leg[(i, j)]) - 1 + # Solve + debug_mode = int(debug_mode is True) + pulp.LpSolverDefault.msg = debug_mode + model.solve() + # Generate optimal path + loc_left = copy.copy(loc) + org = loc[0] + tour = [] + tour.append(loc_left.pop(loc_left.index(org))) + while loc_left: + for k in loc_left: + if dv_leg[(org, k)].varValue == 1: + tour.append(loc_left.pop(loc_left.index(k))) + org = k + break + tour.append(loc[0]) + tour_legs = [dist[(tour[i-1], tour[i])] for i in range(1, len(tour))] + return (pulp.LpStatus[model.status], + sum(tour_legs), + zip(tour, tour_legs)) + + @staticmethod + def nearest_neighbour(loc_dict: Dict[Tuple[str, str], + float] + ) -> Tuple[str, + float, + zip]: + """ + Travelling Salesman Problem using nearest neighbour algorithm. + + Parameters + ---------- + loc_dict : dict + + A dictionary containg the pairwise locations as Key and distances + as values. + + Returns + ------- + tuple containing the following:: + + Algorithm used : str + Objective function value : float + Optimal path with distance : zip object containing + - list of tuples + - locations : str + - distances : float + + """ + loc_df = pd.concat([pd.DataFrame(loc_dict.keys(), columns=["loc1", + "loc2"]), + pd.DataFrame(loc_dict.values(), columns=["dist"])], + axis=1, verify_integrity=True) + loc_df = loc_df.sort_values(["loc1", "dist"]) + loc_dist = loc_df["loc1"].unique().tolist() + loc_df = loc_df.set_index("loc1") + obj_val = math.inf + op_dist = None + op_visited = None + for loc in range(len(loc_dist)): + unvisited = copy.copy(loc_dist) + sp = unvisited[loc] + visited = [] + dist = [] + i = sp + while unvisited != []: + if len(unvisited) > 1: + tmp = loc_df[loc_df.index == i] + tmp = tmp[tmp["loc2"].isin(unvisited)].reset_index() + else: + tmp = loc_df[(loc_df.index == i) + & (loc_df["loc2"] == sp)].reset_index() + visited.append(i) + dist.append(tmp["dist"][0]) + unvisited.remove(i) + i = tmp["loc2"][0] + if sum(dist) < obj_val: + obj_val = sum(dist) + op_dist = dist + op_visited = visited + return ("Nearest Neighbour", sum(op_dist), zip(op_visited, op_dist)) + + def solve(self, + loc: List[str], + lat: List[float], + lon: List[float], + debug: bool = False + ) -> Tuple[str, + float, + zip]: + """ + Solve for TSP. + + Solve Travelling Salesman Problem using Integer Programming if + locations are less than 50 else solve using Nearest neighbour + algorithm. + + Parameters + ---------- + loc : list + + A list containing the location names. + + lat : list + + List of latitude in decimal degrees. + + lon : list + + List of longitude in decimal degrees. + + debug : bool, optional, default : False + + Print log in console. + + Returns + ------- + tuple containing the following:: + + Algorithm used : str + Objective function value : float + Optimal path with distance : zip object containing + - list of tuples + - locations : str + - distances : float + + """ + self._paired_loc = self.pair_dist(loc, lat, lon) + if len(loc) < 50: + op = self.integer_program(self._paired_loc[0], + self._paired_loc[1], + debug) + else: + op = self.nearest_neighbour(self._paired_loc[1]) + return op + + +class Transport(): + """ + Transportation problem. + + Module for `Transportation Problem + `_ + using integer programming. + + Parameters + ---------- + loc : list + + A list containing the locations/nodes. + + demand : list + + A list containing the demand quantity for each node. + + supply : list + + A list containing the supply quantity for each node. + + lat : list + + A list containing the latitude for each node. + + lon : list + + A list containing the longitude for each node. + + cost : float + + Cost per unit per mile + + """ + + def __init__(self, + loc: List[str], + demand: List[int], + supply: List[int], + lat: List[float], + lon: List[float], + cost: int): + """Initialize variables.""" + self._loc = loc + self._demand = demand + self._supply = supply + self._lat = lat + self._lon = lon + self._cost = cost + self._ori_demand = demand + self._ori_supply = supply + self._inputs = None + self.output = None + + @staticmethod + def haversine_np(lon1: List[float], + lat1: List[float], + lon2: List[float], + lat2: List[float], + dist: str = "mi" + ) -> np.ndarray: + """ + Haversine distance formula. + + Calculate the euclidean distance in miles between two points + specified in decimal degrees using + `Haversine formula `_. + + Parameters + ---------- + lon1, lat1, lon2, lat2 : float + + Pair of Latitude and Longitude. All args must be of equal length. + + dist : str, `optional` + + Output distance in miles ('mi') or kilometers ('km') + (the default is mi) + + Returns + ------- + numpy.ndarray + + Euclidean distance between two points in miles. + + """ + if dist == "km": # pragma: no cover + R = 6372.8 + else: + R = 3959.87433 + lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2]) + dlon = lon2 - lon1 + dlat = lat2 - lat1 + a = (np.sin(dlat / 2.0) ** 2 + + np.cos(lat1) * np.cos(lat2) + * np.sin(dlon / 2.0) ** 2) + op = R * 2 * np.arcsin(np.sqrt(a)) + return op + + def _opt_ip(self) -> Tuple[Dict[str, int], + Dict[str, int], + Dict[Tuple[str, str], float]]: + """ + Create inputs dicts for :func:`transport_prob`. + + Returns + ------- + tuple + A tuple containing the following:: + + demand : dict + Dict containing location, demand as key value pair. + + supply : dict + Dict containing location, supply as key value pair. + + costs : dict + Dict containing (suppy_node, demand_node), costs + as key value pair. + + """ + df = pd.DataFrame(zip(self._loc, self._demand, self._supply, + self._lat, self._lon, [1] * len(self._loc)), + columns=["loc", "demand", "supply", + "lat", "lon", "key"]) + df["loc"] = df["loc"].astype(str) + df_demand = df[df["demand"] > 0] + df_supply = df[df["supply"] > 0] + # Balance demand and supply + tot_demand = sum(df_demand["demand"]) + tot_supply = sum(df_supply["supply"]) + if tot_demand > tot_supply: + df_supply = df_supply.append({'loc': "Dummy", + "demand": 0, + "supply": tot_demand - tot_supply, + "lat": 0, + "lon": 0, + "key": 1}, + ignore_index=True) + elif tot_supply > tot_demand: + df_demand = df_demand.append({"loc": "Dummy", + "demand": tot_supply - tot_demand, + "supply": 0, + "lat": 0, + "lon": 0, + "key": 1}, + ignore_index=True) + df_wt = pd.merge(df_supply, + df_demand, + on="key", + how="outer", + copy=False) + df_wt = df_wt.drop(labels=["key"], axis=1) + df_wt["dist"] = Transport.haversine_np(df_wt["lon_x"], + df_wt["lat_x"], + df_wt["lon_y"], + df_wt["lat_y"]) + df_wt = df_wt.sort_values(["loc_x", "loc_y"]) + df_wt.loc[(df_wt["loc_x"] == "Dummy") | (df_wt["loc_y"] == "Dummy"), + "dist"] = 0 + df_wt["cost"] = df_wt["dist"] * self._cost + ip_supply = dict(zip(df_supply["loc"].astype(str), + df_supply["supply"])) + ip_demand = dict(zip(df_demand["loc"].astype(str), + df_demand["demand"])) + df_wt = df_wt[["loc_x", "loc_y", "cost"]] + ip_costs = df_wt.set_index(["loc_x", "loc_y"]).cost.to_dict() + return (ip_demand, ip_supply, ip_costs) + + @staticmethod + def integer_program(demand: Dict[str, int], + supply: Dict[str, int], + costs: Dict[Tuple[str, str], float], + debug: bool = False + ) -> Tuple[str, + float, + List[Tuple[str, + str, + int]]]: + """ + Transportation Problem using Integer programming. + + Parameters + ---------- + demand : dict + + Dict containing location, demand as key value pair. + + supply : dict + + Dict containing location, supply as key value pair. + + costs : dict + + Dict containing (suppy_node, demand_node), costs + as key value pair. + + debug : bool, optional + + Print log in console (the default is False) + + Returns + ------- + list + Containing the following:: + + Optimization solution status : str + Objective function value in real number : float + Optimal path with costs : list of tuples + (supply_node, demand_node, units) + + Example + ------- + >>> optimal_op = Transport.integer_program(demand_dict, + supply_dict, + costs_list, + 1) + + """ + supply_node = supply.keys() + demand_node = demand.keys() + # Integer programming + model = pulp.LpProblem("Transportation problem", pulp.LpMinimize) + Routes = [(s, d) for s in supply_node for d in demand_node] + route_vars = pulp.LpVariable.dicts("Route", + (supply_node, demand_node), + lowBound=0, + upBound=None, + cat=pulp.LpInteger) + # Objective function + model += pulp.lpSum([route_vars[s][d] * costs[(s, d)] + for (s, d) in Routes]) + # Con 01: Supply maximum constraints are added to model for each + # supply node + for s in supply_node: + model += pulp.lpSum([route_vars[s][d] + for d in demand_node]) <= supply[s] + # Con 02: The demand minimum constraints are added to model for each + # demand node + for d in demand_node: + model += pulp.lpSum([route_vars[s][d] + for s in supply_node]) >= demand[d] + # Solve + debug = int(debug is True) + pulp.LpSolverDefault.msg = debug + model.solve() + route_list = [(v.name.split("_")[1], v.name.split("_")[2], v.varValue) + for v in model.variables() if v.varValue > 0] + ip_op = (pulp.LpStatus[model.status], + model.objective.value(), + route_list) + return ip_op + + def solve(self, debug: bool = False) -> List[Tuple[str, str, int]]: + """ + Transportation Problem using Integer programming. + + Parameters + ---------- + :debug: int (binary), optional + + Print log in console when 1, 0 otherwise (the default is 0) + + Returns + ------- + list of tuples + Containing the following:: + + Optimal path with costs : (supply_node, demand_node, units) + + """ + self._inputs = self._opt_ip() + self.output = Transport.integer_program(demand=self._inputs[0], + supply=self._inputs[1], + costs=self._inputs[2], + debug=debug) + return self.output[2] + + def summary(self): # pragma: no cover + """Print summary for optimization results.""" + print("Summary:\n") + print("Total demand:", sum(self._ori_demand)) + print("Total supply:", sum(self._ori_supply)) + if sum(self._ori_demand) > sum(self._ori_supply): + print("Deficit:", sum(self._ori_demand) - sum(self._ori_supply)) + elif sum(self._ori_supply) > sum(self._ori_demand): + print("Surplus:", sum(self._ori_supply) - sum(self._ori_demand)) + print("Optimization status:", self.output[0]) + if self.output[0] == "Optimal": + print("Total cost:", np.round(self.output[1], decimals=2)) diff --git a/requirements.txt b/requirements.txt index 7715ab9..c5583d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ -Cython==0.29.15 -numpy==1.19.5 -pandas==1.1.3 xgboost==1.3.3 +PuLP==1.6.8 +pandas==1.1.3 +numpy==1.19.5 +Cython==0.29.15 scikit_learn==1.0 diff --git a/tests/test_opt.py b/tests/test_opt.py new file mode 100644 index 0000000..1411a33 --- /dev/null +++ b/tests/test_opt.py @@ -0,0 +1,140 @@ +""" +Unit tests for opt.py module. + +Author +------ +:: + + Author: Diptesh Basak + Date: Jun 16, 2019 + License: BSD 3-Clause +""" + +# pylint: disable=invalid-name +# pylint: disable=wrong-import-position + +import unittest +import warnings +import re +import sys + +from inspect import getsourcefile +from os.path import abspath + +import pandas as pd +import numpy as np + +# Set base path +path = abspath(getsourcefile(lambda: 0)) +path = re.sub(r"(.+)(\/tests.*)", "\\1", path) + +sys.path.insert(0, path) + +from mllib.lib.opt import TSP # noqa: F841 +from mllib.lib.opt import Transport # noqa: F841 + +# ============================================================================= +# --- User defined functions +# ============================================================================= + + +class Test_TSP(unittest.TestCase): + """Test suite for TSP module.""" + + def setUp(self): + """Setup for module ``Test_TSP``.""" + warnings.simplefilter('ignore') + + def test_ip(self): + """TSP: Integer programming""" + df_ip = pd.read_csv(path + "/data/input/us_city.csv") + df_ip = df_ip.iloc[:10, :] + tsp = TSP() + opt = tsp.solve(loc=df_ip["city"].tolist(), + lat=df_ip["lat"].tolist(), + lon=df_ip["lng"].tolist(), + debug=False) + self.assertEqual(np.round(opt[1], 0), 626.0) + + def test_nn(self): + """TSP: Nearest neighbor algorithm""" + df_ip = pd.read_csv(path + "/data/input/us_city.csv") + df_ip = df_ip.iloc[:50, :] + tsp = TSP() + opt = tsp.solve(loc=df_ip["city"].tolist(), + lat=df_ip["lat"].tolist(), + lon=df_ip["lng"].tolist(), + debug=False) + self.assertEqual(np.round(opt[1], 0), 1402.0) + + +class Test_TP(unittest.TestCase): + """Test suite for transportation problem.""" + + def setUp(self): + """Setup for module ``Test_TP``.""" + warnings.simplefilter('ignore') + + def test_transport_balanced(self): + """TP: Balanced problem""" + c_loc = ["1", "5", "10", "11", "100", "127", "324"] + c_demand = [20, 10, 15, 0, 0, 25, 0] + c_supply = [0, 0, 0, 30, 12, 0, 28] + c_lat = [42.1, 43.0, 40.3, 46.8, 43.9, 41.6, 45.2] + c_lon = [-102.1, -103.0, -100.3, -106.8, -103.9, -101.6, -105.2] + prob = Transport(c_loc, c_demand, c_supply, c_lat, c_lon, 1) + opt_out = prob.solve(0) + self.assertEqual(np.round(prob.output[1], decimals=2), 23856.39) + exp_op = [('100', '1', 2), + ('100', '5', 10), + ('11', '10', 15), + ('11', '127', 15), + ('324', '1', 18), + ('324', '127', 10)] + self.assertEqual(opt_out, exp_op) + + def test_transport_unbalanced_demand(self): + """TP: Unbalanced problem when Demand > Supply""" + c_loc = ["1", "5", "10", "11", "100", "127", "324"] + c_demand = [20, 10, 15, 0, 0, 250, 0] + c_supply = [0, 0, 0, 30, 12, 0, 28] + c_lat = [42.1, 43.0, 40.3, 46.8, 43.9, 41.6, 45.2] + c_lon = [-102.1, -103.0, -100.3, -106.8, -103.9, -101.6, -105.2] + prob = Transport(c_loc, c_demand, c_supply, c_lat, c_lon, 1) + opt_out = prob.solve(0) + self.assertEqual(np.round(prob.output[1], decimals=2), 22170.26) + exp_op = [('100', '1', 2), + ('100', '5', 10), + ('11', '127', 30), + ('324', '1', 18), + ('324', '127', 10), + ('Dummy', '10', 15), + ('Dummy', '127', 210)] + self.assertEqual(opt_out, exp_op) + + def test_transport_unbalanced_supply(self): + """TP: Unbalanced problem when Supply > Demand""" + c_loc = ["1", "5", "10", "11", "100", "127", "324"] + c_demand = [20, 10, 15, 0, 0, 25, 0] + c_supply = [0, 0, 0, 30, 12, 0, 280] + c_lat = [42.1, 43.0, 40.3, 46.8, 43.9, 41.6, 45.2] + c_lon = [-102.1, -103.0, -100.3, -106.8, -103.9, -101.6, -105.2] + prob = Transport(c_loc, c_demand, c_supply, c_lat, c_lon, 1) + opt_out = prob.solve(0) + self.assertEqual(np.round(prob.output[1], decimals=2), 19822.6) + exp_op = [('100', '1', 2), + ('100', '5', 10), + ('11', 'Dummy', 30), + ('324', '1', 18), + ('324', '10', 15), + ('324', '127', 25), + ('324', 'Dummy', 222)] + self.assertEqual(opt_out, exp_op) + + +# ============================================================================= +# --- Main +# ============================================================================= + +if __name__ == '__main__': + unittest.main()