diff --git a/.travis.yml b/.travis.yml index 1269177c..9b4ac678 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,13 +9,13 @@ os: - linux julia: - - nightly - - 1.0 + - 1.1 + - 1.2 jobs: include: - stage: "Documentation" - julia: 1.0 + julia: 1.1 os: linux script: - julia --project=docs/ -e 'using Pkg; Pkg.instantiate(); Pkg.develop(PackageSpec(path=pwd()))' diff --git a/Manifest.toml b/Manifest.toml index ad7714c9..347a0f78 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,20 +1,50 @@ # This file is machine-generated - editing it directly is not advised +[[AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "380e36c66edfa099cd90116b24c1ce8cafccac40" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "0.4.1" + [[ArnoldiMethod]] deps = ["DelimitedFiles", "LinearAlgebra", "Random", "SparseArrays", "StaticArrays", "Test"] git-tree-sha1 = "2b6845cea546604fb4dca4e31414a6a59d39ddcd" uuid = "ec485272-7323-5ecc-a04f-4719b315124d" version = "0.0.4" +[[Arpack]] +deps = ["BinaryProvider", "Libdl", "LinearAlgebra"] +git-tree-sha1 = "07a2c077bdd4b6d23a40342a8a108e2ee5e58ab6" +uuid = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97" +version = "0.3.1" + +[[ArrayInterface]] +deps = ["LinearAlgebra", "Requires", "SparseArrays"] +git-tree-sha1 = "981354dab938901c2b607a213e62d9defa50b698" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "1.2.1" + [[AssetRegistry]] deps = ["Distributed", "JSON", "Pidfile", "SHA", "Test"] git-tree-sha1 = "b25e88db7944f98789130d7b503276bc34bc098e" uuid = "bf4720bc-e11a-5d0c-854e-bdca1663c893" version = "0.1.0" +[[AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "a4d07a1c313392a77042855df46c5f534076fab9" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.0" + [[Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +[[BenchmarkTools]] +deps = ["JSON", "Printf", "Statistics", "Test"] +git-tree-sha1 = "5d1dd8577643ba9014574cd40d9c028cd5e4b85a" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "0.4.2" + [[BinDeps]] deps = ["Compat", "Libdl", "SHA", "URIParser"] git-tree-sha1 = "12093ca6cdd0ee547c39b1870e0c9c3f154d9ca9" @@ -41,9 +71,9 @@ version = "0.4.4" [[CSTParser]] deps = ["Tokenize"] -git-tree-sha1 = "0ff80f68f55fcde2ed98d7b24d7abaf20727f3f8" +git-tree-sha1 = "c69698c3d4a7255bc1b4bc2afc09f59db910243b" uuid = "00ebfdb7-1f24-5e51-bd34-a7502290713f" -version = "0.6.1" +version = "0.6.2" [[CSV]] deps = ["CategoricalArrays", "DataFrames", "Dates", "Mmap", "Parsers", "PooledArrays", "Profile", "Tables", "Unicode", "WeakRefStrings"] @@ -63,6 +93,12 @@ git-tree-sha1 = "13240cfcc884837fc1aa89b60d500a652bcc3f10" uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597" version = "0.5.5" +[[Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "f387d5937d0c9d0191c711d7d204bce15bd23b45" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.13.3" + [[ColorTypes]] deps = ["FixedPointNumbers", "Random"] git-tree-sha1 = "10050a24b09e8e41b951e9976b109871ce98d965" @@ -70,10 +106,10 @@ uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" version = "0.8.0" [[Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "InteractiveUtils", "Printf", "Reexport", "Test"] -git-tree-sha1 = "9f0a0210450acb91c730b730a994f8eef1d3d543" +deps = ["ColorTypes", "FixedPointNumbers", "InteractiveUtils", "Printf", "Reexport"] +git-tree-sha1 = "c9c1845d6bf22e34738bee65c357a69f416ed5d1" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.9.5" +version = "0.9.6" [[Combinatorics]] deps = ["LinearAlgebra", "Polynomials", "Test"] @@ -93,10 +129,22 @@ git-tree-sha1 = "84aa74986c5b9b898b0d1acaf3258741ee64754f" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" version = "2.1.0" +[[Conda]] +deps = ["JSON", "VersionParsing"] +git-tree-sha1 = "9a11d428dcdc425072af4aea19ab1e8c3e01c032" +uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d" +version = "1.3.0" + +[[Contour]] +deps = ["LinearAlgebra", "StaticArrays", "Test"] +git-tree-sha1 = "b974e164358fea753ef853ce7bad97afec15bb80" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.5.1" + [[DataAPI]] -git-tree-sha1 = "891a09f4f90361a28d0391c104a65c0202e22624" +git-tree-sha1 = "8903f0219d3472543fc4b2f5ebaf675a07f817c0" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.0.0" +version = "1.0.1" [[DataFrames]] deps = ["CategoricalArrays", "Compat", "DataAPI", "InvertedIndices", "IteratorInterfaceExtensions", "Missings", "PooledArrays", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] @@ -115,6 +163,12 @@ git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" version = "1.0.0" +[[DataValues]] +deps = ["DataValueInterfaces", "Dates"] +git-tree-sha1 = "b65fd071ca17aa265eb8c5ab0e522faa03a50d34" +uuid = "e7dc6d0d-1eca-5fa6-8ad6-5aecde8b7ea5" +version = "0.4.12" + [[Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" @@ -123,6 +177,12 @@ uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" deps = ["Mmap"] uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +[[DiffEqDiffTools]] +deps = ["ArrayInterface", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "21b855cb29ec4594f9651e0e9bdc0cdcfdcd52c1" +uuid = "01453d9d-ee7c-5054-8395-0335cb756afa" +version = "1.3.0" + [[DiffResults]] deps = ["Compat", "StaticArrays"] git-tree-sha1 = "34a4a1e8be7bc99bc9c611b895b5baf37a80584c" @@ -135,10 +195,22 @@ git-tree-sha1 = "dc0869fb2f5b23466b32ea799bd82c76480167f7" uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" version = "0.0.10" +[[Distances]] +deps = ["LinearAlgebra", "Statistics"] +git-tree-sha1 = "44bd29b50552dfd0a0b674b925de2719f3b9bb0b" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.8.1" + [[Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +[[Distributions]] +deps = ["LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns"] +git-tree-sha1 = "baaf9e165ba8a2d11fb4fb3511782ee070ee3694" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.21.1" + [[DocStringExtensions]] deps = ["LibGit2", "Markdown", "Pkg", "Test"] git-tree-sha1 = "0513f1a8991e9d83255e0140aace0d0fc4486600" @@ -151,9 +223,21 @@ git-tree-sha1 = "4a84478277020abfff208cde31ba1aa68a5bc572" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" version = "0.23.0" +[[FFTW]] +deps = ["AbstractFFTs", "BinaryProvider", "Conda", "Libdl", "LinearAlgebra", "Reexport", "Test"] +git-tree-sha1 = "e1a479d3c972f20c9a70563eec740bbfc786f515" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "0.3.0" + [[FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +[[FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays"] +git-tree-sha1 = "8fba6ddaf66b45dec830233cea0aae43eb1261ad" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.6.4" + [[FixedPointNumbers]] git-tree-sha1 = "d14a6fa5890ea3a7e5dcab6811114f132fec2b4b" uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" @@ -175,6 +259,18 @@ version = "0.5.0" deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +[[GR]] +deps = ["Base64", "DelimitedFiles", "LinearAlgebra", "Pkg", "Printf", "Random", "Serialization", "Sockets", "Test"] +git-tree-sha1 = "b4c31b6377b6d51b6c69a3a9737d10c34d43974e" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.41.0" + +[[GeometryTypes]] +deps = ["ColorTypes", "FixedPointNumbers", "IterTools", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "2b0bfb379a54bdfcd2942f388f7d045f8952373d" +uuid = "4d00f742-c7ba-57c2-abde-4428a4b178cb" +version = "0.7.5" + [[Gurobi]] deps = ["Compat", "Libdl", "LinQuadOptInterface", "MathProgBase"] git-tree-sha1 = "c2e1b1d4ce50764188c6496f298fa58bbf5e923e" @@ -209,12 +305,23 @@ version = "0.5.0" deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +[[Interpolations]] +deps = ["AxisAlgorithms", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "e1bac96b5ef3ea23b50e801b4a988ec21861a47f" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.12.2" + [[InvertedIndices]] deps = ["Test"] git-tree-sha1 = "15732c475062348b0165684ffe28e85ea8396afc" uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" version = "1.0.0" +[[IterTools]] +git-tree-sha1 = "2ebe60d7343962966d1779a74a760f13217a6901" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.2.0" + [[IteratorInterfaceExtensions]] git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" uuid = "82899510-4779-5014-852e-03e436cf321d" @@ -244,6 +351,12 @@ git-tree-sha1 = "8e1aea93f99e1141a8053e1d542d4534f62fe43f" uuid = "4076af6c-e467-56ae-b986-b466b2749572" version = "0.18.6" +[[KernelDensity]] +deps = ["Distributions", "FFTW", "Interpolations", "Optim", "StatsBase", "Test"] +git-tree-sha1 = "c1048817fe5711f699abc8fabd47b1ac6ba4db04" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.5.1" + [[LaTeXStrings]] deps = ["Compat"] git-tree-sha1 = "7ab9b8788cfab2bdde22adf9004bda7ad9954b6c" @@ -274,6 +387,12 @@ git-tree-sha1 = "d6692a09d0424e34c884cd819b8ed47943eefc20" uuid = "f8899e07-120b-5979-ab1d-7b97bb9e1a48" version = "0.6.0" +[[LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf", "Test"] +git-tree-sha1 = "54eb90e8dbe745d617c78dee1d6ae95c7f6f5779" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.0.1" + [[LinearAlgebra]] deps = ["Libdl"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -292,10 +411,10 @@ deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" [[MathOptInterface]] -deps = ["Compat", "Unicode"] -git-tree-sha1 = "5d3de69c9220610d0336ab45d3eb8b6ac7a7c807" +deps = ["BenchmarkTools", "LinearAlgebra", "OrderedCollections", "SparseArrays", "Test", "Unicode"] +git-tree-sha1 = "2c964a0bbbdd09a270b21c3ed293061a38898eee" uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -version = "0.8.4" +version = "0.9.0" [[MathProgBase]] deps = ["Compat"] @@ -309,6 +428,12 @@ git-tree-sha1 = "2d94286a9c2f52c63a16146bb86fd6cdfbf677c6" uuid = "739be429-bea8-5141-9913-cc70e7f3736d" version = "0.6.8" +[[Measures]] +deps = ["Test"] +git-tree-sha1 = "ddfd6d13e330beacdde2c80de27c1c671945e7d9" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.0" + [[Missings]] deps = ["SparseArrays", "Test"] git-tree-sha1 = "f0719736664b4358aa9ec173077d4285775f8007" @@ -336,24 +461,59 @@ git-tree-sha1 = "5b41f03d63400c290bab4e1a49fb9ac36de1084a" uuid = "a975b10e-0019-58db-a62f-e48ff68538c9" version = "0.7.0" +[[NLSolversBase]] +deps = ["Calculus", "DiffEqDiffTools", "DiffResults", "Distributed", "ForwardDiff"] +git-tree-sha1 = "1c4b1d76f731dee88a0f494c59c750f3fd7d9ddd" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.4.0" + [[NaNMath]] deps = ["Compat"] git-tree-sha1 = "ce3b85e484a5d4c71dd5316215069311135fa9f2" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" version = "0.3.2" +[[NearestNeighbors]] +deps = ["Distances", "LinearAlgebra", "Mmap", "StaticArrays", "Test"] +git-tree-sha1 = "f47c5d97cf9a8caefa47e9fa9d99d8fda1a65154" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.3" + [[Observables]] deps = ["Test"] git-tree-sha1 = "dc02cec22747d1d10d9f70d8a1c03432b5bfbcd0" uuid = "510215fc-4207-5dde-b226-833fc4488ee2" version = "0.2.3" +[[OffsetArrays]] +git-tree-sha1 = "1af2f79c7eaac3e019a0de41ef63335ff26a0a57" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "0.11.1" + +[[Optim]] +deps = ["Calculus", "DiffEqDiffTools", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "Random", "SparseArrays", "StatsBase"] +git-tree-sha1 = "ca8f8917df469d607f8cf116784e58c9c084d0b4" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "0.19.2" + [[OrderedCollections]] deps = ["Random", "Serialization", "Test"] git-tree-sha1 = "c4c13474d23c60d20a67b217f1d7f22a40edf8f1" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.1.0" +[[PDMats]] +deps = ["Arpack", "LinearAlgebra", "SparseArrays", "SuiteSparse", "Test"] +git-tree-sha1 = "9d6a9b3e19634612fb1edcafc4b1d75242b24bde" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.9.9" + +[[Parameters]] +deps = ["Markdown", "OrderedCollections", "REPL", "Test"] +git-tree-sha1 = "70bdbfb2bceabb15345c0b54be4544813b3444e4" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.10.3" + [[Parsers]] deps = ["Dates", "Test"] git-tree-sha1 = "db2b35dedab3c0e46dc15996d170af07a5ab91c9" @@ -370,6 +530,24 @@ version = "1.1.0" deps = ["Dates", "LibGit2", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +[[PlotThemes]] +deps = ["PlotUtils", "Requires", "Test"] +git-tree-sha1 = "f3afd2d58e1f6ac9be2cea46e4a9083ccc1d990b" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "0.3.0" + +[[PlotUtils]] +deps = ["Colors", "Dates", "Printf", "Random", "Reexport", "Test"] +git-tree-sha1 = "8e87bbb778c26f575fbe47fd7a49c7b5ca37c0c6" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "0.5.8" + +[[Plots]] +deps = ["Base64", "Contour", "Dates", "FixedPointNumbers", "GR", "GeometryTypes", "JSON", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "Reexport", "Requires", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs"] +git-tree-sha1 = "a9c011a7176a9010dda4853373e8d89a83f9d69d" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "0.25.3" + [[Polynomials]] deps = ["LinearAlgebra", "SparseArrays", "Test"] git-tree-sha1 = "62142bd65d3f8aeb2226ec64dd8493349147df94" @@ -381,6 +559,12 @@ git-tree-sha1 = "6e8c38927cb6e9ae144f7277c753714861b27d14" uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" version = "0.5.2" +[[PositiveFactorizations]] +deps = ["LinearAlgebra", "Test"] +git-tree-sha1 = "957c3dd7c33895469760ce873082fbb6b3620641" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.2" + [[Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" @@ -389,6 +573,12 @@ uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" deps = ["Printf"] uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +[[QuadGK]] +deps = ["DataStructures", "LinearAlgebra", "Test"] +git-tree-sha1 = "3ce467a8e76c6030d4c3786e7d3a73442017cdc0" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.0.3" + [[REPL]] deps = ["InteractiveUtils", "Markdown", "Sockets"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" @@ -397,10 +587,17 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" deps = ["Serialization"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +[[Ratios]] +deps = ["Compat"] +git-tree-sha1 = "cdbbe0f350581296f3a2e3e7a91b214121934407" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.3.1" + [[RecipesBase]] -git-tree-sha1 = "7bdce29bc9b2f5660a6e5e64d64d91ec941f6aa2" +deps = ["Random", "Test"] +git-tree-sha1 = "0b3cb370ee4dc00f47f1193101600949f3dcf884" uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "0.7.0" +version = "0.6.0" [[Reexport]] deps = ["Pkg"] @@ -420,6 +617,12 @@ git-tree-sha1 = "cbbc2c710abea5cfe71459ce4711d80a212aac5a" uuid = "89212889-6d3f-5f97-b412-7825138f6c9c" version = "0.8.6" +[[Rmath]] +deps = ["BinaryProvider", "Libdl", "Random", "Statistics", "Test"] +git-tree-sha1 = "9a6c758cdf73036c3239b0afbea790def1dabff9" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.5.0" + [[SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" @@ -430,6 +633,12 @@ uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" deps = ["Distributed", "Mmap", "Random", "Serialization"] uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +[[Showoff]] +deps = ["Dates"] +git-tree-sha1 = "e032c9df551fb23c9f98ae1064de074111b7bc39" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "0.3.1" + [[SimpleTraits]] deps = ["InteractiveUtils", "MacroTools"] git-tree-sha1 = "05bbf4484b975782e5e54bb0750f21f7f2f66171" @@ -465,6 +674,28 @@ version = "0.11.0" deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +[[StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics"] +git-tree-sha1 = "c53e809e63fe5cf5de13632090bc3520649c9950" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.32.0" + +[[StatsFuns]] +deps = ["Rmath", "SpecialFunctions", "Test"] +git-tree-sha1 = "b3a4e86aa13c732b8a8c0ba0c3d3264f55e6bb3e" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "0.8.0" + +[[StatsPlots]] +deps = ["Clustering", "DataStructures", "DataValues", "Distributions", "KernelDensity", "Observables", "Plots", "RecipesBase", "Reexport", "StatsBase", "Tables", "Widgets"] +git-tree-sha1 = "5c4a479eedbaf338be5a4352bac9b06efc182396" +uuid = "f3b207a7-027a-5e70-b257-86293d7955fd" +version = "0.11.0" + +[[SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + [[TableTraits]] deps = ["IteratorInterfaceExtensions"] git-tree-sha1 = "b1ad568ba658d8cbb3b892ed5380a6f3e781a81e" @@ -473,18 +704,18 @@ version = "1.0.0" [[Tables]] deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] -git-tree-sha1 = "951b5be359e92703f886881b175ecfe924d8bd91" +git-tree-sha1 = "aaed7b3b00248ff6a794375ad6adf30f30ca5591" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "0.2.10" +version = "0.2.11" [[Test]] deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [[Tokenize]] -git-tree-sha1 = "c8a8b00ae44a94950814ff77850470711a360225" +git-tree-sha1 = "dfcdbbfb2d0370716c815cbd6f8a364efb6f42cf" uuid = "0796e94c-ce3b-5d07-9a54-7f471281c624" -version = "0.5.5" +version = "0.5.6" [[URIParser]] deps = ["Test", "Unicode"] @@ -499,6 +730,12 @@ uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [[Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +[[VersionParsing]] +deps = ["Compat"] +git-tree-sha1 = "c9d5aa108588b978bd859554660c8a5c4f2f7669" +uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" +version = "1.1.3" + [[WeakRefStrings]] deps = ["Random", "Test"] git-tree-sha1 = "9a0bb82eede528debe631b642eeb48a631a69bc2" @@ -522,3 +759,9 @@ deps = ["Colors", "Dates", "Observables", "OrderedCollections", "Test"] git-tree-sha1 = "c53befc70c6b91eaa2a9888c2f6ac2d92720a81b" uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" version = "0.6.1" + +[[WoodburyMatrices]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Test"] +git-tree-sha1 = "21772c33b447757ec7d3e61fcdfb9ea5c47eedcf" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.4.1" diff --git a/Project.toml b/Project.toml index 325d38e9..f66893e2 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "CurricularAnalytics" uuid = "593ffa3d-269e-5d81-88bc-c3b6809c35a6" authors = ["Greg Heileman ", "Hayden Free ", "Orhan Abar ", "Will Thompson "] -version = "0.5.2" +version = "0.5.3" [deps] Blink = "ad839575-38b3-5650-b840-f874b8c74a25" @@ -10,7 +10,6 @@ CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -Gurobi = "2e9cd046-0924-5485-92f1-d5272153d98b" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" JuMP = "4076af6c-e467-56ae-b986-b466b2749572" @@ -19,6 +18,8 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a" MultiJuMP = "f6097e2c-3ba3-5605-a9a8-3a277acb490f" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" +Requires = "ae029012-a4dd-5104-9daa-d747884805df" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" WebIO = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29" diff --git a/README.md b/README.md index 2a778b5d..91773f99 100644 --- a/README.md +++ b/README.md @@ -11,22 +11,29 @@ Full documentation is available at [GitHub Pages](https://curricularanalytics.gi Documentation for functions in this toolbox is also available via the Julia REPL help system. Additional tutorials can be found at the [Curricular Analytics Notebooks](https://github.com/CurricularAnalytics/CA-Notebooks) site. -## Installation +# Installation + Installation is straightforward. First, install the Julia programming language on your computer. To do this, download Julia here: https://julialang.org, and follow the instructions for your operating system. -Next, open the Julia application that you just installed. It should look similar to the image below. +Next, open the Julia application that you just installed. It should look similar to the image below. This interface is referred to as the `Julia REPL`. ![Julia termain](https://s3.amazonaws.com/curricularanalytics.jl/julia-command-line.png) -Then enter Pkg mode from within Julia by typing `]`, and then type: +Next, enter Pkg mode from within Julia by hitting the `]` key, and then type: ```julia-repl pkg> add CurricularAnalytics ``` -This will install the toolbox, along with the other Julia packages needed to run it. +This will install the toolbox, along with the other Julia packages needed to run it. To load and use the toolbox, hit the `backspace` key to return to the Julia REPL. Now type: +```julia-repl + julia> using CurricularAnalytics +``` +The toolbox must be loaded again via `using CurricularAnalytics` every time you restart Julia. + +For more information about installing the toolbox, including the steps neccessary to utilize degree plan optimization, please see the [INSTALLING.md](https://curricularanalytics.github.io/CurricularAnalytics.jl/latest/install.html) ## Supported Versions * CurricularAnalytics master will be maintained/enhanced to work with the latest stable version of Julia. -* Julia 1.0 & 1.1: CurricularAnalytics v0.5.0 is the latest version guaranteed to work with Julia 1.0 and 1.1. +* Julia 1.0 & 1.1: CurricularAnalytics v0.5.3 is the latest version guaranteed to work with Julia 1.0 and 1.1. * Later versions: Some functionality might not work with prerelease / unstable / nightly versions of Julia. If you run into a problem, please file an issue. # Contributing and Reporting Bugs diff --git a/docs/src/install.md b/docs/src/install.md index 60bfc6b2..17981e09 100644 --- a/docs/src/install.md +++ b/docs/src/install.md @@ -1,19 +1,38 @@ # Installation -Installation is straightforward. Enter Pkg mode in the Julia REPL by typing `]`, and then type: +Installation is straightforward. First, install the Julia programming language on your computer. To do this, download Julia here: https://julialang.org, and follow the instructions for your operating system. + +Next, open the Julia application that you just installed. It should look similar to the image below. This interface is referred to as the `Julia REPL`. + +![Julia termain](https://s3.amazonaws.com/curricularanalytics.jl/julia-command-line.png) + +Next, enter Pkg mode from within Julia by hitting the `]` key, and then type: ```julia-repl -pkg> add CurricularAnalytics + pkg> add CurricularAnalytics ``` - -The CurricularAnalytics.jl toolbox contains sophisticated visualization capabilities. In order to use them, you must first install the [Blink.jl](http://junolab.org/Blink.jl/latest/) package. Blink.jl is a Julia wrapper that leverages the [Electron](https://electronjs.org) framework to perform the actual visualizations. Blink.jl should install automatically when you install the CurricularAnalytics.jl toolbox, and Electron will also install automatically upon first use of the visualization functions. +This will install the toolbox, along with the other Julia packages needed to run it. To load and use the toolbox, hit the `backspace` key to return to the Julia REPL. Now type: +```julia-repl + julia> using CurricularAnalytics +``` +The toolbox must be loaded again via `using CurricularAnalytics` every time you restart Julia. ## Additional Requirements If you plan to use the optimization capabilities built into the degree plan creation functions, you must install the [Gurobi Optimizer](https://www.gurobi.com/downloads/gurobi-optimizer-eula/). Gurobi is a commercial product, and requires a license key. However, [academic licenses](https://www.gurobi.com/downloads/end-user-license-agreement-academic/) are available at no cost. -After installing the Gurobi Solver you must run the following command in the Julia REPL by typing `]`, and then: +After installing the Gurobi Solver you must run the following command in Pkg mode in the Julia REPL by hitting `]`, and then: +```julia-repl + pkg> add Gurobi +``` +Back in the normal Julia REPL, which can be returned to from Pkg mode by hitting `backspace`, you must know run the following: +```julia-repl + julia> using Gurobi +``` +This final command, `using Gurobi`, should be run every time you restart Julia. No further steps are necessary, and you may now utilize the optimization functionality of the toolbox. + + To load the toolbox and Gurobi at the same time you can run: ```julia-repl -pkg> add Gurobi + julia> using CurricularAnalytics, Gurobi ``` ## Windows Specific Steps diff --git a/src/CurricularAnalytics.jl b/src/CurricularAnalytics.jl index de437574..8a29a900 100644 --- a/src/CurricularAnalytics.jl +++ b/src/CurricularAnalytics.jl @@ -14,6 +14,7 @@ using DataStructures using Printf using Markdown using Documenter +using Requires include("DataTypes.jl") include("DegreePlanCreation.jl") @@ -27,15 +28,15 @@ export Degree, AA, AS, AAS, BA, BS, System, semester, quarter, Requisite, pre, c Course, add_requisite!, delete_requisite!, Curriculum, total_credits, requisite_type, Term, DegreePlan, find_term, course_from_id, dfs, topological_sort, all_paths, longest_path, longest_paths, gad, reachable_from, reachable_from_subgraph, reachable_to, reachable_to_subgraph, reach, reach_subgraph, isvalid_curriculum, - extraneous_requisites, blocking_factor, delay_factor, centrality, complexity, courses_from_vertices, - compare_curricula, isvalid_degree_plan, print_plan, visualize, basic_metrics, read_csv, create_degree_plan, - bin_packing, bin_packing2, find_min_terms, add_lo_requisite!, update_plan, write_csv, find_min_terms, - balance_terms, requisite_distance, balance_terms_opt, find_min_terms_opt, read_Opt_Config, optimize_plan, - json_to_julia, julia_to_json, init_opt - -function init_opt() - println("\n ************************************************************************\n In order to use the optimization functions in this toolbox you must first install the Gurobi Optimizer;\n please see: www.gurobi.com/downloads/gurobi-optimizer \n\n Note that free acacdemic licenses for the Gurobi Optimizer are available.\n ************************************************************************\n\n") - include(dirname(pathof(CurricularAnalytics)) * "/Optimization.jl") + extraneous_requisites, blocking_factor, delay_factor, centrality, complexity, courses_from_vertices, compare_curricula, + isvalid_degree_plan, print_plan, visualize, metric_histogram, metric_boxplot, basic_metrics, basic_statistics, read_csv, + create_degree_plan, bin_packing, bin_packing2, find_min_terms, add_lo_requisite!, update_plan, write_csv, + find_min_terms, balance_terms, requisite_distance, balance_terms_opt, find_min_terms_opt, read_Opt_Config, + optimize_plan, json_to_julia, julia_to_json, init_opt + +function __init__() + @require Gurobi="2e9cd046-0924-5485-92f1-d5272153d98b" using .Gurobi + @require Gurobi="2e9cd046-0924-5485-92f1-d5272153d98b" include("Optimization.jl") end # Check if a curriculum graph has requisite cycles. @@ -95,22 +96,26 @@ end #end """ - function extraneous_requisites(c::Curriculum, error_msg::IOBuffer) + function extraneous_requisites(c::Curriculum; print=false) Determines whether or not a curriculum `c` contains extraneous requisites, and returns them. Extraneous requisites -are redundant requisites that may introduce spurious complexity. For examokem, if a curriculum has the prerequisite +are redundant requisites that are unnecessary in a curriculum. For example, if a curriculum has the prerequisite relationships \$c_1 \\rightarrow c_2 \\rightarrow c_3\$ and \$c_1 \\rightarrow c_3\$, and \$c_1\$ and \$c_2\$ are *not* co-requisites, then \$c_1 \\rightarrow c_3\$ is redundant and therefore extraneous. """ -function extraneous_requisites(c::Curriculum, error_msg::IOBuffer) - if is_cyclic(c.graph) # error condition should not occur, as cycles are checked in isvalid_curriculum() - error("\nExtraneous requisities are due to cycles in the curriculum graph") +function extraneous_requisites(c::Curriculum; print=false) + if is_cyclic(c.graph) + error("\nCurriculm graph has cycles, extraneous requisities cannot be determined.") end + if print == true + msg = IOBuffer() + end + redundant_reqs = Array{Array{Int,1},1}() g = c.graph que = Queue{Int}() components = weakly_connected_components(g) extraneous = false - str = "" # create an empty string to hold any error messages + str = "" # create an empty string to hold messages for wcc in components if length(wcc) > 1 # only consider components with more than one vertex for u in wcc @@ -138,9 +143,11 @@ function extraneous_requisites(c::Curriculum, error_msg::IOBuffer) end end if remove == true - temp_str = "-$(c.courses[v].name) has redundant requisite $(c.courses[u].name)\n" - if !occursin(temp_str, str) - str = str * temp_str + if findfirst(x -> x == [c.courses[u].id, c.courses[v].id], redundant_reqs) == nothing # make sure redundant requisite wasn't previously found + push!(redundant_reqs, [c.courses[u].id, c.courses[v].id]) + if print == true + str = str * "-$(c.courses[v].name) has redundant requisite $(c.courses[u].name)\n" + end end extraneous = true end @@ -150,12 +157,15 @@ function extraneous_requisites(c::Curriculum, error_msg::IOBuffer) end end end - if extraneous == true - c.institution != "" ? write(error_msg, "\n$(c.institution): ") : "\n" - write(error_msg, " curriculum \'$(c.name)\' has extraneous requisites:\n") - write(error_msg, str) + if (extraneous == true) && (print == true) + c.institution != "" ? write(msg, "\n$(c.institution): ") : "\n" + write(msg, "curriculum $(c.name) has extraneous requisites:\n") + write(msg, str) + end + if print == true + println(String(take!(msg))) end - return extraneous + return redundant_reqs end # Compute the blocking factor of a course @@ -540,15 +550,59 @@ function basic_metrics(curric::Curriculum) write(buf, "for course(s): ") write_course_names(buf, max_cc_courses) write(buf, "\n Longest Path(s) --\n") - write(buf, " length = $(length(curric.metrics["longest paths"][1])), number of paths = $(length(curric.metrics["longest paths"])), path(s):\n") - for path in curric.metrics["longest paths"] - write(buf, " ") + write(buf, " length = $(length(curric.metrics["longest paths"][1])), number of paths = $(length(curric.metrics["longest paths"]))\n path(s):\n") + for (i, path) in enumerate(curric.metrics["longest paths"]) + write(buf, " path $i = ") write_course_names(buf, path, separator=" -> ") write(buf, "\n") end return buf end +function basic_statistics(curricula::Array{Curriculum,1}, metric_name::AbstractString) + buf = IOBuffer() + # set initial values used to find min and max metric values + total_metric = 0; STD_metric = 0 + if haskey(curricula[1].metrics, metric_name) + if typeof(curricula[1].metrics[metric_name]) == Float64 + max_metric = curricula[1].metrics[metric_name]; min_metric = curricula[1].metrics[metric_name]; + elseif typeof(curricula[1].metrics[metric_name]) == Tuple{Float64,Array{Number,1}} + max_metric = curricula[1].metrics[metric_name][1]; min_metric = curricula[1].metrics[metric_name][1]; # metric where total curricular metric as well as course-level metrics are stored in an array + end + end + for c in curricula + if !haskey(c.metrics, metric_name) + error("metric $metric_name does not exist in curriculum $(c.name)") + end + basic_metrics(c) + if typeof(c.metrics[metric_name]) == Float64 + value = c.metrics[metric_name] + elseif typeof(c.metrics[metric_name]) == Tuple{Float64,Array{Number,1}} + value = c.metrics[metric_name][1] # metric where total curricular metric as well as course-level metrics are stored in an array + end + total_metric += value + value > max_metric ? max_metric = value : nothing + value < min_metric ? min_metric = value : nothing + end + avg_metric = total_metric / length(curricula) + for c in curricula + if typeof(c.metrics[metric_name]) == Float64 + value = c.metrics[metric_name] + elseif typeof(c.metrics[metric_name]) == Tuple{Float64,Array{Number,1}} + value = c.metrics[metric_name][1] # metric where total curricular metric as well as course-level metrics are stored in an array + end + STD_metric = (value - avg_metric)^2 + end + STD_metric = sqrt(STD_metric / length(curricula)) + write(buf, "\n Metric -- $metric_name") + write(buf, "\n Number of curricula = $(length(curricula))") + write(buf, "\n Mean = $avg_metric") + write(buf, "\n STD = $STD_metric") + write(buf, "\n Max. = $max_metric") + write(buf, "\n Min. = $min_metric") + return(buf) +end + function write_course_names(buf::IOBuffer, courses::Array{Course,1}; separator::String=", ") if length(courses) == 1 write_course_name(buf, courses[1]) diff --git a/src/DataTypes.jl b/src/DataTypes.jl index 8e4c2580..8f23ec94 100644 --- a/src/DataTypes.jl +++ b/src/DataTypes.jl @@ -272,9 +272,6 @@ mutable struct Curriculum if !(isvalid_curriculum(this, errors)) printstyled("WARNING: Curriculum was created, but is invalid due to requisite cycle(s):", color = :yellow) println(String(take!(errors))) - elseif extraneous_requisites(this, errors) # extraneous requisites only checked if the curriculum is valid - printstyled("WARNING: $(this.institution) Curriculum: $(this.name) contains extraneous requisite(s).\n You may list extraneous requisites using the extraneous_requisites() function.\n\n", color = :yellow) - take!(errors) # flush the error buffer end return this end diff --git a/src/Visualization.jl b/src/Visualization.jl index 71236d05..21864e8a 100644 --- a/src/Visualization.jl +++ b/src/Visualization.jl @@ -2,6 +2,7 @@ using JSON using WebIO using HTTP using Blink +using StatsPlots import HTTP.Messages @@ -214,4 +215,69 @@ function viz_helper(plan::DegreePlan; changed, notebook, edit, hide_header=false ) return w end +end + +# Applies to scalar-valued metrics +function metric_histogram(curricula::Array{Curriculum,1}, metric_name::AbstractString; nbins::Int=5, title::AbstractString="", + xlabel::AbstractString="", ylabel::AbstractString="", xlim::Tuple{Int64,Int64}=(0,0), ylim::Tuple{Int64,Int64}=(0,0), + legend=false, alpha=0.7, color=:dodgerblue3) + metric_values = Array{Real,1}() + if xlim == (0,0) + xlower = 0 + xupper = 0 + end + for c in curricula + if haskey(c.metrics, metric_name) + if typeof(c.metrics[metric_name]) == Float64 + value = c.metrics[metric_name] + elseif typeof(c.metrics[metric_name]) == Tuple{Float64,Array{Number,1}} + value = c.metrics[metric_name][1] # metric where total curricular metric as well as course-level metrics are stored in an array + end + push!(metric_values, value) + if (@isdefined xlower) == true + (value < xlower) ? xlower = value : nothing + (value > xupper) ? xupper = value : nothing + end + else + error("metric_histogram(): $(metric_name) does not exist in the metric dictionary of $(c.name)") + end + end + if xlim == (0,0) + x_lim = (xlower, xupper) + else + x_lim = xlim + end + if ylim == (0,0) + y_lim = (0, length(curricula)/2) + else + y_lim = ylim + end + StatsPlots.histogram(metric_values, nbins=nbins, title=title, xlabel=xlabel, ylabel=ylabel, xlim=x_lim, ylim=y_lim, legend=legend, + alpha=alpha, color=color) +end + +# Applies to scalar-valued metrics +function metric_boxplot(series_labels::Array{String,2}, curricula::Array{Array{Curriculum,1},1}, metric_name::AbstractString; title::AbstractString="", + xlabel::AbstractString="", ylabel::AbstractString="", legend=false, alpha=0.7, color=:dodgerblue3) + if length(series_labels) != length(curricula) + error("metric_boxplot(): the number of series_labels and the number of curricula series do not match") + end + series_ary = Array{Array{Real,1},1}() # array of series arrays + for series in curricula + tmp_series = Array{Real,1}() + for c in series + if haskey(c.metrics, metric_name) + if typeof(c.metrics[metric_name]) == Float64 + value = c.metrics[metric_name] + elseif typeof(c.metrics[metric_name]) == Tuple{Float64,Array{Number,1}} + value = c.metrics[metric_name][1] # metric where total curricular metric as well as course-level metrics are stored in an array + end + push!(tmp_series, value) + else + error("metric_boxplot(): $(metric_name) does not exist in the metric dictionary of $(c.name)") + end + end + append!(series_ary, [tmp_series]) + end + StatsPlots.boxplot(series_labels, series_ary, title=title, xlabel=xlabel, ylabel=ylabel, legend=legend, alpha=alpha, color=color) end \ No newline at end of file diff --git a/test/CurricularAnalytics.jl b/test/CurricularAnalytics.jl index 187d2ea8..3a53440c 100644 --- a/test/CurricularAnalytics.jl +++ b/test/CurricularAnalytics.jl @@ -44,8 +44,8 @@ curric = Curriculum("Extraneous", [a, b, c, d], sortby_ID=false) # Test extraneous_requisites() errors = IOBuffer() -@test extraneous_requisites(curric, errors) == true -#@test String(take!(errors)) == "\nCurriculum Extraneous contains the following extraneous requisites:\nCourse C has redundant requisite: A" +@test length(extraneous_requisites(curric)) == 1 + # 8-vertex test curriculum - valid # @@ -77,7 +77,7 @@ curric = Curriculum("Underwater Basket Weaving", [A,B,C,D,E,F,G,H], institution= # Test isvalid_curriculum() and extraneous_requisites() errors = IOBuffer() @test isvalid_curriculum(curric, errors) == true -@test extraneous_requisites(curric, errors) == false +@test length(extraneous_requisites(curric)) == 0 # Test analytics @test delay_factor(curric) == (19.0, [3.0, 3.0, 3.0, 3.0, 3.0, 2.0, 1.0, 1.0]) @@ -121,7 +121,7 @@ curric = Curriculum("Postmodern Basket Weaving", [A,B,C,D,E,F,G], sortby_ID=fals # Test isvalid_curriculum() and extraneous_requisites() errors = IOBuffer() @test isvalid_curriculum(curric, errors) == true -@test extraneous_requisites(curric, errors) == false +@test length(extraneous_requisites(curric)) == 0 # Test analytics @test delay_factor(curric) == (32.0, [5.0, 5.0, 4.0, 5.0, 3.0, 5.0, 5.0]) @@ -162,7 +162,7 @@ curric = Curriculum("Underwater Basket Weaving", [A,B,C,D,E,F,G,H], institution= # Test isvalid_curriculum() and extraneous_requisites() errors = IOBuffer() @test isvalid_curriculum(curric, errors) == true -@test extraneous_requisites(curric, errors) == false +@test length(extraneous_requisites(curric)) == 0 # Test basic_metrics() basic_metrics(curric)