KronosTheLate / JuliaPackageComparisons

A web page (coming soon) hosted on github for comparison of Julia packages. (Hopefully) Organic content produced by the users and creators of the packages being compared.
MIT License
7 stars 2 forks source link

Attention - This project has moved to a new repository

To get the appropriate URL for the website discussed here, a new repository has been created inside a new origanization. All issues, PRs and stars should be redirected there. This means that this repository is obsolete. It will be kept for some time, but likely be deleted in the future.

















Julia Package Comparisons

This Github repository contains the content of INSERT LINK, a website that compares Julia Packages. The comparisons should be as simple to read and understand as possible. The content should be the result of the combined perspectives of package developers and users to ensure the most fair and objective comparisons of packages.

It is currently hosted by a private github user. If the project catches on, it would ideally be moved to the JuliaLang github organization due to it's potential importance to the general julia ecosystem.

The problem to be adressed by this project

The Julia Package ecosystem is organic. This means that situations like the ones below occur all the time:

Such situations, and many many more, will always be part of an organic package system. However, it can be hard to navigate. Currently, users will have to do one or more of the following to choose between competing/overlapping packages:

The solutions above take increasingly more effort. Doing all of them is the best way to figure out which package is right for you, but it takes too much effort for many, especially when in the middle of a project where you need a package only for a specific part. The result is likely that many users never discover all the packages that could solve their problem, and definitly do not make a systematic comparison to find the ideal one.

Some packgages try to alleviate this problem by having a "See also" or "Related packges" section in the bottom of their readme. This is a bandaid-fix, as a) work is duplicated if each package repository has this section, and b) there are few guidelines on this section, and it style, existence and scope varies wildly.

Comparisons of packages in any package repository or in a discourse discussion are always suceptable to going out of date, as the organic package ecosystem is ever-changing. A good solution will therefore have to be updatable, and independent of any single package. A github-hosted website solves this issue, as anyone can make PR's and issues as things go out of date.

This project aims to create a canonical and updated website that will 1) make it easier for users to discover packages for specific problems/domains, and 1) learn about the differences between packages that overlap, to enable them to chose the most appropriate one.

Sections and domains

The website will be organized into sections. Each section should cover a specific domain, e.g. plotting. The name of the section should make it clear to users which domain is covered in the section.

The format that makes the most sense will likely vary from domain to domain. Therefore, no general guidelines regarding the format of the comparisons will be made. If however a format emerges that works well, it might be imposed as the default format.

ToDo's

Webpage content from here

The goal is to create a github-hosted website, for which I plan to use Franklin.jl. Until then, I will write some content below to bootstrap this project. That content will be moved to the website once it is running.

Plotting

tl;dr

Plots.jl is the most used for a reason. It's very flexible, integrates with the most Julia packages so you'll find it all throughout other docs, and it has many of the advantages of the other libraries through its backend system. Thus if you needed Latex output, use the pgfplots backend. If you needed a webpage, use the Plotly backend. Unicodeplots backend when you want text output. Or the GR default for the basics. With Julia v1.9 its startup time is much improved (and it's like sub second on v1.10 beta), which was its major complaint before. If you're going to use one plotting library and don't care too much about every little detail, then Plots.jl is a good one to go with. It's definitely not the best in any of the cases, animations are better in Makie, Latex is better in PGFPlotsX, etc., but it's capable everywhere.

Makie.jl is catching up and may be the default in the near future. It scales well and its getting all of the niceties of Plots.jl. I wouldn't learn it first if you're new to Julia (right now, though that will likely change by 2024). But if you need animations or want to add custom buttons to a window (make a quick GUI-like thing), Makie is unmatched. If it makes its standard plotting interface a bit simpler, gets a few more integrations, and thus matches Plots.jl in simplicity, it may hit a "best of most worlds" soon.

Otherwise it's a bit domain specific. If you were using Plots.jl and needed more flexibility for publication-quality plots, PGFPlotsX.jl can help. Or if you prefer grammar of graphics, AlgebraOfGraphics.jl is good. If you're a stats person you may find Gadfly or VegaLite familiar, though I wouldn't recommend them first because these don't satisfy general user needs (try making a plot of an FEM output and see what I mean).

All of these are pretty good. You have a lot of options. In the end, pick the one that suits your needs best.

Automatic Differentiation

Enzyme.jl, Zygote.jl, ...

Uncertanty propagation

MontecarloMeasurements.jl and Measurements-jl

Nonlinear numerical solvers

NonlinearSolve.jl, NLSolve.jl, Roots.jl, SIAMFANLEquations.jl

Machine learning

This section is concerned with general machine learning packages. A seperate section (link to section) exists for packages that only concern themselves with the sub-domain of Neural Networks.
MLJ.jl, SciKitLearn.jl KNet.jl, HorseML

Neural Networks

Flux.jl, Lux.jl, GradValley.jl

Notebooks

Notebooks are a type of Integrated Development Enviroment (IDE), and are particularly useful for sharing and showing computations.
Pluto.jl, IJulia.jl, Neptune.jl

The author of Pluto.jl gave a talk (YouTube link) at JupyterCon 2023, which features information about Pluto.jl and comparisons to Jupyter (IJulia.jl).

Multithreading/Accelerating loops

LoopVectorization.jl, Polyester.jl

Dataframes

A dataframe is a data structure used to hold tabular data.
DataFrames.jl, InMemoryDatasets.jl, JuliaDB.jl

Linear Solvers

LinearSolve.jl, Paradiso.jl, MLK.jl, BandedMatrices.jl...
See https://discourse.julialang.org/t/solving-sparse-linear-systems-fast/83071/9 for a relevant discussion

Serialization / Saving files

Jld.jl, JLD2.jl, Parquet.jl, Parquet2.jl

Redefinable structs

Redefining a struct in base julia requires restaring the julia process. This can incur significant recompilation time (though this is greatly reduced in Julia 1.9 and 1.10). These packages allow users to define structs that are redefinable.
ProtoStructs.jl and RedefStructsRedfineStructs.jl

See also Revise.jl for a different approach to struct redefinition.

Digital Signal Processing

DSP.jl, SignalsBase.jl, SampledSignals.jl, SignalAnalysis.jl

See also FFTW.jl

Machine Learning Datasets

OpenML.jl, MLDatasets.jl

Probabalistic Programming and Bayesian Inference

Turing.jl, Gen.jl, SOSS.jl, KissABC.jl, RxInfer.jl

Sampler

Hamiltonian Monte Carlo (gradient based)

Adaptive MCMC (without gradient)

Peak finding

By "peak" we refer to a numerical value larger than any immediate neighbour. A simple example is a vector such as [1, 2, 3, 1], which has a peak at it's third index. Functions also have peaks, but in a continous context. Multidimensional arrays/functions also have peaks, which are significantly harder to find.

Peaks.jl, FindPeaks.jl, Images.jl

Triangulations/Tessellations

Two common methods for partitioning space into individual elements are triangulations and tessellations. This section is dedicated to packages that implement such methods.

Short summary

DelaunayTriangulation.jl is the most supported package for Delaunay triangulations and Voronoi tessellations in two dimensions. Delaunator.jl might be faster for unconstrained triangulations if you do not need exact arithmetic, and if you do not need constrained tesselations. In higher dimensions, you need Delaunay.jl if $n > 3$, or TetGen.jl is great if $n=3$.

List of packages with short descriptions

Note that many of these are likely not maintained anymore - as of Sep 13, 2023, the last commit dates are, going from more to less recent: