├── .gitmodules ├── .gitignore ├── Stability ├── test │ ├── Project.toml │ └── runtests.jl ├── Project.toml ├── scripts │ ├── julia │ │ ├── Project.toml │ │ ├── merge-intypes.jl │ │ ├── tables.jl │ │ ├── plot.jl │ │ └── Manifest.toml │ ├── proc_package_parallel.sh │ ├── pkgs-report.sh │ └── proc_package.sh └── src │ ├── equality.jl │ ├── pkg-test-override.jl │ ├── CSVize.jl │ ├── Stability.jl │ ├── Utils.jl │ ├── MethodAnalysis.jl │ └── Stats.jl ├── Overview.pdf ├── README.md ├── shell.nix ├── .github └── workflows │ └── ci.yml └── top-1000-pkgs.txt /.gitmodules: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | \.~* 2 | scratch 3 | Manifest.toml 4 | -------------------------------------------------------------------------------- /Stability/test/Project.toml: -------------------------------------------------------------------------------- 1 | [deps] 2 | Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 3 | -------------------------------------------------------------------------------- /Overview.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prl-julia/julia-type-stability/HEAD/Overview.pdf -------------------------------------------------------------------------------- /Stability/Project.toml: -------------------------------------------------------------------------------- 1 | name = "Stability" 2 | uuid = "e1676b14-8c06-4561-a70e-1251724d84d9" 3 | authors = ["Artem Pelenitsyn "] 4 | version = "0.1.0" 5 | 6 | [deps] 7 | CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" 8 | MethodAnalysis = "85b6ec6f-f7df-4429-9514-a64bcd9ee824" 9 | Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 10 | -------------------------------------------------------------------------------- /Stability/scripts/julia/Project.toml: -------------------------------------------------------------------------------- 1 | [deps] 2 | CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" 3 | DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 4 | Query = "1a8c2f83-1ff3-5112-b086-8aa67b057ba1" 5 | Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 6 | StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" 7 | StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## julia-type-stability 2 | 3 | **OOPSLA '21 Paper Note:** The best documentation we have so far is 4 | [Overview.pdf](./Overview.pdf): it documents the artifact of [the relevant 5 | OOPSLA '21 paper][doi]. If interested in the artifact, please, checkout the 6 | `artifact` branch on this repo. 7 | 8 | [doi]: https://doi.org/10.1145/3485527 9 | 10 | 11 | -------------------------------------------------------------------------------- /shell.nix: -------------------------------------------------------------------------------- 1 | # pin nixpkgs to NixOS 21.05 release 2 | with (import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/f77036342e2b690c61c97202bf48f2ce13acc022.tar.gz") {}); 3 | mkShell { 4 | buildInputs = [ 5 | julia-stable # that's Julia 1.5.4 6 | parallel 7 | coreutils # timeout 8 | 9 | # need these two to download package sources: 10 | wget 11 | cacert 12 | 13 | # convinience 14 | less 15 | ]; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Run tests 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | runs-on: ${{ matrix.os }} 8 | strategy: 9 | matrix: 10 | julia-version: ['1.8'] # NOTE: we'd like but can't do 'nightly' atm due to 11 | # https://github.com/JuliaLang/julia/pull/49071 12 | julia-arch: [x64] 13 | os: [ubuntu-latest, windows-latest, macOS-latest] 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | - uses: julia-actions/setup-julia@v1 18 | with: 19 | version: ${{ matrix.julia-version }} 20 | arch: ${{ matrix.julia-arch }} 21 | - uses: julia-actions/cache@v1 22 | - uses: julia-actions/julia-buildpkg@v1 23 | with: 24 | project: Stability 25 | - uses: julia-actions/julia-runtest@v1 26 | with: 27 | project: Stability 28 | -------------------------------------------------------------------------------- /Stability/scripts/proc_package_parallel.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Batch processing of packages for type stability analysis. 4 | # Arguments: 5 | # $1 -- file with a list of packages; every line there is of "name version" format; 6 | # $2 -- optional, number of first lines in $1 to consider. 7 | # Output: 8 | # In the current dir creates a set of subdirs named after packages listed in $1; 9 | # with the type stability analysis results; also creates a summary report in the 10 | # current directory (report.csv). 11 | # Notes 12 | # - piggy-backs on the proc_package.sh script to process each package; 13 | # - depends on GNU parallel at the moment; in theory, could instead just do 14 | # a sequential loop (TODO add this guarded by a parameter). 15 | 16 | set -euo pipefail 17 | 18 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" 19 | 20 | lines=$(wc -l $1 | awk '{print $1}') 21 | head -n ${2:-$lines} $1 | BATCH=1 parallel "$DIR/proc_package.sh" 22 | $DIR/pkgs-report.sh $1 ${2:-$lines} 23 | -------------------------------------------------------------------------------- /Stability/test/runtests.jl: -------------------------------------------------------------------------------- 1 | using Test 2 | using Stability 3 | 4 | module M 5 | 6 | f(x::Int64) = 42 7 | 8 | end 9 | 10 | @testset "Basic tests for computing module stats" begin 11 | 12 | # Dummy test: untill the funciton is compiled (e.g. run at least once), 13 | # we won't see any stats: 14 | @test module_stats(M) == ModuleStats(M) 15 | 16 | M.f(1) # compile 17 | 18 | fmeth=methods(M.f)[1] 19 | finst=fmeth.specializations[1] 20 | 21 | @test module_stats(M) == 22 | ModuleStats(M, 23 | Dict(fmeth => MethodStats(; occurs=1, stable=1, grounded=1, nospec=0, vararg=0, fail=0)), 24 | Dict(finst => MIStats(; st=1, gd=1, gt=0, rt=0, rettype=Int64, intypes=Core.svec(Int64))), 25 | Dict(Int64 => InTypeStats("Main.M", "Core", 1, 0)), 26 | ) 27 | end 28 | 29 | @testset "Utils " begin 30 | @test Stability.slice_parametric_type(Ref{Ref{Int}}) == 31 | [ 32 | (Int64, 2), 33 | (Ref{Int64}, 1), 34 | (Ref{Ref{Int64}}, 0) 35 | ] 36 | end 37 | -------------------------------------------------------------------------------- /Stability/scripts/pkgs-report.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 4 | # Generate summary report (report.csv) 5 | # 6 | # Call: 7 | # 8 | # pkgs-repo.sh <# of first packages in the packakge list> 9 | # 10 | # both parameters are optional. If none is given, search for analysis summaries 11 | # in all subdirs of the current dir. 12 | # 13 | # Assumes: 14 | # Stabilty analysis (using proc_package.sh) has finished in the current directory 15 | # producing raw data including summaries (stability-summaty.out files) in 16 | # subdirs of the current dir. 17 | # 18 | 19 | set -euo pipefail 20 | 21 | SUMMARY_FILE="stability-summary.out" 22 | 23 | function report { 24 | for p in $(awk '{print $1}' $1); do 25 | ofile="$p/$SUMMARY_FILE" 26 | if [ -f $ofile ]; then 27 | cat $ofile 28 | fi 29 | done 30 | } 31 | 32 | ADD_HEAD='1i package,Methods,Instances,stable,grounded,nospec,vararg,Fail' 33 | 34 | if [[ $# -eq 0 ]] ; then 35 | find . -maxdepth 2 -name "$SUMMARY_FILE" -exec cat {} + | sort | sed "$ADD_HEAD" > report.csv 36 | else 37 | res=$(report $1) 38 | lines=$(echo "$res" | wc -l | awk '{print $1}') 39 | res2=$(echo "$res" | head -n ${2:-$lines}) 40 | echo "$res2" | sed "$ADD_HEAD" > report.csv 41 | fi 42 | -------------------------------------------------------------------------------- /Stability/scripts/julia/merge-intypes.jl: -------------------------------------------------------------------------------- 1 | @info "Starting merge-types.jl. Using packages..." 2 | using CSV, DataFrames, Query 3 | @info "... done." 4 | 5 | # 6 | # Merge stability-stats-intypes.csv table summing up occurs field. 7 | # 8 | # Run from a root of a pkgs directory, i.e. every subdir corresponds to 9 | # a package and holds a `stability-stats-intypes.csv` file, e.g. 10 | # 11 | # ❯ JULIA_PROJECT=~/s/repo/Stability/scripts/julia julia ~/s/repo/Stability/scripts/julia/merge-intypes.jl 12 | # 13 | 14 | 15 | idir="." 16 | 17 | main() = begin 18 | resdf = DataFrame() 19 | for package in readdir(idir) 20 | isfile(package) && continue 21 | in="$idir/$package/stability-stats-intypes.csv" 22 | isfile(in) || (@warn "File not found: $in"; continue;) 23 | @info "Processing " package 24 | resdf = vcat(resdf, CSV.read(in, DataFrame)) 25 | resdf = @from i in resdf begin 26 | @group i.occurs by i.pack, i.modl, i.tyname, i.depth into g 27 | @select {pack=key(g)[1], modl=key(g)[2], tyname=key(g)[3], occurs=sum(g), depth=key(g)[4]} 28 | @collect DataFrame 29 | end 30 | end 31 | resdf = resdf |> @orderby_descending(_.depth) |> DataFrame # we will be loading deepest-nested types first 32 | 33 | outf = "merged-intypes.csv" 34 | @info "Storing results in $outf" 35 | CSV.write(outf, resdf) 36 | @info "Done. Bye!" 37 | end 38 | 39 | main(); 40 | -------------------------------------------------------------------------------- /Stability/scripts/julia/tables.jl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env julia 2 | using CSV, DataFrames, Statistics, StatsBase 3 | 4 | # Script to generate Tables 1 and 2 of the paper 5 | # Input: file "report.csv" generated by `scripts/pkgs-report.sh` in the working dir 6 | # Ouput: terminal 7 | 8 | df=CSV.File("report.csv") |> DataFrame 9 | 10 | # Computes the ratio n/d if denominator isn't 0 11 | getRatio(n, d) = d == 0 ? 0 : n / d 12 | 13 | df[!, "Inst/Meth"] = round.(getRatio.(df.Instances, df.Methods), digits=1) 14 | 15 | df[!, "Varargs (%)"] = round.(Int, getRatio.(df.vararg, df.Methods) .* 100) 16 | df[!, "Stable (%)"] = round.(Int, getRatio.(df.stable, df.Instances) .* 100) 17 | df[!, "Grounded (%)"] = round.(Int, getRatio.(df.grounded, df.Instances) .* 100) 18 | 19 | select!(df, Not([:stable ,:grounded, :nospec, :vararg, :Fail])) 20 | 21 | # stats for Table 1 22 | c = nrow(df) > 1 # don't use Bessel's correction for std dev if only one row is present 23 | stst = round.(Int, mean_and_std(df[!, "Stable (%)"]; corrected=c)) 24 | grst = round.(Int, mean_and_std(df[!, "Grounded (%)"]; corrected=c)) 25 | df1 = DataFrame( 26 | :Stats => ["Mean", "Median", "Std. Dev."], 27 | :Stable => [stst[1], median(df[!, "Stable (%)"]), stst[2]], 28 | :Grounded => [grst[1], median(df[!, "Grounded (%)"]), grst[2]] ) 29 | 30 | println("Table 1") 31 | println(df1) 32 | println() 33 | 34 | df2 = first(df, 10) 35 | sort!(df2) 36 | println("Table 2") 37 | println(df2) 38 | 39 | -------------------------------------------------------------------------------- /Stability/src/equality.jl: -------------------------------------------------------------------------------- 1 | ####################################################################### 2 | # 3 | # Generic definition of structural equality of structs 4 | # 5 | # Authors: Julia Belyakova, Artem Pelenitsyn 6 | # 7 | ####################################################################### 8 | 9 | # (T, T) → Bool 10 | # Checks `e1` and `e2` for structural equality, 11 | # i.e. compares all the fields of `e1` and `e2` 12 | # Returns `true` if values are equal 13 | # ASSUMTION: `e1` and `e2` have the same run-time type 14 | # NOTE: Relies on metaprogramming 15 | @generated structEqual(e1, e2) = begin 16 | # if there are no fields, we can simply return true 17 | if fieldcount(e1) == 0 18 | return :(true) 19 | end 20 | mkEq = fldName -> :(e1.$fldName == e2.$fldName) 21 | # generate individual equality checks 22 | eqExprs = map(mkEq, fieldnames(e1)) 23 | # construct &&-expression for chaining all checks 24 | mkAnd = (expr, acc) -> Expr(:&&, expr, acc) 25 | # no need in initial accumulator because eqExprs is not empty 26 | foldr(mkAnd, eqExprs) 27 | end 28 | 29 | # (Any, Any) → Bool 30 | # Checks `e1` and `e2` of arbitrary run-time types 31 | # for structural equality and returns `true` if values are equal 32 | genericStructEqual(e1, e2) = 33 | # if types are different, expressions are not equal 34 | typeof(e1) != typeof(e2) ? 35 | false : 36 | # othewise we need to perform a structural check 37 | structEqual(e1, e2) 38 | 39 | # Derive a method of `==` for the given type 40 | macro deriveEq(T) 41 | :(Base.:(==)(x::$T, y::$T) = structEqual(x,y)) 42 | end 43 | -------------------------------------------------------------------------------- /Stability/scripts/proc_package.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 4 | # Process/validate arguments: 5 | # - args[0] -- package name 6 | # - args[1] (optional) -- package version 7 | # 8 | # Env vars: 9 | # - BATCH=true will put the output to a file rather than on the console 10 | # 11 | if [[ $# -eq 0 ]]; then 12 | echo "Error: missing arguments. Provide package name to process and, optionally, its version." 13 | exit 1 14 | fi 15 | args=( $1 ) 16 | pkg="${args[0]}" 17 | if (( ${#args[@]} == 2 )); then 18 | ver="${args[1]}" 19 | PACKAGE_STATS_CALL="package_stats(\"$pkg\",\"$ver\")" 20 | elif ! [ -z ${2+x} ]; then 21 | ver="$2" 22 | PACKAGE_STATS_CALL="package_stats(\"$pkg\",\"$ver\")" 23 | else 24 | PACKAGE_STATS_CALL="package_stats(\"$pkg\")" 25 | fi 26 | PACKAGE_STATS_CALL="using Pkg; Pkg.instantiate(); using Stability; ${PACKAGE_STATS_CALL}" 27 | 28 | # Record current directory. Note: don't move around or it'll stop working! 29 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" 30 | 31 | # Silent versions of pushd/popd 32 | pushd () { 33 | command pushd "$@" > /dev/null 34 | } 35 | popd () { 36 | command popd "$@" > /dev/null 37 | } 38 | 39 | # 40 | # Prepare and cd into clean directory 41 | # Intend to keep Julia depot there, so make a dir for it 42 | # 43 | mkdir -p "$pkg/depot" 44 | pushd $pkg 45 | 46 | # 47 | # Call Julia with a timeout 48 | # 49 | STABILITY_HOME="$DIR/../" 50 | 51 | # NOTE: Below the main command is spelled twice on every branch of if -- this is unfortunate 52 | # Make sure to edit both instances if you want to update the command 53 | if [ -z "${BATCH}" ]; then 54 | DEV=YES JULIA_DEPOT_PATH="$PWD/depot" timeout 2400 julia --project="$STABILITY_HOME" -e "$PACKAGE_STATS_CALL" 2>&1 55 | retcode=$? 56 | echo "$retcode" > test-result.txt 57 | else 58 | out="$(DEV=YES JULIA_DEPOT_PATH="$PWD/depot" timeout 2400 julia --project="$STABILITY_HOME" -e "$PACKAGE_STATS_CALL" 2>&1)" 59 | retcode=$? 60 | echo "$retcode" > test-result.txt 61 | echo "$out" > test-out.txt 62 | fi 63 | 64 | popd 65 | 66 | # ATTENTION 67 | # The rm below is needed when run over big set of packages so that we don't run out 68 | # of disk space. Otherwise it's pretty expensive to restart the analysis. 69 | # rm -rf "$pkg/depot" 70 | -------------------------------------------------------------------------------- /Stability/scripts/julia/plot.jl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env julia 2 | using CSV, DataFrames 3 | 4 | # 5 | # Entry point to this script is `plot_all_pkgs` (at the very bottom) for 6 | # batch processing of many packages or `plot_pkg` for plotting individual package 7 | # 8 | 9 | # Metrics we plot grouped by granularity (method vs instance) 10 | metrics = Dict( 11 | "method" => 12 | [ :size ], 13 | 14 | "instance" => 15 | [ :gotos, :returns ] 16 | ) 17 | 18 | ENV["GKSwstype"] = "nul" # need to run headless (no graphics) 19 | 20 | OUTPUT_FORMAT = "pdf" # default, but may end up broken in some PDF viewers 21 | #"svg" # alternative that is more portable 22 | 23 | using Plots, Plots.PlotMeasures, StatsPlots 24 | 25 | # Plot a 2D histogram with OY = a stability metrics (stable or grounded) 26 | # and OX some other label in the dataframe. 27 | # Input: 28 | # - `df` -- dataframe with columns: OX and OY (at least). 29 | # - label for OX axis (should name a column in df) 30 | # - label for OY axis (should name a column in df) 31 | # Output: none 32 | # Side Effect: 33 | # - create a graphic on the virtual plot. 34 | plot_2d_histogram(pkg :: AbstractString; ox :: Symbol = :size, oy :: Symbol = :stable, 35 | granularity :: String = "method") = begin 36 | in = "$pkg/stability-stats-per-$(granularity).csv" 37 | isfile(in) || (@warn "No stats file for package $pkg (failed to open $in)"; return) 38 | df = CSV.read(in, DataFrame) 39 | mi=max(1, minimum(df[!, ox])) 40 | ma=maximum(df[!, ox]) 41 | @df df histogram2d( 42 | cols(ox), 43 | cols(oy), 44 | c=cgrad(:viridis), 45 | cb = true, 46 | xtickfont=13, 47 | ytickfont=13, 48 | left_margin = 5px, 49 | right_margin = 20px, 50 | nbins=(20,10), 51 | xlim=[mi,ma+ma/20], 52 | ylim=[0,1.2]) # OX scale is adaptive but OY is always 0 to 1 -- 53 | # for groundedness or stability 54 | end 55 | 56 | # Some metrics apply only to granularity "method", others -- to granularity 57 | # "(method) instance". This method loops over metrics applying to the given 58 | # granularity and plots all of them for the given package. 59 | plot_pkg_by_granularity(pkg :: AbstractString, gran :: String) = begin 60 | oys = [:stable, :grounded] 61 | oxs = metrics[gran] 62 | for ox in oxs 63 | for oy in oys 64 | @info "About to plot $pkg: $(ox) by $(oy)" 65 | plot_2d_histogram(pkg;ox=ox,oy=oy,granularity=gran) 66 | mkpath("$(pkg)/figs") 67 | savefig("$(pkg)/figs/$(pkg)-$(ox)-vs-$(oy).$(OUTPUT_FORMAT)") 68 | end 69 | end 70 | end 71 | 72 | # Plot all possible metrics for the given package 73 | plot_pkg(pkg :: AbstractString) = begin 74 | plot_pkg_by_granularity(pkg, "method") 75 | plot_pkg_by_granularity(pkg, "instance") 76 | end 77 | 78 | # Plot every metric for every package in the list stored in `pkgs_file` 79 | # Assumes: every package name corespondes to a dir in the current dir 80 | plot_all_pkgs(pkgs_file :: String, ox :: Symbol = :size, oy :: Symbol = :stable, 81 | granularity :: String = "method") = begin 82 | isfile(pkgs_file) && !isdir(pkgs_file) || 83 | error("Invalid package list file $pkgs_file") 84 | 85 | pkgs = readlines(pkgs_file) 86 | for p in pkgs 87 | plot_pkg(split(p)[1]) 88 | end 89 | end 90 | -------------------------------------------------------------------------------- /Stability/src/pkg-test-override.jl: -------------------------------------------------------------------------------- 1 | using Pkg 2 | 3 | # Overrides the function that is called before the running of package tests 4 | # History: the idea of this hack is taken from 5 | # https://github.com/julbinb/juliette-wa/blob/9f6d4f24f31cb7e59b3928f1cc40c8380d8d3c40/src/analysis/dynamic-analysis/override-core/test-override.jl 6 | function Pkg.Operations.gen_test_code(testfile::String; 7 | coverage=false, 8 | julia_args::Cmd=``, 9 | test_args::Cmd=``) 10 | code = """ 11 | #### Prepare env (standard) 12 | # 13 | push!(LOAD_PATH, "@") 14 | push!(LOAD_PATH, "@v#.#") 15 | push!(LOAD_PATH, "@stdlib") 16 | $(Base.load_path_setup_code(false)) 17 | cd($(repr(dirname(testfile)))) 18 | append!(empty!(ARGS), $(repr(test_args.exec))) 19 | 20 | #### Prepare Stability.jl 21 | # 22 | stability_root = dirname("$(@__DIR__)") 23 | push!(LOAD_PATH, stability_root) 24 | using Stability 25 | pakg=ENV["STAB_PKG_NAME"] 26 | wdir=ENV["WORK_DIR"] 27 | #### End 28 | 29 | #### Run tests (standard + try-catch) 30 | # 31 | try 32 | @info "[Stability] [Package: " * pakg * "] Hooks are on. About to start testing" 33 | include($(repr(testfile))) 34 | @info "[Stability] [Package: " * pakg * "] Testing is finished successfully" 35 | catch error 36 | println("Warning: Error when running tests for package " * pakg) 37 | end 38 | 39 | #### Run Stability Analysis: 40 | # 41 | @info "[Stability] [Package: " * pakg * "] About to start analysis" 42 | m = eval(Symbol(pakg)) # typeof(m) is Module 43 | open(joinpath(wdir, "stability-errors.out"), "w") do err 44 | ms = module_stats(m, err, wdir) 45 | @info "[Stability] [Package: " * pakg * "] Computed module stats" 46 | 47 | summary = modstats_summary(ms) 48 | @info "[Stability] [Package: " * pakg * "] Computed module summary. About to store results in a file" 49 | open(out -> println(out, pakg * "," * show_comma_sep(summary)), joinpath(wdir, "stability-summary.out"), "w") 50 | 51 | @info "[Stability] [Package: " * pakg * "] Constructing a table from the stats..." 52 | (methst, mist, tyst) = modstats_table(ms) 53 | 54 | @info "[Stability] [Package: " * pakg * "] Table size (per method): " * string(length(methst)) 55 | outf = joinpath(wdir, "stability-stats-per-method.txt") 56 | @info "[Stability] [Package: " * pakg * "] About to store per method results to: " * outf 57 | open(f-> println(f,methst), outf,"w") 58 | 59 | @info "[Stability] [Package: " * pakg * "] Table size (per instance): " * string(length(mist)) 60 | outf = joinpath(wdir, "stability-stats-per-instance.txt") 61 | @info "[Stability] [Package: " * pakg * "] About to store per instance results to: " * outf 62 | open(f-> println(f,mist), outf,"w") 63 | 64 | @info "[Stability] [Package: " * pakg * "] Table size (types): " * string(length(tyst)) 65 | outf = joinpath(wdir, "stability-stats-intypes.txt") 66 | @info "[Stability] [Package: " * pakg * "] About to store intypes to: " * outf 67 | open(f-> println(f,tyst), outf,"w") 68 | end 69 | @info "[Stability] [Package: " * pakg * "] Finish testing + analysis" 70 | #### End 71 | """ 72 | @debug code 73 | return ``` 74 | $(Base.julia_cmd()) 75 | --code-coverage=$(coverage ? "user" : "none") 76 | --color=$(Base.have_color === nothing ? "auto" : Base.have_color ? "yes" : "no") 77 | --compiled-modules=$(Bool(Base.JLOptions().use_compiled_modules) ? "yes" : "no") 78 | --check-bounds=yes 79 | --depwarn=$(Base.JLOptions().depwarn == 2 ? "error" : "yes") 80 | --inline=$(Bool(Base.JLOptions().can_inline) ? "yes" : "no") 81 | --startup-file=$(Base.JLOptions().startupfile == 1 ? "yes" : "no") 82 | --track-allocation=$(("none", "user", "all")[Base.JLOptions().malloc_log + 1]) 83 | $(julia_args) 84 | --eval $(code) 85 | ``` 86 | end 87 | 88 | -------------------------------------------------------------------------------- /Stability/src/CSVize.jl: -------------------------------------------------------------------------------- 1 | # 2 | # Reshape the stats into a tabular form for storing as CSV 3 | # 4 | 5 | struct ModuleStatsPerMethodRecord 6 | modl :: String 7 | funcname :: String 8 | occurs :: Int 9 | stable :: Float64 10 | grounded :: Float64 11 | rettypes :: Int 12 | nospec :: Int 13 | vararg :: Int 14 | size :: Int 15 | file :: String 16 | line :: Int 17 | end 18 | 19 | struct ModuleStatsPerInstanceRecord 20 | modl :: String 21 | funcname :: String 22 | stable :: Bool 23 | grounded :: Bool 24 | gotos :: Int 25 | returns :: Int 26 | rettype :: String 27 | intypes :: String 28 | file :: String 29 | line :: Int 30 | end 31 | 32 | struct ModuleStatsInTypeRecord 33 | pack :: String 34 | modl :: String 35 | tyname :: String 36 | occurs :: Int 37 | depth :: Int 38 | end 39 | 40 | # 41 | # Convert stats dicitonaries to vectors of records 42 | # 43 | modstats_table(ms :: ModuleStats, errio = stdout :: IO) :: 44 | Tuple{ 45 | Vector{ModuleStatsPerMethodRecord}, 46 | Vector{ModuleStatsPerInstanceRecord}, 47 | Vector{ModuleStatsInTypeRecord}} = begin 48 | 49 | resmeth = [] 50 | resmi = [] 51 | resty = [] 52 | 53 | m2rettype = Dict{Method, Set{String}}() 54 | for (mi,cfgst) in ms.mistats 55 | try 56 | meth = mi.def 57 | modl = "$(meth.module)" 58 | mename = "$(meth.name)" 59 | msrclen = length(meth.source) 60 | rettype = "$(cfgst.rettype)" 61 | intypes = join(cfgst.intypes, ",") 62 | mfile = "$(meth.file)" 63 | mline = meth.line 64 | push!(resmi, 65 | ModuleStatsPerInstanceRecord( 66 | modl, mename, 67 | cfgst.st, cfgst.gd, 68 | cfgst.gt, cfgst.rt, 69 | rettype, intypes, 70 | mfile, mline)) 71 | push!(get!(m2rettype, meth, Set{String}()), rettype) 72 | catch err 73 | if !endswith(err.msg, "has no field var") # see JuliaLang/julia/issues/38195 74 | println(errio, "ERROR: modstats_table: mi-loop: $(mi)"); 75 | throw(err) 76 | else 77 | @info "the #38195 bug with $mename" 78 | end 79 | end 80 | end 81 | for (meth,fstats) in ms.mestats 82 | try 83 | modl = "$(meth.module)" 84 | mname = "$(meth.name)" 85 | msrclen = length(meth.source) 86 | mfile = "$(meth.file)" 87 | mline = meth.line 88 | push!(resmeth, 89 | ModuleStatsPerMethodRecord( 90 | modl, mname, fstats.occurs, 91 | fstats.stable/fstats.occurs, fstats.grounded/fstats.occurs, 92 | length(get(m2rettype, meth, Set{String}())), # lookup can fail either 93 | # b/c JuliaLang/julia/issues/38195 or 94 | # type inference failure inside module_stats() 95 | meth.nospecialize, fstats.vararg, 96 | msrclen, 97 | mfile, mline)) 98 | catch err 99 | println(errio, "ERROR: modstats_table: m-loop: $(meth)"); 100 | throw(err) 101 | end 102 | end 103 | for (ty,tystat) in ms.tystats 104 | try 105 | pack = tystat.pack 106 | modl = "$(tystat.modl)" 107 | tyname = "$(ty)" 108 | push!(resty, 109 | ModuleStatsInTypeRecord(pack, modl, tyname, tystat.occurs, tystat.depth)) 110 | catch err 111 | println(errio, "ERROR: modstats_table: ty-loop: $err"); 112 | throw(err) 113 | end 114 | end 115 | (resmeth,resmi,resty) 116 | end 117 | -------------------------------------------------------------------------------- /Stability/src/Stability.jl: -------------------------------------------------------------------------------- 1 | # 2 | # Package for Type Stability analysis of Julia packages 3 | # 4 | module Stability 5 | 6 | using Core: MethodInstance, CodeInstance, CodeInfo 7 | using MethodAnalysis: visit 8 | using Pkg 9 | using CSV 10 | 11 | export is_concrete_type, is_grounded_call, all_mis_of_module, 12 | MIStats, MethodStats, InTypeStats, ModuleStats, 13 | module_stats, modstats_summary, modstats_table, 14 | package_stats, cfg_stats, 15 | show_comma_sep 16 | 17 | # 18 | # Configuration Parameters 19 | # 20 | 21 | # We do nasty things with Pkg.test 22 | if get(ENV, "DEV", "NO") != "NO" 23 | include("pkg-test-override.jl") 24 | end 25 | 26 | # turn on debug info: 27 | # julia> ENV["JULIA_DEBUG"] = Main 28 | # turn off: 29 | # juila> ENV["JULIA_DEBUG"] = nothing 30 | 31 | include("MethodAnalysis.jl") 32 | include("Stats.jl") 33 | include("CSVize.jl") 34 | include("Utils.jl") 35 | 36 | # 37 | # The main entry point for package-level analysis 38 | # 39 | 40 | # package_stats: (pakg: String, ver: String) -> IO () 41 | # 42 | # In the current directory: 43 | # - runs stability analysis for the package `pakg` of version `ver` (initializing package environment accordingly) 44 | # - results are stored in the following files of the current directory (see also "Side Effects" below): 45 | # * stability-stats.out 46 | # * stability-errors.out 47 | # * stability-stats-per-method.csv 48 | # * stability-stats-per-instance.csv 49 | # * stability-stats-intypes.csv 50 | # * $pakg-version.txt (version stamp for future reference) 51 | # 52 | # Setting a package version: 53 | # The `ver` parameter has been added recently, and has rough corners. E.g. if you call the function in 54 | # a directory with a manifest file, we'll process the version specified in the manifest instead of `ver`. 55 | # So, be sure to run in an empty dir if you care about the `ver` parameter. 56 | # 57 | # Side effects: 58 | # In the current directory, creates a temporary environment for this package, and the resulting files. 59 | # Reusing this env shouldn't harm anyone (in theory). 60 | # 61 | # Parallel execution: 62 | # Possible e.g. with the aid of GNU parallel and the tiny script in scripts/proc_package_parallel.sh. 63 | # It requires a file with a list of packages passed as the first argument. 64 | # 65 | # REPL: 66 | # Make sure to run from a reasonable dir, e.g. create a dir for this package yourself 67 | # and cd into it before calling. 68 | # 69 | package_stats(pakg :: String, ver = nothing) = begin 70 | work_dir = pwd() 71 | ENV["STAB_PKG_NAME"] = pakg 72 | ENV["WORK_DIR"] = work_dir 73 | pkgtag = pakg * (ver === nothing ? "" : "@v$ver") 74 | 75 | # 76 | # Set up and test the package `pakg` 77 | # 78 | @myinfo pkgtag "Starting up" 79 | try 80 | Pkg.activate(".") # Switch from Stability package-local env to a temp env 81 | if isfile("Manifest.toml") 82 | Pkg.instantiate() # package environment has been setup beforehand 83 | else 84 | Pkg.add(name=pakg, version=ver) 85 | end 86 | # Sanity checking w.r.t Manifest vs $ver parameter 87 | iver = installed_pkg_version(pakg) 88 | if !(ver === nothing) && ver != iver 89 | throw(ErrorException("[Stability] The Manifest file in the current directory declares " * 90 | "a version of the package $pakg other than requested. " * 91 | "Either remove the Manifest or don't supply the version.")) 92 | end 93 | iver === nothing || (pkgtag = pakg * "@v$iver") 94 | @myinfo pkgtag "Added. Now on to testing" 95 | Pkg.test(pakg) 96 | store_cur_version(pakg) 97 | catch err 98 | println("[Stability] Error when running tests for package $(pakg)") 99 | errio=stderr 100 | print(errio, "ERROR: "); 101 | showerror(errio, err, stacktrace(catch_backtrace())) 102 | println(errio) 103 | finally 104 | Pkg.activate(dirname(@__DIR__)) # switch back to Stability env 105 | end 106 | 107 | # 108 | # Write down the results 109 | # 110 | txtToCsv(work_dir, "stability-stats-per-method") 111 | txtToCsv(work_dir, "stability-stats-per-instance") 112 | txtToCsv(work_dir, "stability-stats-intypes") 113 | @myinfo pkgtag "Results successfully converted to CSV. The package is DONE!" 114 | end 115 | 116 | end # module 117 | -------------------------------------------------------------------------------- /Stability/src/Utils.jl: -------------------------------------------------------------------------------- 1 | # 2 | # Kitchen sink 3 | # 4 | 5 | # Filter out some uninteresting data, mostly the standard library 6 | # (otherwise we would be measuring the standard library all over again) 7 | is_blocklisted(modl_proccessed :: Module, modl_mi :: Module) = begin 8 | mmi="$modl_mi" 9 | mp="$modl_proccessed" 10 | 11 | startswith(mmi,mp) && return false 12 | 13 | return startswith(mmi, "Base") || 14 | startswith(mmi, "Core") || 15 | startswith(mmi, "REPL") || 16 | mmi in ["Test", "Random",] || 17 | false 18 | end 19 | 20 | # store_cur_version :: String -> IO () 21 | # Store the version of the given package that we just processed into a file 22 | # named "version.txt" 23 | store_cur_version(pkg::String) = begin 24 | ver = installed_pkg_version(pkg) 25 | fname= "version.txt" 26 | write(fname, "$ver") 27 | @info "[Stability] Write down $pkg version to $fname" 28 | end 29 | 30 | # installed_pkg_version :: String -> IO Union{String, Nothing} 31 | # Will querry current environment for the version of given package 32 | # dependency and return its version or Nothing if the package is not 33 | # in the list of dependencies. 34 | # 35 | installed_pkg_version(pkg::String) = begin 36 | deps = collect(values(Pkg.dependencies())) 37 | i = findfirst(i -> i.name == pkg, deps) 38 | if i === nothing 39 | nothing 40 | else 41 | string(deps[i].version) 42 | end 43 | end 44 | 45 | macro myinfo(pkgtag, msg) 46 | esc(:( @info ("[Stability] [Package: " * $pkgtag * "] " * $msg ) )) 47 | end 48 | 49 | txtToCsv(work_dir :: String, basename :: String) = begin 50 | resf = joinpath(work_dir, "$basename.txt") 51 | isfile(resf) || (throw(ErrorException("Stability analysis failed to produce output $resf"))) 52 | st = 53 | eval(Meta.parse( 54 | open(f-> read(f,String), resf,"r"))) 55 | CSV.write(joinpath(work_dir, "$basename.csv"), st) 56 | end 57 | 58 | moduleChainOfType(@nospecialize(ty)) :: String = begin 59 | mod=parentmodule(ty) 60 | res="$mod" 61 | while parentmodule(ty) != mod 62 | mod = parentmodule(mod) 63 | res = "$mod." * res 64 | end 65 | res 66 | end 67 | 68 | # 69 | # sequence_nothing : (v :: Vector{Union{T, Nothing}}) -> Union{Nothing, Vector{T}} 70 | # 71 | # traverse_nothing looks into the given vetor and if it sees nothing, returns nothing, 72 | # otherwise it returns the input vector. 73 | # 74 | # traverse_nothing([1,nothing,2]) |-> nothing 75 | # traverse_nothing([1,2]) |-> [1,2] 76 | # 77 | sequence_nothing(v :: Vector) :: Union{Nothing, Vector} = begin 78 | any(isnothing, v) && return nothing 79 | v 80 | end 81 | 82 | 83 | # 84 | # slice_parametric_type: (ty, depth :: Int) -> Union{ 85 | # Vector{Tuple{Any, Int}}, 86 | # Nothing} 87 | # 88 | # Slice a type constructor into pieces, record the depth of nestedness of every piece. 89 | # 90 | # Example: Vector{Vector{Int}} |-> [(Vector{Vector{Int}}, 0), (Vector{Int}, 1), (Int, 2)] 91 | # 92 | # If we see existentials anywhere in the type, we return nothing because we're unsure how 93 | # to deal with variables (a naive approach would yield pieces with unbound variables). 94 | # 95 | slice_parametric_type(@nospecialize(ty), depth :: Int = 0) :: Union{Vector{Tuple{Any, Int}}, Nothing} = begin 96 | 97 | ####### Special cases: 98 | # 99 | # - Unions 100 | ty == Union{} && return [] # empty union 101 | typeof(ty) == Union && # binary union 102 | return sequence_nothing(vcat(slice_parametric_type(ty.a, depth+1), 103 | slice_parametric_type(ty.b, depth+1))) 104 | 105 | # - Varargs 106 | typeof(ty) == Core.TypeofVararg && return sequence_nothing(slice_parametric_type(ty.T, depth+1)) 107 | 108 | # - Most likely values, or something weird with no field `parameters` 109 | hasproperty(ty, :parameters) || return [] 110 | 111 | # - Existentials (UnionAll): we explicitly discqualify types that have existentials for now 112 | typeof(ty) == UnionAll && return nothing 113 | 114 | ####### Normal stuff: atoms and parametric constructors 115 | # 116 | params = ty.parameters 117 | 118 | # - Non-parametric atomic type 119 | isempty(params) && return [(ty, depth)] 120 | 121 | # - parametric 122 | rec = map(ty1 -> slice_parametric_type(ty1, depth+1), params) 123 | recFlat = reduce(vcat, rec) 124 | sequence_nothing(push!(recFlat, (ty, depth))) 125 | end 126 | -------------------------------------------------------------------------------- /Stability/src/MethodAnalysis.jl: -------------------------------------------------------------------------------- 1 | # 2 | # Pure method stability analysis 3 | # 4 | # Inspired by Julia's @code_warntyped, so uses Julia's own type inference 5 | # 6 | 7 | # Instead of printing concretness of inferred type (as @code_warntype@ does), 8 | # return a bool 9 | # Follows `warntype_type_printer` in: 10 | # julia/stdlib/InteractiveUtils/src/codeview.jl 11 | is_concrete_type(@nospecialize(ty)) = begin 12 | if ty isa Type && (!Base.isdispatchelem(ty) || ty == Core.Box) 13 | if ty isa Union && Base.is_expected_union(ty) 14 | true # this is a "mild" problem, so we round up to "stable" 15 | else 16 | false 17 | end 18 | else 19 | true 20 | end 21 | # Note 1: Core.Box is a type of a heap-allocated value 22 | # Note 2: isdispatchelem is roughly eqviv. to 23 | # isleaftype (from Julia pre-1.0) 24 | # Note 3: expected union is a trivial union (e.g. 25 | # Union{Int,Missing}; those are deemed "probably 26 | # harmless" 27 | end 28 | 29 | struct TypeInferenceError <: Exception 30 | f :: Any 31 | t :: Any 32 | end 33 | 34 | # Args: 35 | # * f: function 36 | # * t: tuple of argument types 37 | # Returns: pair (CodeInstance - typed IR, Inferred Type of the Body) 38 | run_type_inference(@nospecialize(f), @nospecialize(t)) = begin 39 | ct = code_typed(f, t, optimize=false) 40 | if length(ct) == 0 41 | throw(TypeInferenceError(f,t)) # type inference failed 42 | end 43 | ct[1] # we ought to have just one method body, I think 44 | end 45 | 46 | # Accepts inferred method body and checks if every slot in it is concrete 47 | is_grounded_call(src :: CodeInfo) = begin 48 | slottypes = src.slottypes 49 | 50 | # the following check is taken verbatim from code_warntype 51 | if !isa(slottypes, Vector{Any}) 52 | return true # I don't know when we get here, 53 | # over-approx. as stable 54 | end 55 | 56 | result = true 57 | 58 | slotnames = Base.sourceinfo_slotnames(src) 59 | for i = 1:length(slottypes) 60 | stable = is_concrete_type(slottypes[i]) 61 | @debug "is_grounded_call slot:" slotnames[i] slottypes[i] stable 62 | result = result && stable 63 | end 64 | result 65 | end 66 | 67 | # 68 | # Section: MethodInstance-based pure interface (thanks to MethodAnalysis.jl) 69 | # 70 | 71 | # Note [Generic Method Instances] 72 | # We don't quite understand how to process generic method instances (cf. issue #2) 73 | # We used to detect them, count, but don't test for stability. 74 | # Currently, we use Base.unwrap_unionall and the test just works (yes, for types 75 | # with free type variables). This still requires more thinking. 76 | 77 | is_generic_instance(mi :: MethodInstance) = typeof(mi.specTypes) == UnionAll 78 | 79 | # Note [Unknown instances] 80 | # Some instances we just can't resolve. 81 | # E.g. In JSON test suite there's a `lower` method that is unknown. 82 | # This is rare and due to macro magic. 83 | 84 | is_known_instance(mi :: MethodInstance) = isdefined(mi.def.module, mi.def.name) 85 | 86 | struct StabilityError <: Exception 87 | met :: Method 88 | sig :: Any 89 | end 90 | 91 | # 92 | # reconstruct_func_call : (MethodInstance, workdir: String) -> IO (Union{ (Method, [Type]), Nothing }) 93 | # 94 | # What does Julia do about (top-level) function calls like `abc(1,xyz)`? 95 | # 1. Identifiy types of the inputs (1 :: Int, xyz :: Blah) 96 | # 2. Dispatch: figure out which implementation (aka method) of `abc` will be used. 97 | # 3. Compile the method (2) using the input types (1) to get a "method instance". 98 | # 99 | # `reconstruct_func_call` does the reverse transformation: 100 | # Accepts a method instance (3) as found in Julia VM cache after executing some code. 101 | # Returns: pair of a method object (2) and a tuple of types of arguments (1) 102 | # or nothing if it's constructor call. 103 | # 104 | # ### Why IO and `workdir` parameter? 105 | # 106 | # The analysis here is pure. The only reason we add IO is for the backdor we use 107 | # to trace suspicous cases of inputs that we don't understand very well, in particular, 108 | # generic signatures of method instances. We record those instances (if found) in 109 | # the file `gfeneric-instansec.txt` in the given workdir. In theory they shouldn't appear, 110 | # but in practise they do. 111 | # 112 | reconstruct_func_call(mi :: MethodInstance, workdir :: String) = begin 113 | unwrp = Base.unwrap_unionall(mi.specTypes) 114 | unwrp != mi.specTypes && (@warn "Generic method instance found: $mi"; 115 | run(pipeline(`$mi.specTypes`, stdout=joinpath(workdir,"generic-instances.txt")))) 116 | sig = unwrp.types 117 | # @show mi.specTypes # -- tuple 118 | # @show sig # -- svec 119 | if is_func_type(sig[1]) && (unwrp == mi.specTypes) 120 | (sig[1].instance, sig[2:end]) 121 | else 122 | nothing 123 | end 124 | end 125 | 126 | # Get the Function object given its type (`typeof(f)` for regular functions and 127 | # `Type{T}` for constructors) 128 | is_func_type(funcType :: Type{T} where T <: Function) = true 129 | is_func_type(::Any) = false 130 | 131 | # Returns: all (compiled) method instances of the given module 132 | # Note: This seems to recourse into things like X.Y (submodules) if modl=X. 133 | all_mis_of_module(modl :: Module) = begin 134 | mis = [] 135 | 136 | visit(modl) do item 137 | isa(item, MethodInstance) && push!(mis, item) 138 | true # walk through everything 139 | end 140 | mis 141 | end 142 | -------------------------------------------------------------------------------- /Stability/src/Stats.jl: -------------------------------------------------------------------------------- 1 | ############################################# 2 | # 3 | # Stats for type stability, module level 4 | # 5 | ############################################# 6 | 7 | import Base.@kwdef 8 | include("equality.jl") 9 | 10 | # ------------------------------------------- 11 | # 12 | # Statistics gathered per method instance. 13 | # 14 | # ------------------------------------------- 15 | @kwdef struct MIStats 16 | st :: Bool # if the instance is stable 17 | gd :: Bool # if the instance is grounded 18 | gt :: Int # number of gotos in the instance 19 | rt :: Int # number of returns in the instance 20 | rettype :: Any # return type inferred; NOTE: should probably be a Datatype 21 | intypes :: Core.SimpleVector # have to use this b/c that's what we get from 22 | # `reconstruct_func_call`; a vector of input types 23 | end 24 | 25 | @deriveEq(MIStats) 26 | 27 | # Stats about control-flow graph of a method instance 28 | # Currently, number of gotos, and number of returns 29 | cfg_stats(code :: CodeInfo) = begin 30 | gt = 0 31 | rt = 0 32 | 33 | for st in code.code 34 | if is_goto(st) 35 | gt += 1 36 | elseif is_return(st) 37 | rt += 1 38 | end 39 | end 40 | (gt,rt) 41 | end 42 | 43 | is_goto(::Core.GotoNode) = true 44 | is_goto(e::Expr) = e.head == :gotoifnot 45 | is_goto(::Any) = false 46 | is_return(e::Expr) = e.head == :return 47 | is_return(::Any) = false 48 | 49 | 50 | # ------------------------------------------- 51 | # 52 | # Statistics gathered per method. 53 | # 54 | # ------------------------------------------- 55 | 56 | # Note on "mutable": stats are only mutable during their calculation. 57 | @kwdef mutable struct MethodStats 58 | occurs :: Int # how many instances of the method found 59 | stable :: Int # how many stable instances of the method 60 | grounded :: Int # how many grounded instances of the method 61 | nospec :: Int # the nospecialized bitmap (if /=0, there are nospec. params) 62 | vararg :: Int # if the method is a varags method (0/1) 63 | fail :: Int # how many times fail to detect stability of an instance (cf. Issues #7, #8) 64 | end 65 | 66 | @deriveEq(MethodStats) 67 | 68 | # convenient default constructor 69 | fstats_default(nospec=0, vararg=0) = MethodStats(0,0,0,nospec,vararg,0) 70 | 71 | # This is needed for modstats_summary: we smash data about individual methods together 72 | # and get coarse-grained module stats 73 | # This has to be clewver: many things can be simply summed, but not all. 74 | import Base.(+) 75 | (+)(fs1 :: MethodStats, fs2 :: MethodStats) = 76 | MethodStats( 77 | fs1.occurs+fs2.occurs, 78 | fs1.stable+fs2.stable, 79 | fs1.grounded+fs2.grounded, 80 | fs1.nospec + min(1, abs(fs2.nospec)), 81 | fs1.vararg + fs2.vararg, 82 | fs1.fail+fs2.fail 83 | ) 84 | 85 | # This is needed for modstats_summary 86 | show_comma_sep(xs::Vector) = join(xs, ",") 87 | 88 | 89 | # -------------------------------------------------------- 90 | # 91 | # Statistics for all types occured during instantiations. 92 | # 93 | # -------------------------------------------------------- 94 | 95 | # Note on "mutable": stats are only mutable during their calculation. 96 | @kwdef mutable struct InTypeStats 97 | pack :: String # package we were processing when saw this type 98 | modl :: String # module this type comes from (as reported by repeated calls 99 | # to parentmodule while it gets to a root module) 100 | occurs :: Int # number of times we saw the type 101 | depth :: Int # deepest level under parametric constructors that we saw this type at 102 | end 103 | 104 | InTypeStats(pack :: String, modl :: Module) = InTypeStats(pack, "$modl", 0, 0) 105 | InTypeStats(pack :: String, modl :: String) = InTypeStats(pack, modl, 0, 0) 106 | 107 | @deriveEq(InTypeStats) 108 | 109 | # ------------------------------------------- 110 | # 111 | # Statistics gathered per module. 112 | # 113 | # ------------------------------------------- 114 | 115 | @kwdef struct ModuleStats 116 | modl :: Module 117 | mestats :: Dict{Method, MethodStats} 118 | mistats :: Dict{MethodInstance, MIStats} 119 | tystats :: Dict{Any, InTypeStats} 120 | end 121 | 122 | ModuleStats(modl :: Module) = ModuleStats( 123 | modl, 124 | Dict{Method, MethodStats}(), 125 | Dict{Method, MIStats}(), 126 | Dict{Any, InTypeStats}() 127 | ) 128 | 129 | @deriveEq(ModuleStats) 130 | 131 | # Generate a summary of stability data in the module: just a fold (+) over stats 132 | # of individual methods / instances 133 | modstats_summary(ms :: ModuleStats) = begin 134 | fs = foldl((+), values(ms.mestats); init=fstats_default()) 135 | [length(ms.mestats),fs.occurs,fs.stable,fs.grounded,fs.nospec,fs.vararg,fs.fail] 136 | end 137 | 138 | 139 | # ---------------------------------------------------------- 140 | # 141 | # Entry point to the whole file: compute stats over a module 142 | # 143 | # ---------------------------------------------------------- 144 | 145 | # 146 | # module_stats :: (Module, IO, String) -> ModuleStats 147 | # 148 | # Given a module object compute stabilty stats for this module. Print possible errors 149 | # to the given IO stream. Record the number of generic types in the given working dir. 150 | # 151 | # Assumption: 152 | # All code of interest from the module has been compiled. In plain terms, you need 153 | # to call a method at least once to have some data about it. 154 | # 155 | # Normally, you would have a package X exporting main module also called X. 156 | # You run a test suite of the corresponding package and then call `module_stats(X)`. 157 | # 158 | module_stats(modl :: Module, errio :: IO = stderr, workdir :: String = ".") = begin 159 | res = ModuleStats(modl) 160 | mis = all_mis_of_module(modl) 161 | generic_types = 0 162 | for mi in mis 163 | 164 | # Plan: for every method instance `mi` need to update every of the three fields 165 | # in `res` (ModuleStats): 166 | # step 1) method stats (`res.mestats`) 167 | # step 2) instance stats (`res.mistats`) 168 | # step 3) input types (`res.tystats`) 169 | 170 | # Special cases: @generated, blocklisted 171 | if isdefined(mi.def, :generator) # can't handle @generated functions, Issue #11 172 | @debug "GENERATED $(mi)" 173 | continue 174 | end 175 | is_blocklisted(modl, mi.def.module) && (@debug "alien: $mi.def defined in $mi.def.module"; continue) 176 | 177 | # Starting step 1: Lookup method stats object for this `mi` 178 | mest = get!(res.mestats, mi.def, 179 | fstats_default(mi.def.nospecialize, 180 | occursin("Vararg","$(mi.def.sig)"))) 181 | try 182 | # Get code of the `mi` for later analysis 183 | call = reconstruct_func_call(mi, workdir) 184 | if call === nothing # this mi is a constructor call or it's generic - skip; 185 | # for generics, see a separate file: generic-instances.txt 186 | delete!(res.mestats, mi.def) 187 | continue 188 | end 189 | 190 | mest.occurs += 1 191 | 192 | # Finishing step 1 and starting step 2: Check stability/groundedness of the code 193 | mi_st = false 194 | mi_gd = false 195 | (code,rettype) = run_type_inference(call...); 196 | if is_concrete_type(rettype) 197 | mest.stable += 1 198 | mi_st = true 199 | if is_grounded_call(code) 200 | mest.grounded += 1 201 | mi_gd = true 202 | end 203 | end 204 | 205 | # Finishing step 2: all that is left is to handle instance CFG stats 206 | res.mistats[mi] = MIStats(mi_st, mi_gd, cfg_stats(code)..., rettype, call[2] #= input types =#) 207 | # Note on intypes: historically, they lived in MIStats, but for more precise analysis 208 | # we now have them separately one by one, see Step 3 below 209 | 210 | # Step 3: Collect intypes 211 | intypes = call[2] 212 | for ty in intypes 213 | tys = slice_parametric_type(ty) 214 | isnothing(tys) && (@info "Generic type $ty"; generic_types += 1; continue) 215 | for (ty1, depth) in tys 216 | tymodl = moduleChainOfType(ty1) 217 | tystat = get!(res.tystats, 218 | ty1, 219 | InTypeStats("$modl", tymodl)) 220 | tystat.occurs += 1 221 | tystat.depth = max(tystat.depth, depth) 222 | end 223 | end 224 | catch err 225 | mest.fail += 1 226 | print(errio, "ERROR: "); 227 | showerror(errio, err, stacktrace(catch_backtrace())) 228 | println(errio) 229 | end 230 | end 231 | open(f->println(f,generic_types), joinpath(workdir, "generic-types-count.txt"), "w") 232 | res 233 | end 234 | -------------------------------------------------------------------------------- /top-1000-pkgs.txt: -------------------------------------------------------------------------------- 1 | Flux 0.11.6 2 | Pluto 0.12.21 3 | IJulia 1.23.2 4 | DifferentialEquations 6.16.0 5 | Gadfly 1.3.1 6 | Gen 0.4.2 7 | JuMP 0.21.6 8 | Knet 1.4.5 9 | Plots 1.10.6 10 | Genie 1.16.0 11 | Turing 0.15.10 12 | MLJ 0.16.0 13 | PyCall 1.92.2 14 | DataFrames 0.22.5 15 | Zygote 0.6.3 16 | TensorFlow 0.11.0 17 | Makie 0.12.0 18 | PackageCompiler 1.2.5 19 | UnicodePlots 1.3.0 20 | Revise 3.1.12 21 | Optim 1.2.4 22 | Distributions 0.24.14 23 | JuliaDB 0.13.1 24 | DSGE 1.2.1 25 | Cxx 0.4.0 26 | DashBootstrapComponents 0.11.3 27 | LightGraphs 1.3.5 28 | Weave 0.10.6 29 | Yao 0.6.3 30 | OnlineStats 1.5.8 31 | DiffEqFlux 1.34.0 32 | ForwardDiff 0.10.16 33 | OhMyREPL 0.5.10 34 | ModelingToolkit 5.10.0 35 | Images 0.23.3 36 | JuliaZH 1.5.4 37 | DataStructures 0.18.9 38 | ScikitLearn 0.6.3 39 | Convex 0.14.2 40 | Interact 0.10.3 41 | Franklin 0.10.30 42 | Oceananigans 0.52.0 43 | CUDAnative 3.2.0 44 | SciMLTutorials 0.8.0 45 | DiffEqTutorials 0.7.0 46 | Documenter 0.26.2 47 | DashTable 4.10.1 48 | HTTP 0.9.5 49 | DynamicalSystems 1.7.2 50 | Lazy 0.15.1 51 | ProgressMeter 1.5.0 52 | StaticArrays 1.0.1 53 | QuantEcon 0.16.2 54 | CUDA 2.6.1 55 | GLM 1.4.0 56 | DrWatson 1.18.3 57 | PyPlot 2.9.0 58 | POMDPs 0.9.2 59 | PkgTemplates 0.7.15 60 | ApproxFun 0.12.5 61 | StatsBase 0.33.3 62 | Catlab 0.11.1 63 | TimerOutputs 0.5.7 64 | BenchmarkTools 0.5.0 65 | LoopVectorization 0.11.2 66 | QuantumOptics 0.8.4 67 | TextAnalysis 0.7.2 68 | Cassette 0.3.4 69 | Luxor 2.9.0 70 | NeuralNetDiffEq 1.6.0 71 | NeuralPDE 3.8.0 72 | Grassmann 0.7.2 73 | Query 1.0.0 74 | CuArrays 2.2.2 75 | Debugger 0.6.7 76 | GR 0.55.0 77 | Unitful 1.6.0 78 | Latexify 0.14.7 79 | Javis 0.4.0 80 | Literate 2.8.0 81 | DataFramesMeta 0.6.0 82 | Blink 0.12.4 83 | ClimateMachine 0.1.0 84 | Dagger 0.11.0 85 | Bio 1.0.1 86 | ControlSystems 0.9.0 87 | HDF5 0.15.4 88 | Parameters 0.12.2 89 | Interpolations 0.13.1 90 | Distances 0.10.2 91 | MixedModels 3.2.0 92 | StatPlots 0.9.2 93 | StatsPlots 0.14.19 94 | Dash 0.1.3 95 | Measurements 2.5.0 96 | Soss 0.16.2 97 | BlackBoxOptim 0.5.0 98 | CxxWrap 0.11.2 99 | JLD2 0.4.2 100 | DashCoreComponents 1.12.0 101 | Mamba 0.12.5 102 | IterativeSolvers 0.9.0 103 | PlotlyJS 0.14.0 104 | Stheno 0.6.20 105 | TensorOperations 3.1.0 106 | DSP 0.6.10 107 | Traceur 0.3.1 108 | Clustering 0.14.2 109 | DecisionTree 0.10.10 110 | MLStyle 0.4.6 111 | StatisticalRethinking 3.2.6 112 | Tullio 0.2.12 113 | AutoMLPipeline 0.2.3 114 | LanguageServer 3.2.0 115 | Mux 0.7.5 116 | GeoStats 0.21.1 117 | MultivariateStats 0.8.0 118 | OpenCL 0.8.1 119 | JSON 0.21.1 120 | JuliaFormatter 0.13.2 121 | Transducers 0.4.59 122 | MacroTools 0.5.6 123 | TimeSeries 0.20.2 124 | GaussianProcesses 0.12.3 125 | PGFPlotsX 1.2.10 126 | NearestNeighbors 0.4.8 127 | CSV 0.8.4 128 | RCall 0.13.10 129 | Calculus 0.5.1 130 | Graphs 0.10.3 131 | Compose 0.9.2 132 | MPI 0.16.1 133 | QML 0.6.0 134 | Gridap 0.15.1 135 | Modia 0.3.0 136 | OrdinaryDiffEq 5.51.1 137 | ReinforcementLearning 0.8.0 138 | BinaryBuilder 0.2.6 139 | ITensors 0.1.40 140 | Metalhead 0.5.2 141 | NLsolve 4.5.1 142 | VegaLite 2.3.1 143 | JLD 0.12.1 144 | PowerModels 0.17.4 145 | RigidBodyDynamics 2.3.1 146 | LsqFit 0.12.0 147 | ArrayFire 1.0.7 148 | XGBoost 1.1.1 149 | Agents 4.1.3 150 | ReverseDiff 1.7.0 151 | MAT 0.10.1 152 | ProfileView 0.6.9 153 | Cthulhu 1.6.1 154 | Reinforce 0.4.0 155 | LispSyntax 0.2.1 156 | GPUArrays 6.2.0 157 | MLBase 0.8.0 158 | WebIO 0.8.15 159 | Gtk 1.1.6 160 | Reduce 1.2.10 161 | DynamicHMC 3.1.0 162 | GeometricFlux 0.7.5 163 | ApplicationBuilder 0.4.1 164 | JuliaFEM 0.5.1 165 | PrettyTables 0.11.1 166 | Rebugger 0.3.3 167 | Transformers 0.1.7 168 | HypothesisTests 0.10.2 169 | MATLAB 0.8.0 170 | Stan 6.3.2 171 | SymPy 1.0.41 172 | TrajectoryOptimization 0.5.0 173 | LowRankModels 1.1.1 174 | SymbolicUtils 0.8.4 175 | FastGaussQuadrature 0.4.7 176 | MonteCarloMeasurements 0.10.0 177 | NiLang 0.8.0 178 | Symata 0.4.8 179 | MathOptInterface 0.9.20 180 | Reactive 0.8.3 181 | BrainFlow 3.9.2 182 | ChainRules 0.7.53 183 | LinearMaps 3.2.1 184 | Catalyst 6.8.0 185 | DiffEqBiological 4.3.0 186 | Match 1.1.0 187 | RobotOS 0.7.2 188 | Winston 0.15.1 189 | Spark 0.5.0 190 | BayesNets 3.3.3 191 | JuliaWebAPI 0.6.2 192 | StatsModels 0.6.21 193 | COSMO 0.8.0 194 | PGFPlots 3.3.6 195 | AutoGrad 1.2.4 196 | DistributedArrays 0.6.5 197 | LazyArrays 0.21.1 198 | DiffEqOperators 4.22.0 199 | GalacticOptim 1.0.0 200 | TaylorSeries 0.10.10 201 | MeshCat 0.13.2 202 | XLSX 0.7.6 203 | Tables 1.3.2 204 | FastTransforms 0.12.1 205 | NLopt 0.6.2 206 | SpecialFunctions 1.3.0 207 | Clang 0.12.1 208 | SymEngine 0.8.3 209 | Evolutionary 0.8.1 210 | DFTK 0.2.6 211 | Laplacians 1.2.0 212 | DataDrivenDiffEq 0.5.5 213 | FixedEffectModels 1.4.0 214 | SQLite 1.1.3 215 | ArgParse 1.1.1 216 | FileIO 1.4.5 217 | SnoopCompile 2.5.2 218 | SnoopCompileAnalysis 1.7.2 219 | SnoopCompileBot 1.7.2 220 | SnoopCompileCore 2.5.2 221 | PowerSystems 1.2.2 222 | SDDP 0.3.10 223 | StochasticDiffEq 6.33.0 224 | ClusterManagers 0.4.0 225 | Registrator 1.2.2 226 | Sundials 4.4.1 227 | Indicators 0.8.1 228 | Polynomials 1.2.0 229 | AxisArrays 0.4.3 230 | Juno 0.8.4 231 | MeasureTheory 0.4.0 232 | StructArrays 0.5.0 233 | ProtoBuf 0.10.0 234 | Pandas 1.4.0 235 | Combinatorics 1.0.2 236 | DataFlow 0.5.0 237 | FFTW 1.3.2 238 | Requires 1.1.2 239 | ThreadsX 0.1.7 240 | DiffEqDiffTools 1.7.0 241 | FiniteDiff 2.8.0 242 | Gurobi 0.9.9 243 | Infiltrator 0.3.0 244 | MLDatasets 0.5.5 245 | IntervalArithmetic 0.17.7 246 | Queryverse 0.6.2 247 | RDatasets 0.7.4 248 | Roots 1.0.8 249 | Torch 0.1.2 250 | Wavelets 0.9.2 251 | GraphPlot 0.4.4 252 | Manifolds 0.4.16 253 | FDM 0.6.1 254 | FiniteDifferences 0.12.2 255 | Manopt 0.2.16 256 | Surrogates 1.6.0 257 | GitHub 5.4.0 258 | PlutoUI 0.7.2 259 | RayTracer 0.1.4 260 | SimJulia 0.8.0 261 | WebSockets 1.5.9 262 | PowerSimulations 0.10.0 263 | Automa 0.8.0 264 | Bukdu 0.4.16 265 | Gaston 1.0.4 266 | MCMCChain 0.2.3 267 | MCMCChains 4.7.0 268 | TSne 1.2.0 269 | Chain 0.4.4 270 | Colors 0.12.6 271 | LibPQ 1.6.2 272 | StateSpaceModels 0.5.5 273 | LazySets 1.41.3 274 | QuadGK 2.4.1 275 | Strategems 0.3.0 276 | Conda 1.5.0 277 | Coverage 1.2.0 278 | GraphRecipes 0.5.4 279 | Polyhedra 0.6.13 280 | DiffEqBase 6.57.6 281 | Feather 0.5.7 282 | Juniper 0.7.0 283 | HomotopyContinuation 2.4.2 284 | Alpine 0.2.1 285 | BSON 0.3.1 286 | CImGui 1.79.0 287 | Lasso 0.6.1 288 | ADCME 0.7.0 289 | AugmentedGaussianProcesses 0.9.3 290 | CoordinateTransformations 0.6.1 291 | MKL 0.4.0 292 | StatsFuns 0.9.6 293 | Einsum 0.4.1 294 | JuliaInterpreter 0.8.9 295 | ODE 2.12.0 296 | LaTeXStrings 1.2.0 297 | Reel 1.3.2 298 | SatelliteToolbox 0.7.3 299 | TuringModels 2.0.0 300 | Augmentor 0.6.2 301 | Caesar 0.9.0 302 | FinEtools 5.1.2 303 | Memoize 0.4.4 304 | AMDGPU 0.2.3 305 | QuantLib 0.1.1 306 | Molly 0.2.2 307 | Stipple 0.9.2 308 | AdvancedHMC 0.2.27 309 | BifurcationKit 0.1.3 310 | Bijectors 0.8.14 311 | FunctionalCollections 0.5.0 312 | Hecke 0.9.5 313 | KernelFunctions 0.8.24 314 | Strided 1.1.1 315 | VoronoiDelaunay 0.4.0 316 | DiffEqBayes 2.23.0 317 | FLoops 0.1.6 318 | KernelDensity 0.6.2 319 | Krylov 0.6.0 320 | Cubature 1.5.1 321 | NNlib 0.7.14 322 | Arrow 1.2.4 323 | AWS 1.25.5 324 | GMT 0.30.0 325 | KrylovKit 0.5.2 326 | ZMQ 1.2.1 327 | DataVoyager 1.0.0 328 | LossFunctions 0.6.2 329 | NBInclude 2.2.0 330 | Octo 0.2.8 331 | PhyloNetworks 0.12.0 332 | ProximalOperators 0.14.0 333 | Tensors 1.4.3 334 | Enzyme 0.3.2 335 | IndexedTables 0.13.0 336 | Setfield 0.7.0 337 | SIMD 3.2.1 338 | TableReader 0.4.0 339 | AbstractTrees 0.3.4 340 | Dierckx 0.5.1 341 | Formatting 0.4.2 342 | Gumbo 0.8.0 343 | OffsetArrays 1.6.1 344 | BandedMatrices 0.16.5 345 | Compat 3.25.0 346 | CompatHelper 1.16.3 347 | DataDeps 0.7.7 348 | ForneyLab 0.11.2 349 | Gaius 0.6.3 350 | LibCEED 0.1.0 351 | MetaGraphs 0.6.6 352 | SparseDiffTools 1.13.0 353 | Taro 0.8.3 354 | Nemo 0.20.0 355 | ParallelDataTransfer 0.5.0 356 | RecursiveArrayTools 2.11.0 357 | TerminalMenus 0.1.0 358 | DiffEqGPU 1.9.1 359 | Example 0.5.3 360 | Gnuplot 1.3.0 361 | HCubature 1.5.0 362 | JavaCall 0.7.6 363 | JSON3 1.7.1 364 | BlockArrays 0.14.5 365 | Coluna 0.3.5 366 | KernelAbstractions 0.5.3 367 | Omega 0.1.1 368 | Pipe 1.3.0 369 | PlotThemes 2.0.1 370 | DistributionsAD 0.6.19 371 | ImageView 0.10.13 372 | Yota 0.4.4 373 | DaemonMode 0.1.4 374 | GeometryBasics 0.3.9 375 | SimpleTraits 0.9.3 376 | StatProfilerHTML 1.2.0 377 | ChainRulesCore 0.9.29 378 | DiffEqSensitivity 6.42.0 379 | FourierFlows 0.6.11 380 | GLFW 3.4.0 381 | IterTools 1.3.0 382 | PkgMirrors 1.3.0 383 | ResumableFunctions 0.6.0 384 | VideoIO 0.8.4 385 | Hyperopt 0.4.2 386 | Mustache 1.0.10 387 | RecipesBase 1.1.1 388 | BAT 2.0.3 389 | DynamicGrids 0.15.1 390 | GenericLinearAlgebra 0.2.4 391 | IntervalRootFinding 0.5.5 392 | MathProgBase 0.7.8 393 | NBodySimulator 1.6.0 394 | PkgBenchmark 0.2.10 395 | ChaosTools 1.24.0 396 | MIPVerify 0.2.3 397 | Pajarito 0.7.0 398 | StringDistances 0.10.0 399 | Symbolics 0.1.1 400 | Glob 1.3.0 401 | MLDataUtils 0.5.3 402 | SplitApplyCombine 1.1.4 403 | SymbolicRegression 0.5.13 404 | TableView 0.6.4 405 | ThreadPools 1.2.1 406 | AbstractPlotting 0.15.22 407 | BioSequences 2.0.5 408 | Crayons 4.0.4 409 | MatrixNetworks 1.0.2 410 | Temporal 0.8.0 411 | TypedTables 1.2.4 412 | DimensionalData 0.16.2 413 | ONNX 0.1.1 414 | PkgPage 0.4.1 415 | Aqua 0.5.0 416 | MLKernels 0.4.0 417 | ModernGL 1.1.2 418 | WriteVTK 1.9.1 419 | CPLEX 0.7.6 420 | RandomNumbers 1.4.0 421 | Rotations 1.0.2 422 | StatsKit 0.3.0 423 | SumOfSquares 0.4.5 424 | TensorCast 0.3.2 425 | UMAP 0.1.8 426 | Dictionaries 0.3.7 427 | GLMNet 0.6.1 428 | Mads 1.0.8 429 | MySQL 1.1.2 430 | ODBC 1.0.4 431 | OMEinsum 0.3.3 432 | Bridge 0.11.5 433 | CategoricalArrays 0.9.3 434 | ConstraintSolver 0.6.5 435 | Immerse 1.0.1 436 | MarketData 0.13.4 437 | MultivariatePolynomials 0.3.12 438 | NamedArrays 0.9.4 439 | Plotly 0.3.0 440 | RegionTrees 0.3.2 441 | Tulip 0.7.2 442 | YAML 0.4.6 443 | Diana 0.2.0 444 | DocOpt 0.4.2 445 | Eirene 1.3.5 446 | FillArrays 0.11.5 447 | NMF 0.5.0 448 | Trixi 0.3.14 449 | ACME 0.9.4 450 | ClimateTools 0.22.0 451 | DoubleFloats 1.1.16 452 | Fatou 1.1.0 453 | GSL 1.0.1 454 | NLPModels 0.13.2 455 | Reexport 1.0.0 456 | TimeseriesPrediction 0.6.0 457 | LowRankApprox 0.4.3 458 | Rocket 1.3.5 459 | YAAD 0.1.0 460 | Causal 0.3.0 461 | DynamicalBilliards 3.11.4 462 | ECharts 0.5.0 463 | Jusdl 0.2.2 464 | LocalRegistry 0.3.2 465 | Pardiso 0.5.1 466 | Redis 1.0.0 467 | ArchGDAL 0.5.3 468 | Boltzmann 0.7.1 469 | Bootstrap 2.3.1 470 | CSTParser 3.1.0 471 | IterableTables 1.0.0 472 | LLVM 3.6.0 473 | MolecularGraph 0.8.0 474 | NamedDims 0.2.31 475 | ReplMaker 0.2.4 476 | TextUserInterfaces 0.0.1 477 | TopicModelsVB 1.5.1 478 | CartesianGeneticProgramming 0.1.0 479 | CUDAdrv 6.3.0 480 | GeometryTypes 0.8.4 481 | Mjolnir 0.2.1 482 | NetCDF 0.11.3 483 | ReadStat 1.0.2 484 | ResultTypes 3.1.0 485 | StateSpaceRoutines 0.4.0 486 | TensorBoardLogger 0.1.15 487 | AbstractGPs 0.2.17 488 | Atom 0.12.30 489 | EzXML 1.1.0 490 | GeneralizedGenerated 0.2.8 491 | InteractiveChaos 0.12.3 492 | InteractiveDynamics 0.13.4 493 | Ipopt 0.6.5 494 | ParserCombinator 2.0.0 495 | ProximalAlgorithms 0.4.1 496 | RegressionTables 0.5.0 497 | SearchLight 0.22.0 498 | WAV 1.1.0 499 | DataStreams 0.4.2 500 | Geodesy 1.0.1 501 | LabelledArrays 1.5.0 502 | LightXML 0.9.0 503 | PerceptualColourMaps 0.3.3 504 | ComponentArrays 0.8.19 505 | Dashboards 0.2.8 506 | GameZero 0.1.3 507 | Matte 0.2.0 508 | AbstractAlgebra 0.13.6 509 | ClearStacktrace 0.2.2 510 | GeoData 0.3.5 511 | JLBoost 0.1.16 512 | JSServe 1.2.0 513 | NCDatasets 0.11.3 514 | StaticLint 7.0.0 515 | TensorKit 0.9.0 516 | TreeView 0.4.0 517 | ValidatedNumerics 0.11.0 518 | AlgebraicMultigrid 0.4.0 519 | AMDGPUnative 0.3.2 520 | EAGO 0.6.0 521 | GeophysicalFlows 0.11.4 522 | Hyperscript 0.0.4 523 | IRTools 0.4.2 524 | RandomMatrices 0.5.0 525 | SemanticModels 0.4.0 526 | Suppressor 0.2.0 527 | WordTokenizers 0.5.6 528 | AlgebraOfGraphics 0.2.4 529 | Cascadia 1.0.1 530 | CausalInference 0.5.6 531 | Circuitscape 5.7.1 532 | Comonicon 0.10.2 533 | Memento 1.1.2 534 | PkgDev 1.6.0 535 | PowerModelsDistribution 0.10.2 536 | ReachabilityAnalysis 0.10.0 537 | Remark 0.3.0 538 | ControlSystemIdentification 1.4.0 539 | DualNumbers 0.6.3 540 | GaussianMixtures 0.3.4 541 | LineSearches 7.1.1 542 | NetworkDynamics 0.5.1 543 | OpenStreetMapX 0.2.3 544 | ParameterizedFunctions 5.9.0 545 | Parametron 0.9.1 546 | Pathogen 0.4.12 547 | PDMats 0.11.0 548 | TiledIteration 0.3.0 549 | VulkanCore 1.2.2 550 | JLSO 2.5.0 551 | ManifoldLearning 0.6.2 552 | Metatheory 0.1.1 553 | NonlinearEigenproblems 1.0.2 554 | Parsers 1.0.15 555 | PDFIO 0.1.12 556 | Plasmo 0.3.3 557 | ReservoirComputing 0.6.2 558 | StochDynamicProgramming 0.6.0 559 | Tokenize 0.5.13 560 | AutoPreallocation 0.3.1 561 | EcologicalNetworks 0.4.1 562 | ImageProjectiveGeometry 0.3.2 563 | jlpkg 1.3.2 564 | Meshes 0.10.1 565 | oneAPI 0.1.1 566 | PhysicalConstants 0.2.1 567 | Quaternions 0.4.1 568 | TSAnalysis 0.1.4 569 | TSML 2.6.3 570 | WebAssembly 0.1.1 571 | BayesianOptimization 0.2.5 572 | ColorSchemes 3.10.2 573 | ExcelReaders 0.11.0 574 | GLPK 0.14.6 575 | GPUifyLoops 0.2.9 576 | Kronecker 0.4.2 577 | NetworkLayout 0.3.0 578 | TensorNetworkAD 0.1.0 579 | TikzGraphs 1.1.0 580 | ImageFiltering 0.6.20 581 | TikzPictures 3.3.2 582 | Twitter 0.8.1 583 | Underscores 2.0.0 584 | Animations 0.4.1 585 | DataArrays 0.7.0 586 | IntelVectorMath 0.4.0 587 | MLJBase 0.17.3 588 | ShallowWaters 0.4.1 589 | TaylorIntegration 0.8.8 590 | Yeppp 0.4.0 591 | Avalon 0.1.0 592 | Cairo 1.0.5 593 | CodeTracking 1.0.5 594 | DocumentFormat 3.2.3 595 | Julog 0.1.9 596 | PiGPIO 0.2.0 597 | ProbabilisticCircuits 0.2.2 598 | CBinding 0.9.4 599 | Complementarity 0.8.0 600 | FEniCS 0.4.0 601 | InteractiveCodeSearch 0.3.2 602 | LinearOperators 1.2.0 603 | MakieLayout 0.9.10 604 | Merly 1.0.2 605 | Miletus 1.0.0 606 | MLJFlux 0.1.7 607 | NPZ 0.4.1 608 | Parquet 0.8.0 609 | ProxSDP 1.6.1 610 | StructuredOptimization 0.2.3 611 | ArgCheck 2.1.0 612 | BinDeps 1.0.2 613 | Cuba 2.2.0 614 | ElectronDisplay 1.0.1 615 | Embeddings 0.4.2 616 | Flux3D 0.1.3 617 | FunctionWrappers 1.1.2 618 | LIBSVM 0.6.0 619 | Quadrature 1.8.1 620 | QuantumInformation 0.4.8 621 | ReadableRegex 0.3.2 622 | Sobol 1.4.0 623 | Word2Vec 0.5.3 624 | BangBang 0.3.30 625 | Chess 0.5.0 626 | ClustForOpt 0.4.2 627 | DBInterface 2.4.0 628 | DifferentialDynamicProgramming 0.4.0 629 | EconPDEs 0.4.1 630 | FilePaths 0.8.1 631 | GFlops 0.1.3 632 | ImageInTerminal 0.4.5 633 | LoggingExtras 0.4.5 634 | MappedArrays 0.3.0 635 | MathLink 0.3.1 636 | NIfTI 0.5.3 637 | Tar 1.9.0 638 | TimeSeriesClustering 0.5.3 639 | AstroLib 0.4.0 640 | BlockBandedMatrices 0.10.3 641 | CatViews 1.0.0 642 | Dualization 0.3.3 643 | FreqTables 0.4.2 644 | JuLIP 0.8.2 645 | MsgPack 1.1.0 646 | RigidBodySim 1.3.0 647 | StatsMakie 0.2.3 648 | TranscodingStreams 0.9.5 649 | Cbc 0.7.1 650 | DataKnots 0.10.1 651 | DocStringExtensions 0.8.3 652 | Espresso 0.6.1 653 | ForwardDiff2 0.2.2 654 | JDF 0.3.0 655 | Nabla 0.12.3 656 | PowerDynamics 2.4.2 657 | PProf 2.0.1 658 | SCIP 0.9.8 659 | TerminalUserInterfaces 0.2.0 660 | WGLMakie 0.3.3 661 | COBRA 0.3.2 662 | CommonMark 0.7.2 663 | EvoTrees 0.6.0 664 | Lilith 0.2.0 665 | Loess 0.5.3 666 | MatrixDepot 1.0.3 667 | MLJModels 0.14.0 668 | Mongoc 0.6.1 669 | SampledSignals 2.1.0 670 | ArbNumerics 1.2.4 671 | CpuId 0.3.0 672 | DotNET 0.1.2 673 | Electron 2.0.1 674 | GeometricalPredicates 0.4.0 675 | InspectDR 0.3.10 676 | JuMPeR 0.6.0 677 | LatexPrint 1.0.0 678 | LightGBM 0.5.1 679 | MakieGallery 0.2.17 680 | SparsityDetection 0.3.3 681 | GasModels 0.8.2 682 | HMMBase 1.0.6 683 | IncrementalInference 0.21.3 684 | InformationMeasures 0.3.1 685 | MeshIO 0.4.3 686 | Mill 2.4.0 687 | Modia3D 0.4.0 688 | RuntimeGeneratedFunctions 0.5.1 689 | SCS 0.7.1 690 | ViscousFlow 0.4.5 691 | AWSCore 0.6.17 692 | DataInterpolations 3.3.1 693 | GDAL 1.2.1 694 | Hypatia 0.3.0 695 | InplaceOps 0.3.0 696 | InteractiveViz 0.1.3 697 | JSExpr 1.0.1 698 | KNITRO 0.9.3 699 | MCTS 0.4.7 700 | NamedTupleTools 0.13.7 701 | PeriodicTable 1.0.0 702 | Porta 0.1.3 703 | Primes 0.5.0 704 | SimpleWeightedGraphs 1.1.1 705 | ArnoldiMethod 0.2.0 706 | AverageShiftedHistograms 0.8.5 707 | CombinedParsers 0.1.5 708 | CurveFit 0.3.3 709 | DynamicPPL 0.10.7 710 | Elemental 0.6.0 711 | Elly 0.5.1 712 | MIRT 0.13.0 713 | MultiScaleArrays 1.8.1 714 | PolyChaos 0.2.3 715 | ReinforcementLearningEnvironments 0.4.7 716 | Salsa 2.2.0 717 | TextParse 1.0.1 718 | TimeZones 1.5.3 719 | Tk 0.7.0 720 | VariantVisualization 0.4.0 721 | Zarr 0.5.2 722 | ArrayInterface 3.1.2 723 | BioStructures 0.11.7 724 | Blobs 0.5.0 725 | BusinessDays 0.9.13 726 | ColorBrewer 0.4.0 727 | Fire 0.1.1 728 | FredData 0.4.0 729 | GenericSVD 0.3.0 730 | JSON2 0.3.2 731 | MagneticReadHead 0.3.0 732 | MLDataPattern 0.5.4 733 | Observables 0.4.0 734 | Shapefile 0.7.0 735 | SimpleContainerGenerator 2.0.2 736 | StructJuMP 0.2.0 737 | TensorToolbox 1.0.1 738 | Vimes 0.1.0 739 | ApproxBayes 0.3.2 740 | ChemometricsTools 0.5.14 741 | ColorTypes 0.10.9 742 | Dispatcher 1.0.1 743 | Dolo 0.4.1 744 | FixedPointNumbers 0.8.4 745 | JWAS 0.11.4 746 | ReferenceTests 0.9.4 747 | SimpleDirectMediaLayer 0.2.1 748 | SpectralClustering 0.1.2 749 | CompEcon 0.4.0 750 | GenomeGraphs 0.2.0 751 | ImportMacros 1.0.0 752 | IntervalConstraintProgramming 0.12.1 753 | Jaynes 0.1.33 754 | LiveServer 0.6.0 755 | Missings 0.4.5 756 | MIToS 2.5.0 757 | Publish 0.6.4 758 | QuantumLattices 0.1.3 759 | SMC 0.1.13 760 | AccurateArithmetic 0.3.5 761 | Actors 0.2.3 762 | ARCHModels 1.3.0 763 | DiffEqPhysics 3.9.0 764 | FileTrees 0.2.2 765 | Hwloc 1.3.0 766 | InvertedIndices 1.0.0 767 | jInv 1.0.0 768 | Kalman 0.1.4 769 | Meshing 0.5.6 770 | Pages 0.3.1 771 | PastaQ 0.0.5 772 | ProgressBars 1.0.0 773 | ReinforcementLearningZoo 0.3.4 774 | SeisIO 1.2.0 775 | SMM 1.4.0 776 | TemporalGPs 0.3.10 777 | TransformVariables 0.3.11 778 | AxisKeys 0.1.12 779 | CombineML 1.3.0 780 | Cosmology 1.0.0 781 | DeepQLearning 0.6.2 782 | DiffEqUncertainty 1.8.0 783 | ExcelFiles 1.0.0 784 | GtkReactive 1.0.5 785 | IntervalSets 0.5.2 786 | KrylovMethods 0.6.0 787 | Mimi 1.1.1 788 | Presentation 0.2.2 789 | QuickTypes 1.6.3 790 | SafeTestsets 0.0.1 791 | ScientificTypes 1.1.1 792 | SpatialEcology 0.9.7 793 | AbstractFFTs 1.0.1 794 | AlphaVantage 0.3.0 795 | Arpack 0.5.1 796 | ConcreteStructs 0.2.2 797 | DataLoaders 0.1.2 798 | DirectSum 0.7.5 799 | FluxJS 0.2.0 800 | GeoMakie 0.1.15 801 | KittyTerminalImages 0.3.0 802 | MultiJuMP 0.5.0 803 | ObjectDetector 0.1.13 804 | Octavian 0.2.10 805 | OSQP 0.6.1 806 | PolynomialRoots 1.0.0 807 | RData 0.7.3 808 | SingularIntegralEquations 0.6.6 809 | SingularSpectrumAnalysis 0.4.0 810 | SolveDSGE 0.4.0 811 | UnPack 1.0.2 812 | Xtensor 0.8.2 813 | AmplNLWriter 0.6.0 814 | AtariAlgos 0.0.2 815 | CanonicalTraits 0.2.4 816 | CSVFiles 1.0.0 817 | DecFP 1.1.0 818 | DeepDiffs 1.2.0 819 | DiffEqParamEstim 1.20.1 820 | Econometrics 0.2.8 821 | Expectations 1.7.1 822 | FITSIO 0.16.7 823 | ImageMagick 1.1.6 824 | LazyJSON 0.2.2 825 | MethodAnalysis 0.4.4 826 | Mosek 1.1.3 827 | Nettle 0.5.0 828 | QuantumLab 1.0.1 829 | Unrolled 0.1.3 830 | YOLO 0.1.0 831 | ArviZ 0.5.0 832 | Clp 0.8.3 833 | CodecZlib 0.7.0 834 | DiffEqJump 6.13.0 835 | DiffEqNoiseProcess 5.6.0 836 | ElasticArrays 1.2.6 837 | GeoJSON 0.5.1 838 | Languages 0.4.3 839 | LinearAlgebraicRepresentation 1.0.0 840 | Maxima 0.1.2 841 | ODEFilters 0.1.0 842 | ParallelKMeans 0.2.0 843 | ProbNumDiffEq 0.1.1 844 | Rematch 0.3.2 845 | Richardson 1.4.0 846 | RollingFunctions 0.6.2 847 | SaferIntegers 2.5.1 848 | Sherlock 0.1.3 849 | Strapping 1.2.0 850 | Strs 1.0.3 851 | TaylorModels 0.3.7 852 | DynamicAxisWarping 0.4.7 853 | ExprOptimization 0.2.1 854 | FlashWeave 0.18.0 855 | FluxTraining 0.1.3 856 | GraphIO 0.5.0 857 | ImageFeatures 0.4.4 858 | JSONTables 1.0.1 859 | MathOptFormat 0.4.0 860 | MLJTuning 0.6.2 861 | Mocking 0.7.1 862 | OrderedCollections 1.4.0 863 | Pavito 0.3.1 864 | Signals 1.2.0 865 | StaticNumbers 0.3.3 866 | StochasticPrograms 0.5.0 867 | SumProductNetworks 0.1.2 868 | TravelingSalesmanHeuristics 0.3.3 869 | Tricks 0.1.4 870 | Xpress 0.12.2 871 | DiscreteEvents 0.3.2 872 | EllipsisNotation 1.1.0 873 | ExprTools 0.1.3 874 | FastClosures 0.3.2 875 | GeoInterface 0.5.4 876 | Humanize 1.0.0 877 | Impute 0.6.3 878 | Kinetic 0.7.1 879 | LibGEOS 0.6.7 880 | Memoization 0.1.5 881 | MIDI 1.8.1 882 | ModernRoboticsBook 0.1.1 883 | NFFT 0.6.1 884 | PiecewiseLinearOpt 0.3.0 885 | Poptart 0.3.2 886 | RoME 0.13.0 887 | Seaborn 0.4.1 888 | ShiftedArrays 1.0.0 889 | SimpleHypergraphs 0.1.14 890 | Simulate 0.2.0 891 | SparseRegression 0.2.0 892 | TerminalExtensions 0.4.0 893 | UnsafeArrays 1.0.2 894 | AcceleratedArrays 0.3.2 895 | BilevelOptimization 0.2.2 896 | BinaryTraits 0.6.0 897 | BioAlignments 2.0.0 898 | Cliffords 0.6.0 899 | CmdStan 6.1.8 900 | ConjugatePriors 0.4.0 901 | HybridArrays 0.4.7 902 | InfiniteArrays 0.10.3 903 | JuliaDBMeta 0.4.3 904 | LocalCoverage 0.2.0 905 | MultiFloats 1.0.2 906 | PencilFFTs 0.12.1 907 | Pingouin 0.2.2 908 | SeisNoise 0.5.0 909 | Telegram 1.0.0 910 | WordCloud 0.4.8 911 | AbstractTensors 0.6.5 912 | AsmMacro 0.1.0 913 | CMBLensing 0.5.0 914 | ComputedFieldTypes 0.1.0 915 | CovarianceMatrices 0.9.1 916 | Decimals 0.4.1 917 | Diagonalizations 0.2.0 918 | DiffEqCallbacks 2.16.0 919 | DiffEqDevTools 2.27.2 920 | DynamicPolynomials 0.3.15 921 | Gloria 0.2.1 922 | GridInterpolations 1.1.1 923 | IntervalOptimisation 0.4.2 924 | Jive 0.2.15 925 | LibSerialPort 0.5.0 926 | LowLevelParticleFilters 1.0.3 927 | LRUCache 1.2.0 928 | NamedTuples 5.0.0 929 | OptimKit 0.3.1 930 | PiCraft 0.3.0 931 | QuantileRegressions 0.1.6 932 | SpikingNeuralNetworks 0.1.0 933 | TheFix 0.2.3 934 | VQC 0.1.0 935 | WaterModels 0.7.0 936 | BilevelJuMP 0.4.1 937 | Deconvolution 1.1.0 938 | DocumenterCitations 0.2.1 939 | FinancialDerivatives 0.0.1 940 | FlatBuffers 0.5.4 941 | GaloisFields 1.0.1 942 | GLMakie 0.1.27 943 | ImageSegmentation 1.5.0 944 | Joseki 0.2.1 945 | JuliennedArrays 0.2.2 946 | MathematicalSystems 0.11.9 947 | MusicManipulations 1.6.1 948 | NaiveGAflux 0.7.3 949 | NumericalIntegration 0.3.2 950 | OpenQuantumTools 0.6.2 951 | Oscar 0.5.1 952 | PartialLeastSquaresRegressor 2.1.0 953 | PDSampler 0.1.1 954 | Recommendation 0.3.0 955 | SortingAlgorithms 0.3.1 956 | StructTypes 1.4.0 957 | Survival 0.2.1 958 | AdvancedMH 0.5.7 959 | Alert 0.2.1 960 | AutoHashEquals 0.2.0 961 | BayesianNonparametrics 0.1.0 962 | BoltzmannMachines 1.2.0 963 | ClimateMARGO 0.2.0 964 | DICOM 0.8.0 965 | GemmKernels 0.1.0 966 | GPUCompiler 0.10.0 967 | HyperDualNumbers 4.0.5 968 | ImageQuilting 0.14.0 969 | InfiniteOpt 0.3.2 970 | Instruments 0.2.0 971 | MadNLP 0.1.5 972 | MCAnalyzer 0.3.0 973 | MKLSparse 1.1.0 974 | Monads 0.2.3 975 | MPSKit 0.4.0 976 | NDTensors 0.1.28 977 | NODAL 0.4.0 978 | ParticleFilters 0.5.2 979 | PolyJuMP 0.4.1 980 | POMCPOW 0.3.3 981 | SIMDPirates 0.8.26 982 | SystemBenchmark 0.3.5 983 | Adapt 3.2.0 984 | ComputationalResources 0.3.2 985 | ConditionalJuMP 0.1.0 986 | ConfParser 0.1.2 987 | DCEMRI 0.2.2 988 | DPMMSubClusters 0.1.11 989 | Erdos 0.7.0 990 | FinancialToolbox 0.2.3 991 | GpABC 0.1.0 992 | GridapODEs 0.6.0 993 | HttpCommon 0.5.0 994 | LeastSquaresOptim 0.8.1 995 | MCMCBenchmarks 0.7.2 996 | MeshCatMechanisms 0.8.0 997 | Microeconometrics 0.6.0 998 | MiniFB 0.1.1 999 | MLLabelUtils 0.5.5 1000 | Nuklear 0.1.1 -------------------------------------------------------------------------------- /Stability/scripts/julia/Manifest.toml: -------------------------------------------------------------------------------- 1 | # This file is machine-generated - editing it directly is not advised 2 | 3 | julia_version = "1.8.5" 4 | manifest_format = "2.0" 5 | project_hash = "b4e3d203dc9d460c2605fbb2687c137009478743" 6 | 7 | [[deps.AbstractFFTs]] 8 | deps = ["ChainRulesCore", "LinearAlgebra"] 9 | git-tree-sha1 = "16b6dbc4cf7caee4e1e75c49485ec67b667098a0" 10 | uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" 11 | version = "1.3.1" 12 | 13 | [[deps.Adapt]] 14 | deps = ["LinearAlgebra", "Requires"] 15 | git-tree-sha1 = "cc37d689f599e8df4f464b2fa3870ff7db7492ef" 16 | uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 17 | version = "3.6.1" 18 | 19 | [[deps.ArgTools]] 20 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 21 | version = "1.1.1" 22 | 23 | [[deps.Arpack]] 24 | deps = ["Arpack_jll", "Libdl", "LinearAlgebra", "Logging"] 25 | git-tree-sha1 = "9b9b347613394885fd1c8c7729bfc60528faa436" 26 | uuid = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97" 27 | version = "0.5.4" 28 | 29 | [[deps.Arpack_jll]] 30 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS_jll", "Pkg"] 31 | git-tree-sha1 = "5ba6c757e8feccf03a1554dfaf3e26b3cfc7fd5e" 32 | uuid = "68821587-b530-5797-8361-c406ea357684" 33 | version = "3.5.1+1" 34 | 35 | [[deps.Artifacts]] 36 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 37 | 38 | [[deps.AxisAlgorithms]] 39 | deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] 40 | git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" 41 | uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" 42 | version = "1.0.1" 43 | 44 | [[deps.Base64]] 45 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 46 | 47 | [[deps.BitFlags]] 48 | git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d" 49 | uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" 50 | version = "0.1.7" 51 | 52 | [[deps.Bzip2_jll]] 53 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 54 | git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" 55 | uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" 56 | version = "1.0.8+0" 57 | 58 | [[deps.CSV]] 59 | deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "SnoopPrecompile", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] 60 | git-tree-sha1 = "c700cce799b51c9045473de751e9319bdd1c6e94" 61 | uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" 62 | version = "0.10.9" 63 | 64 | [[deps.Cairo_jll]] 65 | deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] 66 | git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" 67 | uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" 68 | version = "1.16.1+1" 69 | 70 | [[deps.Calculus]] 71 | deps = ["LinearAlgebra"] 72 | git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" 73 | uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" 74 | version = "0.5.1" 75 | 76 | [[deps.ChainRulesCore]] 77 | deps = ["Compat", "LinearAlgebra", "SparseArrays"] 78 | git-tree-sha1 = "c6d890a52d2c4d55d326439580c3b8d0875a77d9" 79 | uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 80 | version = "1.15.7" 81 | 82 | [[deps.ChangesOfVariables]] 83 | deps = ["ChainRulesCore", "LinearAlgebra", "Test"] 84 | git-tree-sha1 = "485193efd2176b88e6622a39a246f8c5b600e74e" 85 | uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" 86 | version = "0.1.6" 87 | 88 | [[deps.Clustering]] 89 | deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "Random", "SparseArrays", "Statistics", "StatsBase"] 90 | git-tree-sha1 = "64df3da1d2a26f4de23871cd1b6482bb68092bd5" 91 | uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" 92 | version = "0.14.3" 93 | 94 | [[deps.CodecZlib]] 95 | deps = ["TranscodingStreams", "Zlib_jll"] 96 | git-tree-sha1 = "9c209fb7536406834aa938fb149964b985de6c83" 97 | uuid = "944b1d66-785c-5afd-91f1-9de20f533193" 98 | version = "0.7.1" 99 | 100 | [[deps.ColorSchemes]] 101 | deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random", "SnoopPrecompile"] 102 | git-tree-sha1 = "aa3edc8f8dea6cbfa176ee12f7c2fc82f0608ed3" 103 | uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" 104 | version = "3.20.0" 105 | 106 | [[deps.ColorTypes]] 107 | deps = ["FixedPointNumbers", "Random"] 108 | git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" 109 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 110 | version = "0.11.4" 111 | 112 | [[deps.ColorVectorSpace]] 113 | deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"] 114 | git-tree-sha1 = "600cc5508d66b78aae350f7accdb58763ac18589" 115 | uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" 116 | version = "0.9.10" 117 | 118 | [[deps.Colors]] 119 | deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] 120 | git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" 121 | uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" 122 | version = "0.12.10" 123 | 124 | [[deps.Compat]] 125 | deps = ["Dates", "LinearAlgebra", "UUIDs"] 126 | git-tree-sha1 = "7a60c856b9fa189eb34f5f8a6f6b5529b7942957" 127 | uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" 128 | version = "4.6.1" 129 | 130 | [[deps.CompilerSupportLibraries_jll]] 131 | deps = ["Artifacts", "Libdl"] 132 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 133 | version = "1.0.1+0" 134 | 135 | [[deps.Contour]] 136 | git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" 137 | uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" 138 | version = "0.6.2" 139 | 140 | [[deps.Crayons]] 141 | git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" 142 | uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" 143 | version = "4.1.1" 144 | 145 | [[deps.DataAPI]] 146 | git-tree-sha1 = "e8119c1a33d267e16108be441a287a6981ba1630" 147 | uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" 148 | version = "1.14.0" 149 | 150 | [[deps.DataFrames]] 151 | deps = ["Compat", "DataAPI", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SnoopPrecompile", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] 152 | git-tree-sha1 = "aa51303df86f8626a962fccb878430cdb0a97eee" 153 | uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 154 | version = "1.5.0" 155 | 156 | [[deps.DataStructures]] 157 | deps = ["Compat", "InteractiveUtils", "OrderedCollections"] 158 | git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" 159 | uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" 160 | version = "0.18.13" 161 | 162 | [[deps.DataValueInterfaces]] 163 | git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" 164 | uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" 165 | version = "1.0.0" 166 | 167 | [[deps.DataValues]] 168 | deps = ["DataValueInterfaces", "Dates"] 169 | git-tree-sha1 = "d88a19299eba280a6d062e135a43f00323ae70bf" 170 | uuid = "e7dc6d0d-1eca-5fa6-8ad6-5aecde8b7ea5" 171 | version = "0.4.13" 172 | 173 | [[deps.Dates]] 174 | deps = ["Printf"] 175 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 176 | 177 | [[deps.DelimitedFiles]] 178 | deps = ["Mmap"] 179 | uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" 180 | 181 | [[deps.DensityInterface]] 182 | deps = ["InverseFunctions", "Test"] 183 | git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" 184 | uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" 185 | version = "0.4.0" 186 | 187 | [[deps.Distances]] 188 | deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] 189 | git-tree-sha1 = "49eba9ad9f7ead780bfb7ee319f962c811c6d3b2" 190 | uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" 191 | version = "0.10.8" 192 | 193 | [[deps.Distributed]] 194 | deps = ["Random", "Serialization", "Sockets"] 195 | uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" 196 | 197 | [[deps.Distributions]] 198 | deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] 199 | git-tree-sha1 = "da9e1a9058f8d3eec3a8c9fe4faacfb89180066b" 200 | uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" 201 | version = "0.25.86" 202 | 203 | [[deps.DocStringExtensions]] 204 | deps = ["LibGit2"] 205 | git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" 206 | uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" 207 | version = "0.9.3" 208 | 209 | [[deps.Downloads]] 210 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 211 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 212 | version = "1.6.0" 213 | 214 | [[deps.DualNumbers]] 215 | deps = ["Calculus", "NaNMath", "SpecialFunctions"] 216 | git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" 217 | uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" 218 | version = "0.6.8" 219 | 220 | [[deps.Expat_jll]] 221 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 222 | git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" 223 | uuid = "2e619515-83b5-522b-bb60-26c02a35a201" 224 | version = "2.4.8+0" 225 | 226 | [[deps.FFMPEG]] 227 | deps = ["FFMPEG_jll"] 228 | git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" 229 | uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" 230 | version = "0.4.1" 231 | 232 | [[deps.FFMPEG_jll]] 233 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] 234 | git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" 235 | uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" 236 | version = "4.4.2+2" 237 | 238 | [[deps.FFTW]] 239 | deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] 240 | git-tree-sha1 = "f9818144ce7c8c41edf5c4c179c684d92aa4d9fe" 241 | uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" 242 | version = "1.6.0" 243 | 244 | [[deps.FFTW_jll]] 245 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 246 | git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" 247 | uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" 248 | version = "3.3.10+0" 249 | 250 | [[deps.FilePathsBase]] 251 | deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] 252 | git-tree-sha1 = "e27c4ebe80e8699540f2d6c805cc12203b614f12" 253 | uuid = "48062228-2e41-5def-b9a4-89aafe57970f" 254 | version = "0.9.20" 255 | 256 | [[deps.FileWatching]] 257 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 258 | 259 | [[deps.FillArrays]] 260 | deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] 261 | git-tree-sha1 = "d3ba08ab64bdfd27234d3f61956c966266757fe6" 262 | uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" 263 | version = "0.13.7" 264 | 265 | [[deps.FixedPointNumbers]] 266 | deps = ["Statistics"] 267 | git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" 268 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 269 | version = "0.8.4" 270 | 271 | [[deps.Fontconfig_jll]] 272 | deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] 273 | git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" 274 | uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" 275 | version = "2.13.93+0" 276 | 277 | [[deps.Formatting]] 278 | deps = ["Printf"] 279 | git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" 280 | uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" 281 | version = "0.4.2" 282 | 283 | [[deps.FreeType2_jll]] 284 | deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] 285 | git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" 286 | uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" 287 | version = "2.10.4+0" 288 | 289 | [[deps.FriBidi_jll]] 290 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 291 | git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" 292 | uuid = "559328eb-81f9-559d-9380-de523a88c83c" 293 | version = "1.0.10+0" 294 | 295 | [[deps.Future]] 296 | deps = ["Random"] 297 | uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" 298 | 299 | [[deps.GLFW_jll]] 300 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] 301 | git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" 302 | uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" 303 | version = "3.3.8+0" 304 | 305 | [[deps.GR]] 306 | deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"] 307 | git-tree-sha1 = "660b2ea2ec2b010bb02823c6d0ff6afd9bdc5c16" 308 | uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" 309 | version = "0.71.7" 310 | 311 | [[deps.GR_jll]] 312 | deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] 313 | git-tree-sha1 = "d5e1fd17ac7f3aa4c5287a61ee28d4f8b8e98873" 314 | uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" 315 | version = "0.71.7+0" 316 | 317 | [[deps.Gettext_jll]] 318 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] 319 | git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" 320 | uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" 321 | version = "0.21.0+0" 322 | 323 | [[deps.Glib_jll]] 324 | deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Pkg", "Zlib_jll"] 325 | git-tree-sha1 = "d3b3624125c1474292d0d8ed0f65554ac37ddb23" 326 | uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" 327 | version = "2.74.0+2" 328 | 329 | [[deps.Graphite2_jll]] 330 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 331 | git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" 332 | uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" 333 | version = "1.3.14+0" 334 | 335 | [[deps.Grisu]] 336 | git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" 337 | uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" 338 | version = "1.0.2" 339 | 340 | [[deps.HTTP]] 341 | deps = ["Base64", "CodecZlib", "Dates", "IniFile", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] 342 | git-tree-sha1 = "37e4657cd56b11abe3d10cd4a1ec5fbdb4180263" 343 | uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" 344 | version = "1.7.4" 345 | 346 | [[deps.HarfBuzz_jll]] 347 | deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] 348 | git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" 349 | uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" 350 | version = "2.8.1+1" 351 | 352 | [[deps.HypergeometricFunctions]] 353 | deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions", "Test"] 354 | git-tree-sha1 = "709d864e3ed6e3545230601f94e11ebc65994641" 355 | uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" 356 | version = "0.3.11" 357 | 358 | [[deps.IniFile]] 359 | git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" 360 | uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" 361 | version = "0.5.1" 362 | 363 | [[deps.InlineStrings]] 364 | deps = ["Parsers"] 365 | git-tree-sha1 = "9cc2baf75c6d09f9da536ddf58eb2f29dedaf461" 366 | uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" 367 | version = "1.4.0" 368 | 369 | [[deps.IntelOpenMP_jll]] 370 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 371 | git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c" 372 | uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" 373 | version = "2018.0.3+2" 374 | 375 | [[deps.InteractiveUtils]] 376 | deps = ["Markdown"] 377 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 378 | 379 | [[deps.Interpolations]] 380 | deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] 381 | git-tree-sha1 = "721ec2cf720536ad005cb38f50dbba7b02419a15" 382 | uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" 383 | version = "0.14.7" 384 | 385 | [[deps.InverseFunctions]] 386 | deps = ["Test"] 387 | git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" 388 | uuid = "3587e190-3f89-42d0-90ee-14403ec27112" 389 | version = "0.1.8" 390 | 391 | [[deps.InvertedIndices]] 392 | git-tree-sha1 = "82aec7a3dd64f4d9584659dc0b62ef7db2ef3e19" 393 | uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" 394 | version = "1.2.0" 395 | 396 | [[deps.IrrationalConstants]] 397 | git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" 398 | uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" 399 | version = "0.2.2" 400 | 401 | [[deps.IterableTables]] 402 | deps = ["DataValues", "IteratorInterfaceExtensions", "Requires", "TableTraits", "TableTraitsUtils"] 403 | git-tree-sha1 = "70300b876b2cebde43ebc0df42bc8c94a144e1b4" 404 | uuid = "1c8ee90f-4401-5389-894e-7a04a3dc0f4d" 405 | version = "1.0.0" 406 | 407 | [[deps.IteratorInterfaceExtensions]] 408 | git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" 409 | uuid = "82899510-4779-5014-852e-03e436cf321d" 410 | version = "1.0.0" 411 | 412 | [[deps.JLFzf]] 413 | deps = ["Pipe", "REPL", "Random", "fzf_jll"] 414 | git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" 415 | uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" 416 | version = "0.1.5" 417 | 418 | [[deps.JLLWrappers]] 419 | deps = ["Preferences"] 420 | git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" 421 | uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" 422 | version = "1.4.1" 423 | 424 | [[deps.JSON]] 425 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 426 | git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" 427 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 428 | version = "0.21.3" 429 | 430 | [[deps.JpegTurbo_jll]] 431 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 432 | git-tree-sha1 = "6f2675ef130a300a112286de91973805fcc5ffbc" 433 | uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" 434 | version = "2.1.91+0" 435 | 436 | [[deps.KernelDensity]] 437 | deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] 438 | git-tree-sha1 = "9816b296736292a80b9a3200eb7fbb57aaa3917a" 439 | uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" 440 | version = "0.6.5" 441 | 442 | [[deps.LAME_jll]] 443 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 444 | git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" 445 | uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" 446 | version = "3.100.1+0" 447 | 448 | [[deps.LERC_jll]] 449 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 450 | git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" 451 | uuid = "88015f11-f218-50d7-93a8-a6af411a945d" 452 | version = "3.0.0+1" 453 | 454 | [[deps.LZO_jll]] 455 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 456 | git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" 457 | uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" 458 | version = "2.10.1+0" 459 | 460 | [[deps.LaTeXStrings]] 461 | git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" 462 | uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" 463 | version = "1.3.0" 464 | 465 | [[deps.Latexify]] 466 | deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] 467 | git-tree-sha1 = "2422f47b34d4b127720a18f86fa7b1aa2e141f29" 468 | uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" 469 | version = "0.15.18" 470 | 471 | [[deps.LazyArtifacts]] 472 | deps = ["Artifacts", "Pkg"] 473 | uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" 474 | 475 | [[deps.LibCURL]] 476 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 477 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 478 | version = "0.6.3" 479 | 480 | [[deps.LibCURL_jll]] 481 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 482 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 483 | version = "7.84.0+0" 484 | 485 | [[deps.LibGit2]] 486 | deps = ["Base64", "NetworkOptions", "Printf", "SHA"] 487 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 488 | 489 | [[deps.LibSSH2_jll]] 490 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 491 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 492 | version = "1.10.2+0" 493 | 494 | [[deps.Libdl]] 495 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 496 | 497 | [[deps.Libffi_jll]] 498 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 499 | git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" 500 | uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" 501 | version = "3.2.2+1" 502 | 503 | [[deps.Libgcrypt_jll]] 504 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] 505 | git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" 506 | uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" 507 | version = "1.8.7+0" 508 | 509 | [[deps.Libglvnd_jll]] 510 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] 511 | git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" 512 | uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" 513 | version = "1.6.0+0" 514 | 515 | [[deps.Libgpg_error_jll]] 516 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 517 | git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" 518 | uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" 519 | version = "1.42.0+0" 520 | 521 | [[deps.Libiconv_jll]] 522 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 523 | git-tree-sha1 = "c7cb1f5d892775ba13767a87c7ada0b980ea0a71" 524 | uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" 525 | version = "1.16.1+2" 526 | 527 | [[deps.Libmount_jll]] 528 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 529 | git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" 530 | uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" 531 | version = "2.35.0+0" 532 | 533 | [[deps.Libtiff_jll]] 534 | deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] 535 | git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" 536 | uuid = "89763e89-9b03-5906-acba-b20f662cd828" 537 | version = "4.4.0+0" 538 | 539 | [[deps.Libuuid_jll]] 540 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 541 | git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" 542 | uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" 543 | version = "2.36.0+0" 544 | 545 | [[deps.LinearAlgebra]] 546 | deps = ["Libdl", "libblastrampoline_jll"] 547 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 548 | 549 | [[deps.LogExpFunctions]] 550 | deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] 551 | git-tree-sha1 = "0a1b7c2863e44523180fdb3146534e265a91870b" 552 | uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" 553 | version = "0.3.23" 554 | 555 | [[deps.Logging]] 556 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 557 | 558 | [[deps.LoggingExtras]] 559 | deps = ["Dates", "Logging"] 560 | git-tree-sha1 = "cedb76b37bc5a6c702ade66be44f831fa23c681e" 561 | uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" 562 | version = "1.0.0" 563 | 564 | [[deps.MKL_jll]] 565 | deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] 566 | git-tree-sha1 = "2ce8695e1e699b68702c03402672a69f54b8aca9" 567 | uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" 568 | version = "2022.2.0+0" 569 | 570 | [[deps.MacroTools]] 571 | deps = ["Markdown", "Random"] 572 | git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" 573 | uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" 574 | version = "0.5.10" 575 | 576 | [[deps.Markdown]] 577 | deps = ["Base64"] 578 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 579 | 580 | [[deps.MbedTLS]] 581 | deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] 582 | git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" 583 | uuid = "739be429-bea8-5141-9913-cc70e7f3736d" 584 | version = "1.1.7" 585 | 586 | [[deps.MbedTLS_jll]] 587 | deps = ["Artifacts", "Libdl"] 588 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 589 | version = "2.28.0+0" 590 | 591 | [[deps.Measures]] 592 | git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" 593 | uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" 594 | version = "0.3.2" 595 | 596 | [[deps.Missings]] 597 | deps = ["DataAPI"] 598 | git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" 599 | uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" 600 | version = "1.1.0" 601 | 602 | [[deps.Mmap]] 603 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 604 | 605 | [[deps.MozillaCACerts_jll]] 606 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 607 | version = "2022.2.1" 608 | 609 | [[deps.MultivariateStats]] 610 | deps = ["Arpack", "LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI", "StatsBase"] 611 | git-tree-sha1 = "91a48569383df24f0fd2baf789df2aade3d0ad80" 612 | uuid = "6f286f6a-111f-5878-ab1e-185364afe411" 613 | version = "0.10.1" 614 | 615 | [[deps.NaNMath]] 616 | deps = ["OpenLibm_jll"] 617 | git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" 618 | uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" 619 | version = "1.0.2" 620 | 621 | [[deps.NearestNeighbors]] 622 | deps = ["Distances", "StaticArrays"] 623 | git-tree-sha1 = "2c3726ceb3388917602169bed973dbc97f1b51a8" 624 | uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" 625 | version = "0.4.13" 626 | 627 | [[deps.NetworkOptions]] 628 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 629 | version = "1.2.0" 630 | 631 | [[deps.Observables]] 632 | git-tree-sha1 = "6862738f9796b3edc1c09d0890afce4eca9e7e93" 633 | uuid = "510215fc-4207-5dde-b226-833fc4488ee2" 634 | version = "0.5.4" 635 | 636 | [[deps.OffsetArrays]] 637 | deps = ["Adapt"] 638 | git-tree-sha1 = "82d7c9e310fe55aa54996e6f7f94674e2a38fcb4" 639 | uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" 640 | version = "1.12.9" 641 | 642 | [[deps.Ogg_jll]] 643 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 644 | git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" 645 | uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" 646 | version = "1.3.5+1" 647 | 648 | [[deps.OpenBLAS_jll]] 649 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 650 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 651 | version = "0.3.20+0" 652 | 653 | [[deps.OpenLibm_jll]] 654 | deps = ["Artifacts", "Libdl"] 655 | uuid = "05823500-19ac-5b8b-9628-191a04bc5112" 656 | version = "0.8.1+0" 657 | 658 | [[deps.OpenSSL]] 659 | deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] 660 | git-tree-sha1 = "6503b77492fd7fcb9379bf73cd31035670e3c509" 661 | uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" 662 | version = "1.3.3" 663 | 664 | [[deps.OpenSSL_jll]] 665 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 666 | git-tree-sha1 = "9ff31d101d987eb9d66bd8b176ac7c277beccd09" 667 | uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" 668 | version = "1.1.20+0" 669 | 670 | [[deps.OpenSpecFun_jll]] 671 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] 672 | git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" 673 | uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" 674 | version = "0.5.5+0" 675 | 676 | [[deps.Opus_jll]] 677 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 678 | git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" 679 | uuid = "91d4177d-7536-5919-b921-800302f37372" 680 | version = "1.3.2+0" 681 | 682 | [[deps.OrderedCollections]] 683 | git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" 684 | uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" 685 | version = "1.4.1" 686 | 687 | [[deps.PCRE2_jll]] 688 | deps = ["Artifacts", "Libdl"] 689 | uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" 690 | version = "10.40.0+0" 691 | 692 | [[deps.PDMats]] 693 | deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] 694 | git-tree-sha1 = "67eae2738d63117a196f497d7db789821bce61d1" 695 | uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" 696 | version = "0.11.17" 697 | 698 | [[deps.Parsers]] 699 | deps = ["Dates", "SnoopPrecompile"] 700 | git-tree-sha1 = "478ac6c952fddd4399e71d4779797c538d0ff2bf" 701 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 702 | version = "2.5.8" 703 | 704 | [[deps.Pipe]] 705 | git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" 706 | uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" 707 | version = "1.3.0" 708 | 709 | [[deps.Pixman_jll]] 710 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 711 | git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" 712 | uuid = "30392449-352a-5448-841d-b1acce4e97dc" 713 | version = "0.40.1+0" 714 | 715 | [[deps.Pkg]] 716 | deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] 717 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 718 | version = "1.8.0" 719 | 720 | [[deps.PlotThemes]] 721 | deps = ["PlotUtils", "Statistics"] 722 | git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" 723 | uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" 724 | version = "3.1.0" 725 | 726 | [[deps.PlotUtils]] 727 | deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "SnoopPrecompile", "Statistics"] 728 | git-tree-sha1 = "c95373e73290cf50a8a22c3375e4625ded5c5280" 729 | uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" 730 | version = "1.3.4" 731 | 732 | [[deps.Plots]] 733 | deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] 734 | git-tree-sha1 = "da1d3fb7183e38603fcdd2061c47979d91202c97" 735 | uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" 736 | version = "1.38.6" 737 | 738 | [[deps.PooledArrays]] 739 | deps = ["DataAPI", "Future"] 740 | git-tree-sha1 = "a6062fe4063cdafe78f4a0a81cfffb89721b30e7" 741 | uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" 742 | version = "1.4.2" 743 | 744 | [[deps.Preferences]] 745 | deps = ["TOML"] 746 | git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" 747 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 748 | version = "1.3.0" 749 | 750 | [[deps.PrettyTables]] 751 | deps = ["Crayons", "Formatting", "LaTeXStrings", "Markdown", "Reexport", "StringManipulation", "Tables"] 752 | git-tree-sha1 = "96f6db03ab535bdb901300f88335257b0018689d" 753 | uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" 754 | version = "2.2.2" 755 | 756 | [[deps.Printf]] 757 | deps = ["Unicode"] 758 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 759 | 760 | [[deps.Qt5Base_jll]] 761 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] 762 | git-tree-sha1 = "0c03844e2231e12fda4d0086fd7cbe4098ee8dc5" 763 | uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" 764 | version = "5.15.3+2" 765 | 766 | [[deps.QuadGK]] 767 | deps = ["DataStructures", "LinearAlgebra"] 768 | git-tree-sha1 = "786efa36b7eff813723c4849c90456609cf06661" 769 | uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" 770 | version = "2.8.1" 771 | 772 | [[deps.Query]] 773 | deps = ["DataValues", "IterableTables", "MacroTools", "QueryOperators", "Statistics"] 774 | git-tree-sha1 = "a66aa7ca6f5c29f0e303ccef5c8bd55067df9bbe" 775 | uuid = "1a8c2f83-1ff3-5112-b086-8aa67b057ba1" 776 | version = "1.0.0" 777 | 778 | [[deps.QueryOperators]] 779 | deps = ["DataStructures", "DataValues", "IteratorInterfaceExtensions", "TableShowUtils"] 780 | git-tree-sha1 = "911c64c204e7ecabfd1872eb93c49b4e7c701f02" 781 | uuid = "2aef5ad7-51ca-5a8f-8e88-e75cf067b44b" 782 | version = "0.9.3" 783 | 784 | [[deps.REPL]] 785 | deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] 786 | uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 787 | 788 | [[deps.Random]] 789 | deps = ["SHA", "Serialization"] 790 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 791 | 792 | [[deps.Ratios]] 793 | deps = ["Requires"] 794 | git-tree-sha1 = "dc84268fe0e3335a62e315a3a7cf2afa7178a734" 795 | uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" 796 | version = "0.4.3" 797 | 798 | [[deps.RecipesBase]] 799 | deps = ["SnoopPrecompile"] 800 | git-tree-sha1 = "261dddd3b862bd2c940cf6ca4d1c8fe593e457c8" 801 | uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" 802 | version = "1.3.3" 803 | 804 | [[deps.RecipesPipeline]] 805 | deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase", "SnoopPrecompile"] 806 | git-tree-sha1 = "e974477be88cb5e3040009f3767611bc6357846f" 807 | uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" 808 | version = "0.6.11" 809 | 810 | [[deps.Reexport]] 811 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 812 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 813 | version = "1.2.2" 814 | 815 | [[deps.RelocatableFolders]] 816 | deps = ["SHA", "Scratch"] 817 | git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" 818 | uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" 819 | version = "1.0.0" 820 | 821 | [[deps.Requires]] 822 | deps = ["UUIDs"] 823 | git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" 824 | uuid = "ae029012-a4dd-5104-9daa-d747884805df" 825 | version = "1.3.0" 826 | 827 | [[deps.Rmath]] 828 | deps = ["Random", "Rmath_jll"] 829 | git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" 830 | uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" 831 | version = "0.7.1" 832 | 833 | [[deps.Rmath_jll]] 834 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 835 | git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" 836 | uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" 837 | version = "0.4.0+0" 838 | 839 | [[deps.SHA]] 840 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 841 | version = "0.7.0" 842 | 843 | [[deps.Scratch]] 844 | deps = ["Dates"] 845 | git-tree-sha1 = "30449ee12237627992a99d5e30ae63e4d78cd24a" 846 | uuid = "6c6a2e73-6563-6170-7368-637461726353" 847 | version = "1.2.0" 848 | 849 | [[deps.SentinelArrays]] 850 | deps = ["Dates", "Random"] 851 | git-tree-sha1 = "77d3c4726515dca71f6d80fbb5e251088defe305" 852 | uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" 853 | version = "1.3.18" 854 | 855 | [[deps.Serialization]] 856 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 857 | 858 | [[deps.SharedArrays]] 859 | deps = ["Distributed", "Mmap", "Random", "Serialization"] 860 | uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" 861 | 862 | [[deps.Showoff]] 863 | deps = ["Dates", "Grisu"] 864 | git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" 865 | uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" 866 | version = "1.0.3" 867 | 868 | [[deps.SimpleBufferStream]] 869 | git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" 870 | uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" 871 | version = "1.1.0" 872 | 873 | [[deps.SnoopPrecompile]] 874 | deps = ["Preferences"] 875 | git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" 876 | uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" 877 | version = "1.0.3" 878 | 879 | [[deps.Sockets]] 880 | uuid = "6462fe0b-24de-5631-8697-dd941f90decc" 881 | 882 | [[deps.SortingAlgorithms]] 883 | deps = ["DataStructures"] 884 | git-tree-sha1 = "a4ada03f999bd01b3a25dcaa30b2d929fe537e00" 885 | uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" 886 | version = "1.1.0" 887 | 888 | [[deps.SparseArrays]] 889 | deps = ["LinearAlgebra", "Random"] 890 | uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 891 | 892 | [[deps.SpecialFunctions]] 893 | deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] 894 | git-tree-sha1 = "ef28127915f4229c971eb43f3fc075dd3fe91880" 895 | uuid = "276daf66-3868-5448-9aa4-cd146d93841b" 896 | version = "2.2.0" 897 | 898 | [[deps.StaticArrays]] 899 | deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] 900 | git-tree-sha1 = "2d7d9e1ddadc8407ffd460e24218e37ef52dd9a3" 901 | uuid = "90137ffa-7385-5640-81b9-e52037218182" 902 | version = "1.5.16" 903 | 904 | [[deps.StaticArraysCore]] 905 | git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a" 906 | uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" 907 | version = "1.4.0" 908 | 909 | [[deps.Statistics]] 910 | deps = ["LinearAlgebra", "SparseArrays"] 911 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 912 | 913 | [[deps.StatsAPI]] 914 | deps = ["LinearAlgebra"] 915 | git-tree-sha1 = "f9af7f195fb13589dd2e2d57fdb401717d2eb1f6" 916 | uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" 917 | version = "1.5.0" 918 | 919 | [[deps.StatsBase]] 920 | deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] 921 | git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" 922 | uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" 923 | version = "0.33.21" 924 | 925 | [[deps.StatsFuns]] 926 | deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] 927 | git-tree-sha1 = "f625d686d5a88bcd2b15cd81f18f98186fdc0c9a" 928 | uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" 929 | version = "1.3.0" 930 | 931 | [[deps.StatsPlots]] 932 | deps = ["AbstractFFTs", "Clustering", "DataStructures", "DataValues", "Distributions", "Interpolations", "KernelDensity", "LinearAlgebra", "MultivariateStats", "NaNMath", "Observables", "Plots", "RecipesBase", "RecipesPipeline", "Reexport", "StatsBase", "TableOperations", "Tables", "Widgets"] 933 | git-tree-sha1 = "e0d5bc26226ab1b7648278169858adcfbd861780" 934 | uuid = "f3b207a7-027a-5e70-b257-86293d7955fd" 935 | version = "0.15.4" 936 | 937 | [[deps.StringManipulation]] 938 | git-tree-sha1 = "46da2434b41f41ac3594ee9816ce5541c6096123" 939 | uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" 940 | version = "0.3.0" 941 | 942 | [[deps.SuiteSparse]] 943 | deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] 944 | uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" 945 | 946 | [[deps.TOML]] 947 | deps = ["Dates"] 948 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 949 | version = "1.0.0" 950 | 951 | [[deps.TableOperations]] 952 | deps = ["SentinelArrays", "Tables", "Test"] 953 | git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" 954 | uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" 955 | version = "1.2.0" 956 | 957 | [[deps.TableShowUtils]] 958 | deps = ["DataValues", "Dates", "JSON", "Markdown", "Test"] 959 | git-tree-sha1 = "14c54e1e96431fb87f0d2f5983f090f1b9d06457" 960 | uuid = "5e66a065-1f0a-5976-b372-e0b8c017ca10" 961 | version = "0.2.5" 962 | 963 | [[deps.TableTraits]] 964 | deps = ["IteratorInterfaceExtensions"] 965 | git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" 966 | uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" 967 | version = "1.0.1" 968 | 969 | [[deps.TableTraitsUtils]] 970 | deps = ["DataValues", "IteratorInterfaceExtensions", "Missings", "TableTraits"] 971 | git-tree-sha1 = "78fecfe140d7abb480b53a44f3f85b6aa373c293" 972 | uuid = "382cd787-c1b6-5bf2-a167-d5b971a19bda" 973 | version = "1.0.2" 974 | 975 | [[deps.Tables]] 976 | deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] 977 | git-tree-sha1 = "c79322d36826aa2f4fd8ecfa96ddb47b174ac78d" 978 | uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" 979 | version = "1.10.0" 980 | 981 | [[deps.Tar]] 982 | deps = ["ArgTools", "SHA"] 983 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 984 | version = "1.10.1" 985 | 986 | [[deps.TensorCore]] 987 | deps = ["LinearAlgebra"] 988 | git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" 989 | uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" 990 | version = "0.1.1" 991 | 992 | [[deps.Test]] 993 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 994 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 995 | 996 | [[deps.TranscodingStreams]] 997 | deps = ["Random", "Test"] 998 | git-tree-sha1 = "94f38103c984f89cf77c402f2a68dbd870f8165f" 999 | uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" 1000 | version = "0.9.11" 1001 | 1002 | [[deps.URIs]] 1003 | git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" 1004 | uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 1005 | version = "1.4.2" 1006 | 1007 | [[deps.UUIDs]] 1008 | deps = ["Random", "SHA"] 1009 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 1010 | 1011 | [[deps.Unicode]] 1012 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 1013 | 1014 | [[deps.UnicodeFun]] 1015 | deps = ["REPL"] 1016 | git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" 1017 | uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" 1018 | version = "0.4.1" 1019 | 1020 | [[deps.Unzip]] 1021 | git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" 1022 | uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" 1023 | version = "0.2.0" 1024 | 1025 | [[deps.Wayland_jll]] 1026 | deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] 1027 | git-tree-sha1 = "ed8d92d9774b077c53e1da50fd81a36af3744c1c" 1028 | uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" 1029 | version = "1.21.0+0" 1030 | 1031 | [[deps.Wayland_protocols_jll]] 1032 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1033 | git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" 1034 | uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" 1035 | version = "1.25.0+0" 1036 | 1037 | [[deps.WeakRefStrings]] 1038 | deps = ["DataAPI", "InlineStrings", "Parsers"] 1039 | git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" 1040 | uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" 1041 | version = "1.4.2" 1042 | 1043 | [[deps.Widgets]] 1044 | deps = ["Colors", "Dates", "Observables", "OrderedCollections"] 1045 | git-tree-sha1 = "fcdae142c1cfc7d89de2d11e08721d0f2f86c98a" 1046 | uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" 1047 | version = "0.6.6" 1048 | 1049 | [[deps.WoodburyMatrices]] 1050 | deps = ["LinearAlgebra", "SparseArrays"] 1051 | git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" 1052 | uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" 1053 | version = "0.5.5" 1054 | 1055 | [[deps.WorkerUtilities]] 1056 | git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" 1057 | uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" 1058 | version = "1.6.1" 1059 | 1060 | [[deps.XML2_jll]] 1061 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] 1062 | git-tree-sha1 = "93c41695bc1c08c46c5899f4fe06d6ead504bb73" 1063 | uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" 1064 | version = "2.10.3+0" 1065 | 1066 | [[deps.XSLT_jll]] 1067 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] 1068 | git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" 1069 | uuid = "aed1982a-8fda-507f-9586-7b0439959a61" 1070 | version = "1.1.34+0" 1071 | 1072 | [[deps.Xorg_libX11_jll]] 1073 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] 1074 | git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" 1075 | uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" 1076 | version = "1.6.9+4" 1077 | 1078 | [[deps.Xorg_libXau_jll]] 1079 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1080 | git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" 1081 | uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" 1082 | version = "1.0.9+4" 1083 | 1084 | [[deps.Xorg_libXcursor_jll]] 1085 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] 1086 | git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" 1087 | uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" 1088 | version = "1.2.0+4" 1089 | 1090 | [[deps.Xorg_libXdmcp_jll]] 1091 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1092 | git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" 1093 | uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" 1094 | version = "1.1.3+4" 1095 | 1096 | [[deps.Xorg_libXext_jll]] 1097 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] 1098 | git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" 1099 | uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" 1100 | version = "1.3.4+4" 1101 | 1102 | [[deps.Xorg_libXfixes_jll]] 1103 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] 1104 | git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" 1105 | uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" 1106 | version = "5.0.3+4" 1107 | 1108 | [[deps.Xorg_libXi_jll]] 1109 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] 1110 | git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" 1111 | uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" 1112 | version = "1.7.10+4" 1113 | 1114 | [[deps.Xorg_libXinerama_jll]] 1115 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] 1116 | git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" 1117 | uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" 1118 | version = "1.1.4+4" 1119 | 1120 | [[deps.Xorg_libXrandr_jll]] 1121 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] 1122 | git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" 1123 | uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" 1124 | version = "1.5.2+4" 1125 | 1126 | [[deps.Xorg_libXrender_jll]] 1127 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] 1128 | git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" 1129 | uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" 1130 | version = "0.9.10+4" 1131 | 1132 | [[deps.Xorg_libpthread_stubs_jll]] 1133 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1134 | git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" 1135 | uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" 1136 | version = "0.1.0+3" 1137 | 1138 | [[deps.Xorg_libxcb_jll]] 1139 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] 1140 | git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" 1141 | uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" 1142 | version = "1.13.0+3" 1143 | 1144 | [[deps.Xorg_libxkbfile_jll]] 1145 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] 1146 | git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" 1147 | uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" 1148 | version = "1.1.0+4" 1149 | 1150 | [[deps.Xorg_xcb_util_image_jll]] 1151 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1152 | git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" 1153 | uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" 1154 | version = "0.4.0+1" 1155 | 1156 | [[deps.Xorg_xcb_util_jll]] 1157 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] 1158 | git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" 1159 | uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" 1160 | version = "0.4.0+1" 1161 | 1162 | [[deps.Xorg_xcb_util_keysyms_jll]] 1163 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1164 | git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" 1165 | uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" 1166 | version = "0.4.0+1" 1167 | 1168 | [[deps.Xorg_xcb_util_renderutil_jll]] 1169 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1170 | git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" 1171 | uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" 1172 | version = "0.3.9+1" 1173 | 1174 | [[deps.Xorg_xcb_util_wm_jll]] 1175 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1176 | git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" 1177 | uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" 1178 | version = "0.4.1+1" 1179 | 1180 | [[deps.Xorg_xkbcomp_jll]] 1181 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] 1182 | git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" 1183 | uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" 1184 | version = "1.4.2+4" 1185 | 1186 | [[deps.Xorg_xkeyboard_config_jll]] 1187 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] 1188 | git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" 1189 | uuid = "33bec58e-1273-512f-9401-5d533626f822" 1190 | version = "2.27.0+4" 1191 | 1192 | [[deps.Xorg_xtrans_jll]] 1193 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1194 | git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" 1195 | uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" 1196 | version = "1.4.0+3" 1197 | 1198 | [[deps.Zlib_jll]] 1199 | deps = ["Libdl"] 1200 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 1201 | version = "1.2.12+3" 1202 | 1203 | [[deps.Zstd_jll]] 1204 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1205 | git-tree-sha1 = "c6edfe154ad7b313c01aceca188c05c835c67360" 1206 | uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" 1207 | version = "1.5.4+0" 1208 | 1209 | [[deps.fzf_jll]] 1210 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1211 | git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" 1212 | uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" 1213 | version = "0.29.0+0" 1214 | 1215 | [[deps.libaom_jll]] 1216 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1217 | git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" 1218 | uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" 1219 | version = "3.4.0+0" 1220 | 1221 | [[deps.libass_jll]] 1222 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] 1223 | git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" 1224 | uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" 1225 | version = "0.15.1+0" 1226 | 1227 | [[deps.libblastrampoline_jll]] 1228 | deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] 1229 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 1230 | version = "5.1.1+0" 1231 | 1232 | [[deps.libfdk_aac_jll]] 1233 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1234 | git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" 1235 | uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" 1236 | version = "2.0.2+0" 1237 | 1238 | [[deps.libpng_jll]] 1239 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] 1240 | git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" 1241 | uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" 1242 | version = "1.6.38+0" 1243 | 1244 | [[deps.libvorbis_jll]] 1245 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] 1246 | git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" 1247 | uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" 1248 | version = "1.3.7+1" 1249 | 1250 | [[deps.nghttp2_jll]] 1251 | deps = ["Artifacts", "Libdl"] 1252 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 1253 | version = "1.48.0+0" 1254 | 1255 | [[deps.p7zip_jll]] 1256 | deps = ["Artifacts", "Libdl"] 1257 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 1258 | version = "17.4.0+0" 1259 | 1260 | [[deps.x264_jll]] 1261 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1262 | git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" 1263 | uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" 1264 | version = "2021.5.5+0" 1265 | 1266 | [[deps.x265_jll]] 1267 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1268 | git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" 1269 | uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" 1270 | version = "3.5.0+0" 1271 | 1272 | [[deps.xkbcommon_jll]] 1273 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] 1274 | git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" 1275 | uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" 1276 | version = "1.4.1+0" 1277 | --------------------------------------------------------------------------------