From a1f110dca3ce77fa54123f78d86ef4c474f75f1a Mon Sep 17 00:00:00 2001 From: Aurora Rossi Date: Thu, 26 Dec 2024 20:14:59 +0100 Subject: [PATCH 1/2] Add traffic prediction --- .../docs/make_tutorials_literate.jl | 2 + .../docs/src/tutorials/traffic_prediction.md | 421 ++-- .../traffic_prediction.jl | 134 + .../traffic_prediction_pluto.jl | 2244 ----------------- 4 files changed, 402 insertions(+), 2399 deletions(-) create mode 100644 GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl delete mode 100644 GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction_pluto.jl diff --git a/GraphNeuralNetworks/docs/make_tutorials_literate.jl b/GraphNeuralNetworks/docs/make_tutorials_literate.jl index 660101f32..4bacf2de9 100644 --- a/GraphNeuralNetworks/docs/make_tutorials_literate.jl +++ b/GraphNeuralNetworks/docs/make_tutorials_literate.jl @@ -13,3 +13,5 @@ Literate.markdown("src_tutorials/introductory_tutorials/graph_classification.jl" Literate.markdown("src_tutorials/introductory_tutorials/temporal_graph_classification.jl", "src/tutorials/"; execute = true) + +Literate.markdown("src_tutorials/introductory_tutorials/traffic_prediction.jl", "src/tutorials/"; execute = true) diff --git a/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md b/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md index 338650dbf..74e4cf781 100644 --- a/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md +++ b/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md @@ -1,156 +1,198 @@ -```@raw html - - - - - -

Traffic Prediction using recurrent Temporal Graph Convolutional Network

In this tutorial, we will learn how to use a recurrent Temporal Graph Convolutional Network (TGCN) to predict traffic in a spatio-temporal setting. Traffic forecasting is the problem of predicting future traffic trends on a road network given historical traffic data, such as, in our case, traffic speed and time of day.

+# Traffic Prediction using recurrent Temporal Graph Convolutional Network +In this tutorial, we will learn how to use a recurrent Temporal Graph Convolutional Network (TGCN) to predict traffic in a spatio-temporal setting. Traffic forecasting is the problem of predicting future traffic trends on a road network given historical traffic data, such as, in our case, traffic speed and time of day. -``` ## Import -```@raw html -
-

We start by importing the necessary libraries. We use GraphNeuralNetworks.jl, Flux.jl and MLDatasets.jl, among others.

- -
begin
-    using GraphNeuralNetworks
-    using Flux
-    using Flux.Losses: mae
-    using MLDatasets: METRLA
-    using Statistics
-    using Plots
-end
+We start by importing the necessary libraries. We use `GraphNeuralNetworks.jl`, `Flux.jl` and `MLDatasets.jl`, among others. +````julia +using Flux, GraphNeuralNetworks +using Flux.Losses: mae +using MLDatasets: METRLA +using Statistics, Plots +```` -``` ## Dataset: METR-LA -```@raw html -
-

We use the METR-LA dataset from the paper Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting, which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edges represent the distances between the sensors.

-
dataset_metrla = METRLA(; num_timesteps = 3)
-
dataset METRLA:
-  graphs  =>    1-element Vector{MLDatasets.Graph}
+We use the `METR-LA` dataset from the paper [Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926.pdf), which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edges represent the distances between the sensors. -
 g = dataset_metrla[1]
-
Graph:
-  num_nodes   =>    207
-  num_edges   =>    1722
-  edge_index  =>    ("1722-element Vector{Int64}", "1722-element Vector{Int64}")
-  node_data   =>    (features = "34269-element Vector{Any}", targets = "34269-element Vector{Any}")
-  edge_data   =>    1722-element Vector{Float32}
+````julia +dataset_metrla = METRLA(; num_timesteps = 3) +```` +```` +dataset METRLA: + graphs => 1-element Vector{MLDatasets.Graph} +```` -

edge_data contains the weights of the edges of the graph and node_data contains a node feature vector and a target vector. The latter vectors contain batches of dimension num_timesteps, which means that they contain vectors with the node features and targets of num_timesteps time steps. Two consecutive batches are shifted by one-time step. The node features are the traffic speed of the sensors and the time of the day, and the targets are the traffic speed of the sensors in the next time step. Let's see some examples:

+````julia +g = dataset_metrla[1] +```` -
size(g.node_data.features[1])
-
(2, 207, 3)
+```` +Graph: + num_nodes => 207 + num_edges => 1722 + edge_index => ("1722-element Vector{Int64}", "1722-element Vector{Int64}") + node_data => (features = "34269-element Vector{Any}", targets = "34269-element Vector{Any}") + edge_data => 1722-element Vector{Float32} +```` +`edge_data` contains the weights of the edges of the graph and +`node_data` contains a node feature vector and a target vector. The latter vectors contain batches of dimension `num_timesteps`, which means that they contain vectors with the node features and targets of `num_timesteps` time steps. Two consecutive batches are shifted by one-time step. +The node features are the traffic speed of the sensors and the time of the day, and the targets are the traffic speed of the sensors in the next time step. +Let's see some examples: -

The first dimension correspond to the two features (first line the speed value and the second line the time of the day), the second to the nodes and the third to the number of timestep num_timesteps.

+````julia +features = map(x -> permutedims(x,(1,3,2)), g.node_data.features) -
size(g.node_data.targets[1])
-
(1, 207, 3)
+size(features[1]) +```` +```` +(2, 3, 207) +```` -

In the case of the targets the first dimension is 1 because they store just the speed value.

+The first dimension correspond to the two features (first line the speed value and the second line the time of the day), the second to the number of timestep `num_timesteps` and the third to the nodes. -
g.node_data.features[1][:,1,:]
-
2×3 Matrix{Float32}:
-  1.17081    1.11647   1.15888
- -0.876741  -0.87663  -0.87652
+````julia +targets = map(x -> permutedims(x,(1,3,2)), g.node_data.targets) -
g.node_data.features[2][:,1,:]
-
2×3 Matrix{Float32}:
-  1.11647   1.15888  -0.876741
- -0.87663  -0.87652  -0.87641
+size(targets[1]) +```` -
g.node_data.targets[1][:,1,:]
-
1×3 Matrix{Float32}:
- 1.11647  1.15888  -0.876741
+```` +(1, 3, 207) +```` -
function plot_data(data,sensor)
-    p = plot(legend=false, xlabel="Time (h)", ylabel="Normalized speed")
-    plotdata = []
-    for i in 1:3:length(data)
-        push!(plotdata,data[i][1,sensor,:])
-    end
-    plotdata = reduce(vcat,plotdata)
-    plot!(p, collect(1:length(data)), plotdata, color = :green, xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24]))
-    return p
-end
-
plot_data (generic function with 1 method)
- -
plot_data(g.node_data.features[1:288],1)
- +In the case of the targets the first dimension is 1 because they store just the speed value. +````julia +features[1][:,:,1] +```` -

Now let's construct the static graph, the temporal features and targets from the dataset.

+```` +2×3 Matrix{Float32}: + 1.17081 1.11647 1.15888 + -0.876741 -0.87663 -0.87652 +```` -
begin
-    graph = GNNGraph(g.edge_index; edata = g.edge_data, g.num_nodes)
-    features = g.node_data.features
-    targets = g.node_data.targets
-end;  
+````julia +features[2][:,:,1] +```` +```` +2×3 Matrix{Float32}: + 1.11647 1.15888 -0.876741 + -0.87663 -0.87652 -0.87641 +```` + +````julia +targets[1][:,:,1] +```` + +```` +1×3 Matrix{Float32}: + 1.11647 1.15888 -0.876741 +```` + +````julia +function plot_data(data,sensor) + p = plot(legend=false, xlabel="Time (h)", ylabel="Normalized speed") + plotdata = [] + for i in 1:3:length(data) + push!(plotdata,data[i][1,:,sensor]) + end + plotdata = reduce(vcat,plotdata) + plot!(p, collect(1:length(data)), plotdata, color = :green, xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) + return p +end + +plot_data(features[1:288],1) +```` +```@raw html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -

Now let's construct the train_loader and data_loader.

+``` -
begin
-    train_loader = zip(features[1:200], targets[1:200])
-    test_loader = zip(features[2001:2288], targets[2001:2288])
-end;
+Now let's construct the static graph, the `train_loader` and `data_loader`. +````julia +graph = GNNGraph(g.edge_index; edata = g.edge_data, g.num_nodes); +train_loader = zip(features[1:200], targets[1:200]); +test_loader = zip(features[2001:2288], targets[2001:2288]); +```` -``` ## Model: T-GCN -```@raw html -
-

We use the T-GCN model from the paper T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction, which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). The GCN is used to capture spatial features from the graph, and the GRU is used to capture temporal features from the feature time series.

-
model = GNNChain(TGCN(2 => 100), Dense(100, 1))
-
GNNChain(Recur(TGCNCell(2 => 100)), Dense(100 => 1))
+We use the T-GCN model from the paper [T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction] (https://arxiv.org/pdf/1811.05320.pdf), which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). The GCN is used to capture spatial features from the graph, and the GRU is used to capture temporal features from the feature time series. +````julia +model = GNNChain(TGCN(2 => 100; add_self_loops = false), Dense(100, 1)) +```` -

+```` +GNNChain( + GNNRecurrence( + TGCNCell(2 => 100), # 91_500 parameters + ), + Dense(100 => 1), # 101 parameters +) # Total: 20 arrays, 91_601 parameters, 359.926 KiB. +```` +![](https://www.researchgate.net/profile/Haifeng-Li-3/publication/335353434/figure/fig4/AS:851870352437249@1580113127759/The-architecture-of-the-Gated-Recurrent-Unit-model.jpg) -``` ## Training -```@raw html -
-

We train the model for 100 epochs, using the Adam optimizer with a learning rate of 0.001. We use the mean absolute error (MAE) as the loss function.

-
function train(graph, train_loader, model)
+We train the model for 100 epochs, using the Adam optimizer with a learning rate of 0.001. We use the mean absolute error (MAE) as the loss function.
+
+````julia
+function train(graph, train_loader, model)
 
     opt = Flux.setup(Adam(0.001), model)
 
@@ -159,58 +201,127 @@ end;
x, y = (x, y) grads = Flux.gradient(model) do model ŷ = model(graph, x) - Flux.mae(ŷ, y) + Flux.mae(ŷ, y) end Flux.update!(opt, model, grads[1]) - end - - if epoch % 10 == 0 - loss = mean([Flux.mae(model(graph,x), y) for (x, y) in train_loader]) - @show epoch, loss - end + end + + if epoch % 10 == 0 + loss = mean([Flux.mae(model(graph,x), y) for (x, y) in train_loader]) + @show epoch, loss + end end return model -end -
train (generic function with 1 method)
- -
train(graph, train_loader, model)
-
GNNChain(Recur(TGCNCell(2 => 100)), Dense(100 => 1))
- -
function plot_predicted_data(graph,features,targets, sensor)
-    p = plot(xlabel="Time (h)", ylabel="Normalized speed")
-    prediction = []
-    grand_truth = []
-    for i in 1:3:length(features)
-        push!(grand_truth,targets[i][1,sensor,:])
-        push!(prediction, model(graph, features[i])[1,sensor,:]) 
-    end
-    prediction = reduce(vcat,prediction)
-    grand_truth = reduce(vcat, grand_truth)
-    plot!(p, collect(1:length(features)), grand_truth, color = :blue, label = "Grand Truth", xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24]))
-    plot!(p, collect(1:length(features)), prediction, color = :red, label= "Prediction")
-    return p
-end
-
plot_predicted_data (generic function with 1 method)
+end + +train(graph, train_loader, model) +```` + +```` +GNNChain( + GNNRecurrence( + TGCNCell(2 => 100), # 91_500 parameters + ), + Dense(100 => 1), # 101 parameters +) # Total: 20 arrays, 91_601 parameters, 359.926 KiB. +```` + +````julia +function plot_predicted_data(graph, features, targets, sensor) + p = plot(xlabel="Time (h)", ylabel="Normalized speed") + prediction = [] + grand_truth = [] + for i in 1:3:length(features) + push!(grand_truth,targets[i][1,:,sensor]) + push!(prediction, model(graph, features[i])[1,:,sensor]) + end + prediction = reduce(vcat,prediction) + grand_truth = reduce(vcat, grand_truth) + plot!(p, collect(1:length(features)), grand_truth, color = :blue, label = "Grand Truth", xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) + plot!(p, collect(1:length(features)), prediction, color = :red, label= "Prediction") + return p +end + +plot_predicted_data(graph,features[301:588],targets[301:588], 1) +```` -
plot_predicted_data(graph,features[301:588],targets[301:588], 1)
- +```@raw html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
accuracy(ŷ, y) = 1 - Statistics.norm(y-ŷ)/Statistics.norm(y)
-
accuracy (generic function with 1 method)
+``` -
mean([accuracy(model(graph,x), y) for (x, y) in test_loader])
-
0.47803628f0
+````julia +accuracy(ŷ, y) = 1 - Statistics.norm(y-ŷ)/Statistics.norm(y) +```` +```` +accuracy (generic function with 1 method) +```` -

The accuracy is not very good but can be improved by training using more data. We used a small subset of the dataset for this tutorial because of the computational cost of training the model. From the plot of the predictions, we can see that the model is able to capture the general trend of the traffic speed, but it is not able to capture the peaks of the traffic.

+Test accuracy: +````julia +mean([accuracy(model(graph,x), y) for (x, y) in test_loader]) +```` + +```` +0.3951533f0 +```` + +The accuracy is not very good but can be improved by training using more data. We used a small subset of the dataset for this tutorial because of the computational cost of training the model. From the plot of the predictions, we can see that the model is able to capture the general trend of the traffic speed, but it is not able to capture the peaks of the traffic. -``` ## Conclusion -```@raw html -
-

In this tutorial, we learned how to use a recurrent temporal graph convolutional network to predict traffic in a spatio-temporal setting. We used the TGCN model, which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). We then trained the model for 100 epochs on a small subset of the METR-LA dataset. The accuracy of the model is not very good, but it can be improved by training on more data.

- -``` +In this tutorial, we learned how to use a recurrent temporal graph convolutional network to predict traffic in a spatio-temporal setting. We used the TGCN model, which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). We then trained the model for 100 epochs on a small subset of the METR-LA dataset. The accuracy of the model is not very good, but it can be improved by training on more data. + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* diff --git a/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl b/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl new file mode 100644 index 000000000..ac4392bb2 --- /dev/null +++ b/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl @@ -0,0 +1,134 @@ +# # Traffic Prediction using recurrent Temporal Graph Convolutional Network + +# In this tutorial, we will learn how to use a recurrent Temporal Graph Convolutional Network (TGCN) to predict traffic in a spatio-temporal setting. Traffic forecasting is the problem of predicting future traffic trends on a road network given historical traffic data, such as, in our case, traffic speed and time of day. + +# ## Import + +# We start by importing the necessary libraries. We use `GraphNeuralNetworks.jl`, `Flux.jl` and `MLDatasets.jl`, among others. + +using Flux, GraphNeuralNetworks +using Flux.Losses: mae +using MLDatasets: METRLA +using Statistics, Plots + +# ## Dataset: METR-LA + +# We use the `METR-LA` dataset from the paper [Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926.pdf), which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edges represent the distances between the sensors. + +dataset_metrla = METRLA(; num_timesteps = 3) +# +g = dataset_metrla[1] + + +# `edge_data` contains the weights of the edges of the graph and +# `node_data` contains a node feature vector and a target vector. The latter vectors contain batches of dimension `num_timesteps`, which means that they contain vectors with the node features and targets of `num_timesteps` time steps. Two consecutive batches are shifted by one-time step. +# The node features are the traffic speed of the sensors and the time of the day, and the targets are the traffic speed of the sensors in the next time step. +# Let's see some examples: + +features = map(x -> permutedims(x,(1,3,2)), g.node_data.features) + +size(features[1]) + +# The first dimension correspond to the two features (first line the speed value and the second line the time of the day), the second to the number of timestep `num_timesteps` and the third to the nodes. + +targets = map(x -> permutedims(x,(1,3,2)), g.node_data.targets) + +size(targets[1]) + +# In the case of the targets the first dimension is 1 because they store just the speed value. + +features[1][:,:,1] + +# +features[2][:,:,1] + +# +targets[1][:,:,1] + +# +function plot_data(data,sensor) + p = plot(legend=false, xlabel="Time (h)", ylabel="Normalized speed") + plotdata = [] + for i in 1:3:length(data) + push!(plotdata,data[i][1,:,sensor]) + end + plotdata = reduce(vcat,plotdata) + plot!(p, collect(1:length(data)), plotdata, color = :green, xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) + return p +end + +plot_data(features[1:288],1) + +# Now let's construct the static graph, the `train_loader` and `data_loader`. + +graph = GNNGraph(g.edge_index; edata = g.edge_data, g.num_nodes); + +train_loader = zip(features[1:200], targets[1:200]); +test_loader = zip(features[2001:2288], targets[2001:2288]); + +# ## Model: T-GCN + +# We use the T-GCN model from the paper [T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction] (https://arxiv.org/pdf/1811.05320.pdf), which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). The GCN is used to capture spatial features from the graph, and the GRU is used to capture temporal features from the feature time series. + +model = GNNChain(TGCN(2 => 100; add_self_loops = false), Dense(100, 1)) + +# ![](https://www.researchgate.net/profile/Haifeng-Li-3/publication/335353434/figure/fig4/AS:851870352437249@1580113127759/The-architecture-of-the-Gated-Recurrent-Unit-model.jpg) + +# ## Training + +# We train the model for 100 epochs, using the Adam optimizer with a learning rate of 0.001. We use the mean absolute error (MAE) as the loss function. + +function train(graph, train_loader, model) + + opt = Flux.setup(Adam(0.001), model) + + for epoch in 1:100 + for (x, y) in train_loader + x, y = (x, y) + grads = Flux.gradient(model) do model + ŷ = model(graph, x) + Flux.mae(ŷ, y) + end + Flux.update!(opt, model, grads[1]) + end + + if epoch % 10 == 0 + loss = mean([Flux.mae(model(graph,x), y) for (x, y) in train_loader]) + @show epoch, loss + end + end + return model +end + +train(graph, train_loader, model) + +# +function plot_predicted_data(graph, features, targets, sensor) + p = plot(xlabel="Time (h)", ylabel="Normalized speed") + prediction = [] + grand_truth = [] + for i in 1:3:length(features) + push!(grand_truth,targets[i][1,:,sensor]) + push!(prediction, model(graph, features[i])[1,:,sensor]) + end + prediction = reduce(vcat,prediction) + grand_truth = reduce(vcat, grand_truth) + plot!(p, collect(1:length(features)), grand_truth, color = :blue, label = "Grand Truth", xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) + plot!(p, collect(1:length(features)), prediction, color = :red, label= "Prediction") + return p +end + +plot_predicted_data(graph,features[301:588],targets[301:588], 1) + +# +accuracy(ŷ, y) = 1 - Statistics.norm(y-ŷ)/Statistics.norm(y) +# Test accuracy: +mean([accuracy(model(graph,x), y) for (x, y) in test_loader]) + + +# The accuracy is not very good but can be improved by training using more data. We used a small subset of the dataset for this tutorial because of the computational cost of training the model. From the plot of the predictions, we can see that the model is able to capture the general trend of the traffic speed, but it is not able to capture the peaks of the traffic. + +# ## Conclusion + +# In this tutorial, we learned how to use a recurrent temporal graph convolutional network to predict traffic in a spatio-temporal setting. We used the TGCN model, which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). We then trained the model for 100 epochs on a small subset of the METR-LA dataset. The accuracy of the model is not very good, but it can be improved by training on more data. + diff --git a/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction_pluto.jl b/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction_pluto.jl deleted file mode 100644 index d259aee24..000000000 --- a/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction_pluto.jl +++ /dev/null @@ -1,2244 +0,0 @@ -### A Pluto.jl notebook ### -# v0.19.45 - -#> [frontmatter] -#> author = "[Aurora Rossi](https://github.com/aurorarossi)" -#> title = "Traffic Prediction using recurrent Temporal Graph Convolutional Network" -#> date = "2023-08-21" -#> description = "Traffic Prediction using GraphNeuralNetworks.jl" -#> cover = "assets/traffic.gif" - -using Markdown -using InteractiveUtils - -# ╔═╡ 1f95ad97-a007-4724-84db-392b0026e1a4 -begin - using GraphNeuralNetworks - using Flux - using Flux.Losses: mae - using MLDatasets: METRLA - using Statistics - using Plots -end - -# ╔═╡ 5fdab668-4003-11ee-33f5-3953225b0c0f -md" -# Traffic Prediction using recurrent Temporal Graph Convolutional Network - -In this tutorial, we will learn how to use a recurrent Temporal Graph Convolutional Network (TGCN) to predict traffic in a spatio-temporal setting. Traffic forecasting is the problem of predicting future traffic trends on a road network given historical traffic data, such as, in our case, traffic speed and time of day. -" - -# ╔═╡ 3dd0ce32-2339-4d5a-9a6f-1f662bc5500b -md" -## Import - -We start by importing the necessary libraries. We use `GraphNeuralNetworks.jl`, `Flux.jl` and `MLDatasets.jl`, among others. -" - -# ╔═╡ ec5caeb6-1f95-4cb9-8739-8cadba29a22d -md" -## Dataset: METR-LA - -We use the `METR-LA` dataset from the paper [Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926.pdf), which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edges represent the distances between the sensors. -" - -# ╔═╡ f531e39c-6842-494a-b4ac-8904321098c9 -dataset_metrla = METRLA(; num_timesteps = 3) - -# ╔═╡ d5ebf9aa-cec8-4417-baaf-f2e8e19f1cad - g = dataset_metrla[1] - -# ╔═╡ dc2d5e98-2201-4754-bfc6-8ed2bbb82153 -md" -`edge_data` contains the weights of the edges of the graph and -`node_data` contains a node feature vector and a target vector. The latter vectors contain batches of dimension `num_timesteps`, which means that they contain vectors with the node features and targets of `num_timesteps` time steps. Two consecutive batches are shifted by one-time step. -The node features are the traffic speed of the sensors and the time of the day, and the targets are the traffic speed of the sensors in the next time step. -Let's see some examples: -" - -# ╔═╡ 0dde5fd3-72d0-4b15-afb3-9a5b102327c9 -size(g.node_data.features[1]) - -# ╔═╡ f7a6d572-28cf-4d69-a9be-d49f367eca37 -md" -The first dimension correspond to the two features (first line the speed value and the second line the time of the day), the second to the nodes and the third to the number of timestep `num_timesteps`. -" - -# ╔═╡ 3d5503bc-bb97-422e-9465-becc7d3dbe07 -size(g.node_data.targets[1]) - -# ╔═╡ 3569715d-08f5-4605-b946-9ef7ccd86ae5 -md" -In the case of the targets the first dimension is 1 because they store just the speed value. -" - -# ╔═╡ aa4eb172-2a42-4c01-a6ef-c6c95208d5b2 -g.node_data.features[1][:,1,:] - -# ╔═╡ 367ed417-4f53-44d4-8135-0c91c842a75f -g.node_data.features[2][:,1,:] - -# ╔═╡ 7c084eaa-655c-4251-a342-6b6f4df76ddb -g.node_data.targets[1][:,1,:] - -# ╔═╡ bf0d820d-32c0-4731-8053-53d5d499e009 -function plot_data(data,sensor) - p = plot(legend=false, xlabel="Time (h)", ylabel="Normalized speed") - plotdata = [] - for i in 1:3:length(data) - push!(plotdata,data[i][1,sensor,:]) - end - plotdata = reduce(vcat,plotdata) - plot!(p, collect(1:length(data)), plotdata, color = :green, xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) - return p -end - -# ╔═╡ cb89d1a3-b4ff-421a-8717-a0b7f21dea1a -plot_data(g.node_data.features[1:288],1) - -# ╔═╡ 3b49a612-3a04-4eb5-bfbc-360614f4581a -md" -Now let's construct the static graph, the temporal features and targets from the dataset. -" - -# ╔═╡ 95d8bd24-a40d-409f-a1e7-4174428ef860 -begin - graph = GNNGraph(g.edge_index; edata = g.edge_data, g.num_nodes) - features = g.node_data.features - targets = g.node_data.targets -end; - -# ╔═╡ fde2ac9e-b121-4105-8428-1820b9c17a43 -md" -Now let's construct the `train_loader` and `data_loader`. -" - - -# ╔═╡ 111b7d5d-c7e3-44c0-9e5e-2ed1a86854d3 -begin - train_loader = zip(features[1:200], targets[1:200]) - test_loader = zip(features[2001:2288], targets[2001:2288]) -end; - -# ╔═╡ 572a6633-875b-4d7e-9afc-543b442948fb -md" -## Model: T-GCN - -We use the T-GCN model from the paper [T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction] (https://arxiv.org/pdf/1811.05320.pdf), which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). The GCN is used to capture spatial features from the graph, and the GRU is used to capture temporal features from the feature time series. -" - -# ╔═╡ 5502f4fa-3201-4980-b766-2ab88b175b11 -model = GNNChain(TGCN(2 => 100), Dense(100, 1)) - -# ╔═╡ 4a1ec34a-1092-4b4a-b8a8-bd91939ffd9e -md" -![](https://www.researchgate.net/profile/Haifeng-Li-3/publication/335353434/figure/fig4/AS:851870352437249@1580113127759/The-architecture-of-the-Gated-Recurrent-Unit-model.jpg) -" - -# ╔═╡ 755a88c2-c2e5-46d1-9582-af4b2c5a6bbd -md" -## Training - -We train the model for 100 epochs, using the Adam optimizer with a learning rate of 0.001. We use the mean absolute error (MAE) as the loss function. -" - -# ╔═╡ e83253b2-9f3a-44e2-a747-cce1661657c4 -function train(graph, train_loader, model) - - opt = Flux.setup(Adam(0.001), model) - - for epoch in 1:100 - for (x, y) in train_loader - x, y = (x, y) - grads = Flux.gradient(model) do model - ŷ = model(graph, x) - Flux.mae(ŷ, y) - end - Flux.update!(opt, model, grads[1]) - end - - if epoch % 10 == 0 - loss = mean([Flux.mae(model(graph,x), y) for (x, y) in train_loader]) - @show epoch, loss - end - end - return model -end - -# ╔═╡ 85a923da-3027-4f71-8db6-96852c115c03 -train(graph, train_loader, model) - -# ╔═╡ 39c82234-97ea-48d6-98dd-915f072b7f85 -function plot_predicted_data(graph,features,targets, sensor) - p = plot(xlabel="Time (h)", ylabel="Normalized speed") - prediction = [] - grand_truth = [] - for i in 1:3:length(features) - push!(grand_truth,targets[i][1,sensor,:]) - push!(prediction, model(graph, features[i])[1,sensor,:]) - end - prediction = reduce(vcat,prediction) - grand_truth = reduce(vcat, grand_truth) - plot!(p, collect(1:length(features)), grand_truth, color = :blue, label = "Grand Truth", xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) - plot!(p, collect(1:length(features)), prediction, color = :red, label= "Prediction") - return p -end - -# ╔═╡ 8c3a903b-2c8a-4d4f-8eef-74d5611f2ce4 -plot_predicted_data(graph,features[301:588],targets[301:588], 1) - -# ╔═╡ 2c5f6250-ee7a-41b1-9551-bcfeba83ca8b -accuracy(ŷ, y) = 1 - Statistics.norm(y-ŷ)/Statistics.norm(y) - -# ╔═╡ 1008dad4-d784-4c38-a7cf-d9b64728e28d -mean([accuracy(model(graph,x), y) for (x, y) in test_loader]) - -# ╔═╡ 8d0e8b9f-226f-4bff-9deb-046e6a897b71 -md"The accuracy is not very good but can be improved by training using more data. We used a small subset of the dataset for this tutorial because of the computational cost of training the model. From the plot of the predictions, we can see that the model is able to capture the general trend of the traffic speed, but it is not able to capture the peaks of the traffic." - -# ╔═╡ a7e4bb23-6687-476a-a0c2-1b2736873d9d -md" -## Conclusion - -In this tutorial, we learned how to use a recurrent temporal graph convolutional network to predict traffic in a spatio-temporal setting. We used the TGCN model, which consists of a graph convolutional network (GCN) and a gated recurrent unit (GRU). We then trained the model for 100 epochs on a small subset of the METR-LA dataset. The accuracy of the model is not very good, but it can be improved by training on more data. -" - -# ╔═╡ 00000000-0000-0000-0000-000000000001 -PLUTO_PROJECT_TOML_CONTENTS = """ -[deps] -Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" -GraphNeuralNetworks = "cffab07f-9bc2-4db1-8861-388f63bf7694" -MLDatasets = "eb30cadb-4394-5ae3-aed4-317e484a6458" -Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[compat] -Flux = "~0.14.16" -GraphNeuralNetworks = "~0.6.19" -MLDatasets = "~0.7.16" -Plots = "~1.40.5" -""" - -# ╔═╡ 00000000-0000-0000-0000-000000000002 -PLUTO_MANIFEST_TOML_CONTENTS = """ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.10.4" -manifest_format = "2.0" -project_hash = "8742c1fb8ae152ad31b34471cf90f234c1b8b06c" - -[[deps.AbstractFFTs]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.5.0" -weakdeps = ["ChainRulesCore", "Test"] - - [deps.AbstractFFTs.extensions] - AbstractFFTsChainRulesCoreExt = "ChainRulesCore" - AbstractFFTsTestExt = "Test" - -[[deps.Accessors]] -deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"] -git-tree-sha1 = "f61b15be1d76846c0ce31d3fcfac5380ae53db6a" -uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" -version = "0.1.37" - - [deps.Accessors.extensions] - AccessorsAxisKeysExt = "AxisKeys" - AccessorsIntervalSetsExt = "IntervalSets" - AccessorsStaticArraysExt = "StaticArrays" - AccessorsStructArraysExt = "StructArrays" - AccessorsUnitfulExt = "Unitful" - - [deps.Accessors.weakdeps] - AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - Requires = "ae029012-a4dd-5104-9daa-d747884805df" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.4" -weakdeps = ["StaticArrays"] - - [deps.Adapt.extensions] - AdaptStaticArraysExt = "StaticArrays" - -[[deps.ArgCheck]] -git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4" -uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" -version = "2.3.0" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.1" - -[[deps.ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.4.0" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[deps.Atomix]] -deps = ["UnsafeAtomics"] -git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" -uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" -version = "0.1.0" - -[[deps.AtomsBase]] -deps = ["LinearAlgebra", "PeriodicTable", "Printf", "Requires", "StaticArrays", "Unitful", "UnitfulAtomic"] -git-tree-sha1 = "995c2b6b17840cd87b722ce9c6cdd72f47bab545" -uuid = "a963bdd2-2df7-4f54-a1ee-49d51e6be12a" -version = "0.3.5" - -[[deps.BFloat16s]] -deps = ["LinearAlgebra", "Printf", "Random", "Test"] -git-tree-sha1 = "2c7cc21e8678eff479978a0a2ef5ce2f51b63dff" -uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" -version = "0.5.0" - -[[deps.BangBang]] -deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires"] -git-tree-sha1 = "e2144b631226d9eeab2d746ca8880b7ccff504ae" -uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" -version = "0.4.3" - - [deps.BangBang.extensions] - BangBangChainRulesCoreExt = "ChainRulesCore" - BangBangDataFramesExt = "DataFrames" - BangBangStaticArraysExt = "StaticArrays" - BangBangStructArraysExt = "StructArrays" - BangBangTablesExt = "Tables" - BangBangTypedTablesExt = "TypedTables" - - [deps.BangBang.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" - TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[deps.Baselet]] -git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" -uuid = "9718e550-a3fa-408a-8086-8db961cd8217" -version = "0.1.1" - -[[deps.BitFlags]] -git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" -uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" -version = "0.1.9" - -[[deps.BufferedStreams]] -git-tree-sha1 = "4ae47f9a4b1dc19897d3743ff13685925c5202ec" -uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d" -version = "1.2.1" - -[[deps.Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+1" - -[[deps.CEnum]] -git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.5.0" - -[[deps.CSV]] -deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] -git-tree-sha1 = "6c834533dc1fabd820c1db03c839bf97e45a3fab" -uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -version = "0.10.14" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "a2f1c8c668c8e3cb4cca4e57a8efdb09067bb3fd" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.0+2" - -[[deps.ChainRules]] -deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] -git-tree-sha1 = "227985d885b4dbce5e18a96f9326ea1e836e5a03" -uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" -version = "1.69.0" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "71acdbf594aab5bbb2cec89b208c41b4c411e49f" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.24.0" -weakdeps = ["SparseArrays"] - - [deps.ChainRulesCore.extensions] - ChainRulesCoreSparseArraysExt = "SparseArrays" - -[[deps.Chemfiles]] -deps = ["AtomsBase", "Chemfiles_jll", "DocStringExtensions", "PeriodicTable", "Unitful", "UnitfulAtomic"] -git-tree-sha1 = "82fe5e341c793cb51149d993307da9543824b206" -uuid = "46823bd8-5fb3-5f92-9aa0-96921f3dd015" -version = "0.10.41" - -[[deps.Chemfiles_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f3743181e30d87c23d9c8ebd493b77f43d8f1890" -uuid = "78a364fa-1a3c-552a-b4bb-8fa0f9c1fcca" -version = "0.10.4+0" - -[[deps.CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "b8fe8546d52ca154ac556809e10c75e6e7430ac8" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.5" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "b5278586822443594ff615963b0c09755771b3e0" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.26.0" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.5" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" -weakdeps = ["SpecialFunctions"] - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.11" - -[[deps.CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[deps.Compat]] -deps = ["TOML", "UUIDs"] -git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.15.0" -weakdeps = ["Dates", "LinearAlgebra"] - - [deps.Compat.extensions] - CompatLinearAlgebraExt = "LinearAlgebra" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.1+0" - -[[deps.CompositionsBase]] -git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" -uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" -version = "0.1.2" -weakdeps = ["InverseFunctions"] - - [deps.CompositionsBase.extensions] - CompositionsBaseInverseFunctionsExt = "InverseFunctions" - -[[deps.ConcurrentUtilities]] -deps = ["Serialization", "Sockets"] -git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" -uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.4.2" - -[[deps.ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "d8a9c0b6ac2d9081bf76324b39c78ca3ce4f0c98" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.6" - - [deps.ConstructionBase.extensions] - ConstructionBaseIntervalSetsExt = "IntervalSets" - ConstructionBaseStaticArraysExt = "StaticArrays" - - [deps.ConstructionBase.weakdeps] - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.ContextVariablesX]] -deps = ["Compat", "Logging", "UUIDs"] -git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" -uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" -version = "0.1.3" - -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" - -[[deps.Crayons]] -git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" -uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" -version = "4.1.1" - -[[deps.DataAPI]] -git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.16.0" - -[[deps.DataDeps]] -deps = ["HTTP", "Libdl", "Reexport", "SHA", "Scratch", "p7zip_jll"] -git-tree-sha1 = "8ae085b71c462c2cb1cfedcb10c3c877ec6cf03f" -uuid = "124859b0-ceae-595e-8997-d05f6a7a8dfe" -version = "0.7.13" - -[[deps.DataFrames]] -deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] -git-tree-sha1 = "04c738083f29f86e62c8afc341f0967d8717bdb8" -uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -version = "1.6.1" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.20" - -[[deps.DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[deps.DefineSingletons]] -git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" -uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" -version = "0.1.2" - -[[deps.DelimitedFiles]] -deps = ["Mmap"] -git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" -version = "1.9.1" - -[[deps.DiffResults]] -deps = ["StaticArraysCore"] -git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.1.0" - -[[deps.DiffRules]] -deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.15.1" - -[[deps.Distances]] -deps = ["LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.11" -weakdeps = ["ChainRulesCore", "SparseArrays"] - - [deps.Distances.extensions] - DistancesChainRulesCoreExt = "ChainRulesCore" - DistancesSparseArraysExt = "SparseArrays" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[deps.DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.3" - -[[deps.Downloads]] -deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" - -[[deps.EpollShim_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" -uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" -version = "0.0.20230411+0" - -[[deps.ExceptionUnwrapping]] -deps = ["Test"] -git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" -uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" -version = "0.1.10" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.6.2+0" - -[[deps.FFMPEG]] -deps = ["FFMPEG_jll"] -git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" -uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.1" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.4+1" - -[[deps.FLoops]] -deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] -git-tree-sha1 = "0a2e5873e9a5f54abb06418d57a8df689336a660" -uuid = "cc61a311-1640-44b5-9fba-1b764f453329" -version = "0.2.2" - -[[deps.FLoopsBase]] -deps = ["ContextVariablesX"] -git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" -uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" -version = "0.1.1" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.16.3" - -[[deps.FilePathsBase]] -deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] -git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa" -uuid = "48062228-2e41-5def-b9a4-89aafe57970f" -version = "0.9.21" - -[[deps.FileWatching]] -uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" - -[[deps.FillArrays]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "0653c0a2396a6da5bc4766c43041ef5fd3efbe57" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.11.0" - - [deps.FillArrays.extensions] - FillArraysPDMatsExt = "PDMats" - FillArraysSparseArraysExt = "SparseArrays" - FillArraysStatisticsExt = "Statistics" - - [deps.FillArrays.weakdeps] - PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.5" - -[[deps.Flux]] -deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"] -git-tree-sha1 = "edacf029ed6276301e455e34d7ceeba8cc34078a" -uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c" -version = "0.14.16" - - [deps.Flux.extensions] - FluxAMDGPUExt = "AMDGPU" - FluxCUDAExt = "CUDA" - FluxCUDAcuDNNExt = ["CUDA", "cuDNN"] - FluxMetalExt = "Metal" - - [deps.Flux.weakdeps] - AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - Metal = "dde4c033-4e86-420c-a63e-0dd931031962" - cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] -git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.96+0" - -[[deps.Format]] -git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" -uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" -version = "1.3.7" - -[[deps.ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.36" -weakdeps = ["StaticArrays"] - - [deps.ForwardDiff.extensions] - ForwardDiffStaticArraysExt = "StaticArrays" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.2+0" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.14+0" - -[[deps.Functors]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "8a66c07630d6428eaab3506a0eabfcf4a9edea05" -uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" -version = "0.4.11" - -[[deps.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] -git-tree-sha1 = "3f74912a156096bd8fdbef211eff66ab446e7297" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.4.0+0" - -[[deps.GPUArrays]] -deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] -git-tree-sha1 = "a74c3f1cf56a3dfcdef0605f8cdb7015926aae30" -uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "10.3.0" - -[[deps.GPUArraysCore]] -deps = ["Adapt"] -git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950" -uuid = "46192b85-c4d5-4398-a991-12ede77f4527" -version = "0.1.6" - -[[deps.GR]] -deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] -git-tree-sha1 = "629693584cef594c3f6f99e76e7a7ad17e60e8d5" -uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.73.7" - -[[deps.GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "a8863b69c2a0859f2c2c87ebdc4c6712e88bdf0d" -uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.73.7+0" - -[[deps.GZip]] -deps = ["Libdl", "Zlib_jll"] -git-tree-sha1 = "0085ccd5ec327c077ec5b91a5f937b759810ba62" -uuid = "92fee26a-97fe-5a0c-ad85-20a5f3185b63" -version = "0.6.2" - -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.80.2+0" - -[[deps.Glob]] -git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" -uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" -version = "1.3.1" - -[[deps.GraphNeuralNetworks]] -deps = ["Adapt", "ChainRulesCore", "DataStructures", "Flux", "Functors", "Graphs", "KrylovKit", "LinearAlgebra", "MLUtils", "MacroTools", "NNlib", "NearestNeighbors", "Random", "Reexport", "SparseArrays", "Statistics", "StatsBase"] -git-tree-sha1 = "6716650d17bf36a41921c679c4d046ac375d5907" -uuid = "cffab07f-9bc2-4db1-8861-388f63bf7694" -version = "0.6.19" - - [deps.GraphNeuralNetworks.extensions] - GraphNeuralNetworksCUDAExt = "CUDA" - GraphNeuralNetworksSimpleWeightedGraphsExt = "SimpleWeightedGraphs" - - [deps.GraphNeuralNetworks.weakdeps] - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - SimpleWeightedGraphs = "47aef6b3-ad0c-573a-a1e2-d07658019622" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.14+0" - -[[deps.Graphs]] -deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "ebd18c326fa6cee1efb7da9a3b45cf69da2ed4d9" -uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.11.2" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HDF5]] -deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] -git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c" -uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -version = "0.17.2" - - [deps.HDF5.extensions] - MPIExt = "MPI" - - [deps.HDF5.weakdeps] - MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" - -[[deps.HDF5_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "38c8874692d48d5440d5752d6c74b0c6b0b60739" -uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.2+1" - -[[deps.HTTP]] -deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.8" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] -git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "2.8.1+1" - -[[deps.Hwloc_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "5e19e1e4fa3e71b774ce746274364aef0234634e" -uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.11.1+0" - -[[deps.IRTools]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "950c3717af761bc3ff906c2e8e52bd83390b6ec2" -uuid = "7869d1d1-7146-5819-86e3-90919afe41df" -version = "0.4.14" - -[[deps.ImageBase]] -deps = ["ImageCore", "Reexport"] -git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" -uuid = "c817782e-172a-44cc-b673-b171935fbb9e" -version = "0.1.7" - -[[deps.ImageCore]] -deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] -git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" -uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.10.2" - -[[deps.ImageShow]] -deps = ["Base64", "ColorSchemes", "FileIO", "ImageBase", "ImageCore", "OffsetArrays", "StackViews"] -git-tree-sha1 = "3b5344bcdbdc11ad58f3b1956709b5b9345355de" -uuid = "4e3cecfd-b093-5904-9786-8bbb286a6a31" -version = "0.3.8" - -[[deps.Inflate]] -git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.5" - -[[deps.InitialValues]] -git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" -uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" -version = "0.3.1" - -[[deps.InlineStrings]] -git-tree-sha1 = "45521d31238e87ee9f9732561bfee12d4eebd52d" -uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" -version = "1.4.2" - - [deps.InlineStrings.extensions] - ArrowTypesExt = "ArrowTypes" - ParsersExt = "Parsers" - - [deps.InlineStrings.weakdeps] - ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" - Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[deps.InternedStrings]] -deps = ["Random", "Test"] -git-tree-sha1 = "eb05b5625bc5d821b8075a77e4c421933e20c76b" -uuid = "7d512f48-7fb1-5a58-b986-67e6dc259f01" -version = "0.7.0" - -[[deps.InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "18c59411ece4838b18cd7f537e56cf5e41ce5bfd" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.15" -weakdeps = ["Dates"] - - [deps.InverseFunctions.extensions] - DatesExt = "Dates" - -[[deps.InvertedIndices]] -git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" -uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" -version = "1.3.0" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.2" - -[[deps.IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[deps.JLD2]] -deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Reexport", "Requires", "TranscodingStreams", "UUIDs", "Unicode"] -git-tree-sha1 = "5fe858cb863e211c6dedc8cce2dc0752d4ab6e2b" -uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.4.50" - -[[deps.JLFzf]] -deps = ["Pipe", "REPL", "Random", "fzf_jll"] -git-tree-sha1 = "a53ebe394b71470c7f97c2e7e170d51df21b17af" -uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" -version = "0.1.7" - -[[deps.JLLWrappers]] -deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" - -[[deps.JSON3]] -deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] -git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b" -uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" -version = "1.14.0" - - [deps.JSON3.extensions] - JSON3ArrowExt = ["ArrowTypes"] - - [deps.JSON3.weakdeps] - ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.0.3+0" - -[[deps.JuliaVariables]] -deps = ["MLStyle", "NameResolution"] -git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" -uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" -version = "0.2.4" - -[[deps.KernelAbstractions]] -deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] -git-tree-sha1 = "d0448cebd5919e06ca5edc7a264631790de810ec" -uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.9.22" - - [deps.KernelAbstractions.extensions] - EnzymeExt = "EnzymeCore" - - [deps.KernelAbstractions.weakdeps] - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - -[[deps.KrylovKit]] -deps = ["ChainRulesCore", "GPUArraysCore", "LinearAlgebra", "Printf", "VectorInterface"] -git-tree-sha1 = "3f3a92bbe8f568b689a7f7bc193f7c717d793751" -uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" -version = "0.7.1" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.2+0" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "3.0.0+1" - -[[deps.LLVM]] -deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"] -git-tree-sha1 = "020abd49586480c1be84f57da0017b5d3db73f7c" -uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "8.0.0" -weakdeps = ["BFloat16s"] - - [deps.LLVM.extensions] - BFloat16sExt = "BFloat16s" - -[[deps.LLVMExtra_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "c2636c264861edc6d305e6b4d528f09566d24c5e" -uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.30+0" - -[[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" -uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "15.0.7+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.2+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.1" - -[[deps.Latexify]] -deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] -git-tree-sha1 = "5b0d630f3020b82c0775a51d05895852f8506f50" -uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.16.4" - - [deps.Latexify.extensions] - DataFramesExt = "DataFrames" - SymEngineExt = "SymEngine" - - [deps.Latexify.weakdeps] - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" - -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" - -[[deps.LazyModules]] -git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" -uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" -version = "0.3.1" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.4.0+0" - -[[deps.LibGit2]] -deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] -uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.6.4+0" - -[[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.0+1" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.2+1" - -[[deps.Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] -git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.11+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.6.0+0" - -[[deps.Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.49.0+0" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.17.0+0" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.40.1+0" - -[[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.5.1+1" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.40.1+0" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.28" - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - - [deps.LogExpFunctions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[deps.LoggingExtras]] -deps = ["Dates", "Logging"] -git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" -uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.0.3" - -[[deps.MAT]] -deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"] -git-tree-sha1 = "1d2dd9b186742b0f317f2530ddcbf00eebb18e96" -uuid = "23992714-dd62-5051-b70f-ba57cb901cac" -version = "0.10.7" - -[[deps.MLDatasets]] -deps = ["CSV", "Chemfiles", "DataDeps", "DataFrames", "DelimitedFiles", "FileIO", "FixedPointNumbers", "GZip", "Glob", "HDF5", "ImageShow", "JLD2", "JSON3", "LazyModules", "MAT", "MLUtils", "NPZ", "Pickle", "Printf", "Requires", "SparseArrays", "Statistics", "Tables"] -git-tree-sha1 = "55ed5f79697232389d894d05e93633a03e774818" -uuid = "eb30cadb-4394-5ae3-aed4-317e484a6458" -version = "0.7.16" - -[[deps.MLStyle]] -git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" -uuid = "d8e11817-5142-5d16-987a-aa16d5891078" -version = "0.4.17" - -[[deps.MLUtils]] -deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] -git-tree-sha1 = "b45738c2e3d0d402dffa32b2c1654759a2ac35a4" -uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" -version = "0.4.4" - -[[deps.MPICH_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "19d4bd098928a3263693991500d05d74dbdc2004" -uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.2+0" - -[[deps.MPIPreferences]] -deps = ["Libdl", "Preferences"] -git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" -uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.11" - -[[deps.MPItrampoline_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "8c35d5420193841b2f367e658540e8d9e0601ed0" -uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.4.0+0" - -[[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.13" - -[[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" -uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] -git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.9" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+1" - -[[deps.Measures]] -git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" -uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.2" - -[[deps.MicroCollections]] -deps = ["Accessors", "BangBang", "InitialValues"] -git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" -uuid = "128add7d-3638-4c79-886c-908ea0c25c34" -version = "0.2.0" - -[[deps.MicrosoftMPI_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f12a29c4400ba812841c6ace3f4efbb6dbb3ba01" -uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" -version = "10.1.4+2" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.2.0" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[deps.MosaicViews]] -deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] -git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" -uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" -version = "0.3.4" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.1.10" - -[[deps.NNlib]] -deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Pkg", "Random", "Requires", "Statistics"] -git-tree-sha1 = "190dcada8cf9520198058c4544862b1f88c6c577" -uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" -version = "0.9.21" - - [deps.NNlib.extensions] - NNlibAMDGPUExt = "AMDGPU" - NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] - NNlibCUDAExt = "CUDA" - NNlibEnzymeCoreExt = "EnzymeCore" - NNlibFFTWExt = "FFTW" - - [deps.NNlib.weakdeps] - AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" - cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" - -[[deps.NPZ]] -deps = ["FileIO", "ZipFile"] -git-tree-sha1 = "60a8e272fe0c5079363b28b0953831e2dd7b7e6f" -uuid = "15e1cf62-19b3-5cfa-8e77-841668bca605" -version = "0.4.3" - -[[deps.NaNMath]] -deps = ["OpenLibm_jll"] -git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.0.2" - -[[deps.NameResolution]] -deps = ["PrettyPrint"] -git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" -uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" -version = "0.1.5" - -[[deps.NearestNeighbors]] -deps = ["Distances", "StaticArrays"] -git-tree-sha1 = "91a67b4d73842da90b526011fa85c5c4c9343fe0" -uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" -version = "0.4.18" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" - -[[deps.OffsetArrays]] -git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.14.1" -weakdeps = ["Adapt"] - - [deps.OffsetArrays.extensions] - OffsetArraysAdaptExt = "Adapt" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" - -[[deps.OneHotArrays]] -deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"] -git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d" -uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" -version = "0.2.5" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+4" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+2" - -[[deps.OpenMPI_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] -git-tree-sha1 = "2f0a1d8c79bc385ec3fcda12830c9d0e72b30e71" -uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "5.0.4+0" - -[[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" -uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.4.3" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a028ee3cb5641cccc4c24e90c36b0a4f7707bdf5" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.14+0" - -[[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.5+0" - -[[deps.Optimisers]] -deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "6572fe0c5b74431aaeb0b18a4aa5ef03c84678be" -uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" -version = "0.3.3" - -[[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.6.3" - -[[deps.PCRE2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+1" - -[[deps.PackageExtensionCompat]] -git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" -uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" -version = "1.0.2" -weakdeps = ["Requires", "TOML"] - -[[deps.PaddedViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" -uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" -version = "0.5.12" - -[[deps.Parsers]] -deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.1" - -[[deps.PeriodicTable]] -deps = ["Base64", "Unitful"] -git-tree-sha1 = "238aa6298007565529f911b734e18addd56985e1" -uuid = "7b2266bf-644c-5ea3-82d8-af4bbd25a884" -version = "1.2.1" - -[[deps.Pickle]] -deps = ["BFloat16s", "DataStructures", "InternedStrings", "Mmap", "Serialization", "SparseArrays", "StridedViews", "StringEncodings", "ZipFile"] -git-tree-sha1 = "e99da19b86b7e1547b423fc1721b260cfbe83acb" -uuid = "fbb45041-c46e-462f-888f-7c521cafbc2c" -version = "0.3.5" - -[[deps.Pipe]] -git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" -uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" -version = "1.3.0" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.43.4+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.10.0" - -[[deps.PlotThemes]] -deps = ["PlotUtils", "Statistics"] -git-tree-sha1 = "6e55c6841ce3411ccb3457ee52fc48cb698d6fb0" -uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "3.2.0" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.1" - -[[deps.Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] -git-tree-sha1 = "082f0c4b70c202c37784ce4bfbc33c9f437685bf" -uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.40.5" - - [deps.Plots.extensions] - FileIOExt = "FileIO" - GeometryBasicsExt = "GeometryBasics" - IJuliaExt = "IJulia" - ImageInTerminalExt = "ImageInTerminal" - UnitfulExt = "Unitful" - - [deps.Plots.weakdeps] - FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" - GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" - IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" - ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.PooledArrays]] -deps = ["DataAPI", "Future"] -git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" -uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" -version = "1.4.3" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.1" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.3" - -[[deps.PrettyPrint]] -git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" -uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" -version = "0.2.0" - -[[deps.PrettyTables]] -deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "66b20dd35966a748321d3b2537c4584cf40387c7" -uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "2.3.2" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.ProgressLogging]] -deps = ["Logging", "SHA", "UUIDs"] -git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" -uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -version = "0.1.4" - -[[deps.Qt6Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] -git-tree-sha1 = "492601870742dcd38f233b23c3ec629628c1d724" -uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" -version = "6.7.1+1" - -[[deps.Qt6Declarative_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] -git-tree-sha1 = "e5dd466bf2569fe08c91a2cc29c1003f4797ac3b" -uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" -version = "6.7.1+2" - -[[deps.Qt6ShaderTools_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] -git-tree-sha1 = "1a180aeced866700d4bebc3120ea1451201f16bc" -uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" -version = "6.7.1+1" - -[[deps.Qt6Wayland_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] -git-tree-sha1 = "729927532d48cf79f49070341e1d918a65aba6b0" -uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" -version = "6.7.1+1" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[deps.Random]] -deps = ["SHA"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[deps.RealDot]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" -uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" -version = "0.1.0" - -[[deps.RecipesBase]] -deps = ["PrecompileTools"] -git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.3.4" - -[[deps.RecipesPipeline]] -deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] -git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" -uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.6.12" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.0" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.2.1" - -[[deps.SentinelArrays]] -deps = ["Dates", "Random"] -git-tree-sha1 = "ff11acffdb082493657550959d4feb4b6149e73a" -uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.5" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[deps.Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] -git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "1.1.1" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[deps.ShowCases]] -git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" -uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" -version = "0.1.0" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SimpleBufferStream]] -git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" -uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.1.0" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.1" - -[[deps.SparseArrays]] -deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.10.0" - -[[deps.SparseInverseSubset]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" -uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" -version = "0.1.2" - -[[deps.SpecialFunctions]] -deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.4.0" -weakdeps = ["ChainRulesCore"] - - [deps.SpecialFunctions.extensions] - SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" - -[[deps.SplittablesBase]] -deps = ["Setfield", "Test"] -git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" -uuid = "171d559e-b47b-412a-8079-5efa626c420e" -version = "0.1.15" - -[[deps.StackViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" -uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" -version = "0.1.1" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.7" -weakdeps = ["ChainRulesCore", "Statistics"] - - [deps.StaticArrays.extensions] - StaticArraysChainRulesCoreExt = "ChainRulesCore" - StaticArraysStatisticsExt = "Statistics" - -[[deps.StaticArraysCore]] -git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" -uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.3" - -[[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.10.0" - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.0" - -[[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.3" - -[[deps.StridedViews]] -deps = ["LinearAlgebra", "PackageExtensionCompat"] -git-tree-sha1 = "5b765c4e401693ab08981989f74a36a010aa1d8e" -uuid = "4db3bf67-4bd7-4b4e-b153-31dc3fb37143" -version = "0.2.2" - - [deps.StridedViews.extensions] - StridedViewsCUDAExt = "CUDA" - - [deps.StridedViews.weakdeps] - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - -[[deps.StringEncodings]] -deps = ["Libiconv_jll"] -git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" -uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" -version = "0.3.7" - -[[deps.StringManipulation]] -deps = ["PrecompileTools"] -git-tree-sha1 = "a04cabe79c5f01f4d723cc6704070ada0b9d46d5" -uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.3.4" - -[[deps.StructArrays]] -deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.18" -weakdeps = ["Adapt", "GPUArraysCore", "SparseArrays", "StaticArrays"] - - [deps.StructArrays.extensions] - StructArraysAdaptExt = "Adapt" - StructArraysGPUArraysCoreExt = "GPUArraysCore" - StructArraysSparseArraysExt = "SparseArrays" - StructArraysStaticArraysExt = "StaticArrays" - -[[deps.StructTypes]] -deps = ["Dates", "UUIDs"] -git-tree-sha1 = "ca4bccb03acf9faaf4137a9abc1881ed1841aa70" -uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" -version = "1.10.0" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.2.1+1" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[deps.TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[deps.Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.12.0" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.0" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.TranscodingStreams]] -git-tree-sha1 = "96612ac5365777520c3c5396314c8cf7408f436a" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.11.1" -weakdeps = ["Random", "Test"] - - [deps.TranscodingStreams.extensions] - TestExt = ["Test", "Random"] - -[[deps.Transducers]] -deps = ["Accessors", "Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] -git-tree-sha1 = "5215a069867476fc8e3469602006b9670e68da23" -uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" -version = "0.4.82" - - [deps.Transducers.extensions] - TransducersBlockArraysExt = "BlockArrays" - TransducersDataFramesExt = "DataFrames" - TransducersLazyArraysExt = "LazyArrays" - TransducersOnlineStatsBaseExt = "OnlineStatsBase" - TransducersReferenceablesExt = "Referenceables" - - [deps.Transducers.weakdeps] - BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" - DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" - LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" - OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" - Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" - -[[deps.URIs]] -git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.5.1" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.Unitful]] -deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "d95fe458f26209c66a187b1114df96fd70839efd" -uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.21.0" -weakdeps = ["ConstructionBase", "InverseFunctions"] - - [deps.Unitful.extensions] - ConstructionBaseUnitfulExt = "ConstructionBase" - InverseFunctionsUnitfulExt = "InverseFunctions" - -[[deps.UnitfulAtomic]] -deps = ["Unitful"] -git-tree-sha1 = "903be579194534af1c4b4778d1ace676ca042238" -uuid = "a7773ee8-282e-5fa2-be4e-bd808c38a91a" -version = "1.0.0" - -[[deps.UnitfulLatexify]] -deps = ["LaTeXStrings", "Latexify", "Unitful"] -git-tree-sha1 = "975c354fcd5f7e1ddcc1f1a23e6e091d99e99bc8" -uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" -version = "1.6.4" - -[[deps.UnsafeAtomics]] -git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" -uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" -version = "0.2.1" - -[[deps.UnsafeAtomicsLLVM]] -deps = ["LLVM", "UnsafeAtomics"] -git-tree-sha1 = "bf2c553f25e954a9b38c9c0593a59bb13113f9e5" -uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" -version = "0.1.5" - -[[deps.Unzip]] -git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" -uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" -version = "0.2.0" - -[[deps.VectorInterface]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "7aff7d62bffad9bba9928eb6ab55226b32a351eb" -uuid = "409d34a3-91d5-4945-b6ec-7529ddf182d8" -version = "0.4.6" - -[[deps.Vulkan_Loader_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] -git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" -uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" -version = "1.3.243+0" - -[[deps.Wayland_jll]] -deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.21.0+1" - -[[deps.Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.31.0+0" - -[[deps.WeakRefStrings]] -deps = ["DataAPI", "InlineStrings", "Parsers"] -git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" -uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" -version = "1.4.2" - -[[deps.WorkerUtilities]] -git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" -uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" -version = "1.6.1" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "d9717ce3518dc68a99e6b96300813760d887a01d" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.1+0" - -[[deps.XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.41+0" - -[[deps.XZ_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" -uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.4.6+0" - -[[deps.Xorg_libICE_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" -uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" -version = "1.1.1+0" - -[[deps.Xorg_libSM_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] -git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" -uuid = "c834827a-8449-5923-a945-d239c165b7dd" -version = "1.2.4+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.6+0" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.11+0" - -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.0+4" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.4+0" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.6+0" - -[[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "5.0.3+4" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.7.10+4" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] -git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.4+4" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.2+4" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.11+0" - -[[deps.Xorg_libpthread_stubs_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" -uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" -version = "0.1.1+0" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.17.0+0" - -[[deps.Xorg_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.2+0" - -[[deps.Xorg_xcb_util_cursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] -git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" -uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" -version = "0.1.4+0" - -[[deps.Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" -uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] -git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" -uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" -uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" -uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.9+1" - -[[deps.Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" -uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.1+1" - -[[deps.Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.6+0" - -[[deps.Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.39.0+0" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.5.0+0" - -[[deps.ZipFile]] -deps = ["Libdl", "Printf", "Zlib_jll"] -git-tree-sha1 = "f492b7fe1698e623024e873244f10d89c95c340a" -uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" -version = "0.10.1" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+1" - -[[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.6+0" - -[[deps.Zygote]] -deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] -git-tree-sha1 = "19c586905e78a26f7e4e97f81716057bd6b1bc54" -uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" -version = "0.6.70" - - [deps.Zygote.extensions] - ZygoteColorsExt = "Colors" - ZygoteDistancesExt = "Distances" - ZygoteTrackerExt = "Tracker" - - [deps.Zygote.weakdeps] - Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" - Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.ZygoteRules]] -deps = ["ChainRulesCore", "MacroTools"] -git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00" -uuid = "700de1a5-db45-46bc-99cf-38207098b444" -version = "0.2.5" - -[[deps.eudev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] -git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" -uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" -version = "3.2.9+0" - -[[deps.fzf_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a68c9655fbe6dfcab3d972808f1aafec151ce3f8" -uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" -version = "0.43.0+0" - -[[deps.gperf_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" -uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" -version = "3.1.1+0" - -[[deps.libaec_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "46bf7be2917b59b761247be3f317ddf75e50e997" -uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" -version = "1.1.2+0" - -[[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" -uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.9.0+0" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.1+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" - -[[deps.libevdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" -uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" -version = "1.11.0+0" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.2+0" - -[[deps.libinput_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] -git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" -uuid = "36db933b-70db-51c0-b978-0f229ee0e533" -version = "1.18.0+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.43+1" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+2" - -[[deps.mtdev_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" -uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" -version = "1.1.6+0" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.52.0+1" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+2" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" - -[[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.4.1+1" -""" - -# ╔═╡ Cell order: -# ╟─5fdab668-4003-11ee-33f5-3953225b0c0f -# ╟─3dd0ce32-2339-4d5a-9a6f-1f662bc5500b -# ╠═1f95ad97-a007-4724-84db-392b0026e1a4 -# ╟─ec5caeb6-1f95-4cb9-8739-8cadba29a22d -# ╠═f531e39c-6842-494a-b4ac-8904321098c9 -# ╠═d5ebf9aa-cec8-4417-baaf-f2e8e19f1cad -# ╟─dc2d5e98-2201-4754-bfc6-8ed2bbb82153 -# ╠═0dde5fd3-72d0-4b15-afb3-9a5b102327c9 -# ╟─f7a6d572-28cf-4d69-a9be-d49f367eca37 -# ╠═3d5503bc-bb97-422e-9465-becc7d3dbe07 -# ╟─3569715d-08f5-4605-b946-9ef7ccd86ae5 -# ╠═aa4eb172-2a42-4c01-a6ef-c6c95208d5b2 -# ╠═367ed417-4f53-44d4-8135-0c91c842a75f -# ╠═7c084eaa-655c-4251-a342-6b6f4df76ddb -# ╠═bf0d820d-32c0-4731-8053-53d5d499e009 -# ╠═cb89d1a3-b4ff-421a-8717-a0b7f21dea1a -# ╟─3b49a612-3a04-4eb5-bfbc-360614f4581a -# ╠═95d8bd24-a40d-409f-a1e7-4174428ef860 -# ╟─fde2ac9e-b121-4105-8428-1820b9c17a43 -# ╠═111b7d5d-c7e3-44c0-9e5e-2ed1a86854d3 -# ╟─572a6633-875b-4d7e-9afc-543b442948fb -# ╠═5502f4fa-3201-4980-b766-2ab88b175b11 -# ╟─4a1ec34a-1092-4b4a-b8a8-bd91939ffd9e -# ╟─755a88c2-c2e5-46d1-9582-af4b2c5a6bbd -# ╠═e83253b2-9f3a-44e2-a747-cce1661657c4 -# ╠═85a923da-3027-4f71-8db6-96852c115c03 -# ╠═39c82234-97ea-48d6-98dd-915f072b7f85 -# ╠═8c3a903b-2c8a-4d4f-8eef-74d5611f2ce4 -# ╠═2c5f6250-ee7a-41b1-9551-bcfeba83ca8b -# ╠═1008dad4-d784-4c38-a7cf-d9b64728e28d -# ╟─8d0e8b9f-226f-4bff-9deb-046e6a897b71 -# ╟─a7e4bb23-6687-476a-a0c2-1b2736873d9d -# ╟─00000000-0000-0000-0000-000000000001 -# ╟─00000000-0000-0000-0000-000000000002 From 02806d7bb0837e0f03583fb314100edbdc2ce7f7 Mon Sep 17 00:00:00 2001 From: Aurora Rossi Date: Mon, 30 Dec 2024 11:59:57 +0100 Subject: [PATCH 2/2] Fixes --- .../docs/src/tutorials/traffic_prediction.md | 789 ++++++++++++++++-- .../traffic_prediction.jl | 33 +- 2 files changed, 735 insertions(+), 87 deletions(-) diff --git a/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md b/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md index 74e4cf781..8f2376f74 100644 --- a/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md +++ b/GraphNeuralNetworks/docs/src/tutorials/traffic_prediction.md @@ -1,3 +1,7 @@ +```@meta +EditURL = "../../src_tutorials/introductory_tutorials/traffic_prediction.jl" +``` + # Traffic Prediction using recurrent Temporal Graph Convolutional Network In this tutorial, we will learn how to use a recurrent Temporal Graph Convolutional Network (TGCN) to predict traffic in a spatio-temporal setting. Traffic forecasting is the problem of predicting future traffic trends on a road network given historical traffic data, such as, in our case, traffic speed and time of day. @@ -10,12 +14,15 @@ We start by importing the necessary libraries. We use `GraphNeuralNetworks.jl`, using Flux, GraphNeuralNetworks using Flux.Losses: mae using MLDatasets: METRLA -using Statistics, Plots +using Statistics, Plots, Random + +ENV["DATADEPS_ALWAYS_ACCEPT"] = "true" # don't ask for dataset download confirmation +Random.seed!(42); # for reproducibility ```` ## Dataset: METR-LA -We use the `METR-LA` dataset from the paper [Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926.pdf), which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edges represent the distances between the sensors. +We use the `METR-LA` dataset from the paper [Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926.pdf), which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edge weights are the distances between the sensor locations. ````julia dataset_metrla = METRLA(; num_timesteps = 3) @@ -54,7 +61,7 @@ size(features[1]) (2, 3, 207) ```` -The first dimension correspond to the two features (first line the speed value and the second line the time of the day), the second to the number of timestep `num_timesteps` and the third to the nodes. +The first dimension corresponds to the two features (the first line the speed value and the second line the time of day), the second to the number of time steps `num_timesteps` and the third to the nodes. ````julia targets = map(x -> permutedims(x,(1,3,2)), g.node_data.targets) @@ -109,52 +116,52 @@ function plot_data(data,sensor) return p end -plot_data(features[1:288],1) +plot_data(features[1:288],1) # Plot the speed of the first sensor for the first day ```` ```@raw html - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + ``` @@ -164,8 +171,8 @@ Now let's construct the static graph, the `train_loader` and `data_loader`. ````julia graph = GNNGraph(g.edge_index; edata = g.edge_data, g.num_nodes); -train_loader = zip(features[1:200], targets[1:200]); -test_loader = zip(features[2001:2288], targets[2001:2288]); +train_loader = zip(features[1:288], targets[1:288]); # train on 24 hours +test_loader = zip(features[289:577], targets[289:577]); # test on next 24 hours ```` ## Model: T-GCN @@ -185,6 +192,638 @@ GNNChain( ) # Total: 20 arrays, 91_601 parameters, 359.926 KiB. ```` +Let's look at the output of the model for the first batch of the training data. + +````julia +model(graph, features[1]) +```` + +```` +1×3×207 Array{Float32, 3}: +[:, :, 1] = + -0.190437 -0.275888 -0.309614 + +[:, :, 2] = + -0.205105 -0.296784 -0.334173 + +[:, :, 3] = + -0.197624 -0.284286 -0.319129 + +[:, :, 4] = + -0.157204 -0.228289 -0.253792 + +[:, :, 5] = + -0.155905 -0.226222 -0.251258 + +[:, :, 6] = + -0.159185 -0.230661 -0.257051 + +[:, :, 7] = + -0.173409 -0.252395 -0.282089 + +[:, :, 8] = + -0.210598 -0.302728 -0.33926 + +[:, :, 9] = + -0.149367 -0.213933 -0.243558 + +[:, :, 10] = + -0.180688 -0.261343 -0.295115 + +[:, :, 11] = + -0.199304 -0.290447 -0.325584 + +[:, :, 12] = + -0.278894 -0.406116 -0.460844 + +[:, :, 13] = + -0.180216 -0.262925 -0.293612 + +[:, :, 14] = + -0.228686 -0.334105 -0.37733 + +[:, :, 15] = + -0.210634 -0.305526 -0.348456 + +[:, :, 16] = + -0.172959 -0.252245 -0.281268 + +[:, :, 17] = + -0.217106 -0.319649 -0.360754 + +[:, :, 18] = + -0.150425 -0.218005 -0.241832 + +[:, :, 19] = + -0.190064 -0.27711 -0.307167 + +[:, :, 20] = + -0.171708 -0.248663 -0.279023 + +[:, :, 21] = + -0.180806 -0.262256 -0.29506 + +[:, :, 22] = + -0.172006 -0.249267 -0.276387 + +[:, :, 23] = + -0.204998 -0.299257 -0.337803 + +[:, :, 24] = + -0.143662 -0.205132 -0.22986 + +[:, :, 25] = + -0.17058 -0.246961 -0.277176 + +[:, :, 26] = + -0.125724 -0.179274 -0.201392 + +[:, :, 27] = + -0.161693 -0.240145 -0.264886 + +[:, :, 28] = + -0.270972 -0.390949 -0.441452 + +[:, :, 29] = + -0.196606 -0.284139 -0.319259 + +[:, :, 30] = + -0.106939 -0.152224 -0.168653 + +[:, :, 31] = + -0.212599 -0.310341 -0.350769 + +[:, :, 32] = + -0.173633 -0.250774 -0.280106 + +[:, :, 33] = + -0.139142 -0.199454 -0.22344 + +[:, :, 34] = + -0.174493 -0.254723 -0.284142 + +[:, :, 35] = + -0.164989 -0.237711 -0.268315 + +[:, :, 36] = + -0.228477 -0.333556 -0.370548 + +[:, :, 37] = + -0.146427 -0.211616 -0.234375 + +[:, :, 38] = + -0.180574 -0.26056 -0.292912 + +[:, :, 39] = + -0.163789 -0.23647 -0.264311 + +[:, :, 40] = + -0.151709 -0.218625 -0.244964 + +[:, :, 41] = + -0.152286 -0.218895 -0.243639 + +[:, :, 42] = + -0.180067 -0.261519 -0.292724 + +[:, :, 43] = + -0.177356 -0.255949 -0.287688 + +[:, :, 44] = + -0.233629 -0.34346 -0.389236 + +[:, :, 45] = + -0.162016 -0.238135 -0.268996 + +[:, :, 46] = + -0.210987 -0.30546 -0.344888 + +[:, :, 47] = + -0.129844 -0.184776 -0.206926 + +[:, :, 48] = + -0.144141 -0.208359 -0.232098 + +[:, :, 49] = + -0.186031 -0.26919 -0.30268 + +[:, :, 50] = + -0.18573 -0.268062 -0.301012 + +[:, :, 51] = + -0.154996 -0.222242 -0.246921 + +[:, :, 52] = + -0.125969 -0.183241 -0.20299 + +[:, :, 53] = + -0.128753 -0.184801 -0.206073 + +[:, :, 54] = + -0.182141 -0.263658 -0.296718 + +[:, :, 55] = + -0.180574 -0.26056 -0.292912 + +[:, :, 56] = + -0.247853 -0.35698 -0.403441 + +[:, :, 57] = + -0.12183 -0.171019 -0.193141 + +[:, :, 58] = + -0.143798 -0.206911 -0.231874 + +[:, :, 59] = + -0.186424 -0.270015 -0.303871 + +[:, :, 60] = + -0.124582 -0.178255 -0.201623 + +[:, :, 61] = + -0.166843 -0.241884 -0.270934 + +[:, :, 62] = + -0.12182 -0.175862 -0.192675 + +[:, :, 63] = + -0.155786 -0.223574 -0.251115 + +[:, :, 64] = + -0.166843 -0.241884 -0.270934 + +[:, :, 65] = + -0.160543 -0.230969 -0.25823 + +[:, :, 66] = + -0.15121 -0.216889 -0.242367 + +[:, :, 67] = + -0.13159 -0.188731 -0.207805 + +[:, :, 68] = + -0.189616 -0.27612 -0.308881 + +[:, :, 69] = + -0.200743 -0.292853 -0.329716 + +[:, :, 70] = + -0.169824 -0.246521 -0.275719 + +[:, :, 71] = + -0.167384 -0.242634 -0.270986 + +[:, :, 72] = + -0.196242 -0.285936 -0.321644 + +[:, :, 73] = + -0.236292 -0.348151 -0.392883 + +[:, :, 74] = + -0.147614 -0.213301 -0.23788 + +[:, :, 75] = + -0.130178 -0.1868 -0.209104 + +[:, :, 76] = + -0.143267 -0.207005 -0.230624 + +[:, :, 77] = + -0.178527 -0.258857 -0.290719 + +[:, :, 78] = + -0.229404 -0.335587 -0.381214 + +[:, :, 79] = + -0.17892 -0.256519 -0.287337 + +[:, :, 80] = + -0.256783 -0.371621 -0.418989 + +[:, :, 81] = + -0.172706 -0.251723 -0.280522 + +[:, :, 82] = + -0.18082 -0.262931 -0.295119 + +[:, :, 83] = + -0.227386 -0.334063 -0.378103 + +[:, :, 84] = + -0.165214 -0.237812 -0.265142 + +[:, :, 85] = + -0.22231 -0.323155 -0.368888 + +[:, :, 86] = + -0.296831 -0.431825 -0.489221 + +[:, :, 87] = + -0.129124 -0.185373 -0.205527 + +[:, :, 88] = + -0.147305 -0.210806 -0.235909 + +[:, :, 89] = + -0.232948 -0.339972 -0.388093 + +[:, :, 90] = + -0.189576 -0.274985 -0.310499 + +[:, :, 91] = + -0.151025 -0.216674 -0.241499 + +[:, :, 92] = + -0.173409 -0.252395 -0.282089 + +[:, :, 93] = + -0.250912 -0.362302 -0.409829 + +[:, :, 94] = + -0.18209 -0.265956 -0.297498 + +[:, :, 95] = + -0.140428 -0.202285 -0.225455 + +[:, :, 96] = + -0.206212 -0.300465 -0.338838 + +[:, :, 97] = + -0.166441 -0.240681 -0.269976 + +[:, :, 98] = + -0.164072 -0.237686 -0.265411 + +[:, :, 99] = + -0.195899 -0.285294 -0.321289 + +[:, :, 100] = + -0.165435 -0.238288 -0.265888 + +[:, :, 101] = + -0.166142 -0.239296 -0.268309 + +[:, :, 102] = + -0.16833 -0.242256 -0.271739 + +[:, :, 103] = + -0.179791 -0.261186 -0.292492 + +[:, :, 104] = + -0.209821 -0.306689 -0.345681 + +[:, :, 105] = + -0.135322 -0.194691 -0.216658 + +[:, :, 106] = + -0.1255 -0.171665 -0.191923 + +[:, :, 107] = + -0.153809 -0.212498 -0.238045 + +[:, :, 108] = + -0.187928 -0.270401 -0.302994 + +[:, :, 109] = + -0.264405 -0.381957 -0.431546 + +[:, :, 110] = + -0.117467 -0.168596 -0.187241 + +[:, :, 111] = + -0.224301 -0.322166 -0.363671 + +[:, :, 112] = + -0.168287 -0.242538 -0.272265 + +[:, :, 113] = + -0.160955 -0.233634 -0.260878 + +[:, :, 114] = + -0.207936 -0.304274 -0.341215 + +[:, :, 115] = + -0.186424 -0.270015 -0.303871 + +[:, :, 116] = + -0.136708 -0.196708 -0.218464 + +[:, :, 117] = + -0.162854 -0.23376 -0.262001 + +[:, :, 118] = + -0.145378 -0.209858 -0.232379 + +[:, :, 119] = + -0.192249 -0.280093 -0.313773 + +[:, :, 120] = + -0.130178 -0.1868 -0.209104 + +[:, :, 121] = + -0.125724 -0.179274 -0.201392 + +[:, :, 122] = + -0.131778 -0.188032 -0.204329 + +[:, :, 123] = + -0.190305 -0.275725 -0.308528 + +[:, :, 124] = + -0.186358 -0.269023 -0.302943 + +[:, :, 125] = + -0.134097 -0.19219 -0.21461 + +[:, :, 126] = + -0.229687 -0.335651 -0.379391 + +[:, :, 127] = + -0.150366 -0.217124 -0.23494 + +[:, :, 128] = + -0.154125 -0.222539 -0.248575 + +[:, :, 129] = + -0.17385 -0.252715 -0.282263 + +[:, :, 130] = + -0.180074 -0.259453 -0.291821 + +[:, :, 131] = + -0.241886 -0.356054 -0.404226 + +[:, :, 132] = + -0.147983 -0.213392 -0.237915 + +[:, :, 133] = + -0.297865 -0.433592 -0.491451 + +[:, :, 134] = + -0.1685 -0.242305 -0.272017 + +[:, :, 135] = + -0.152483 -0.218733 -0.244645 + +[:, :, 136] = + -0.168702 -0.242609 -0.272312 + +[:, :, 137] = + -0.171193 -0.249144 -0.27821 + +[:, :, 138] = + -0.157444 -0.227595 -0.254614 + +[:, :, 139] = + -0.170859 -0.24856 -0.277567 + +[:, :, 140] = + -0.154185 -0.220971 -0.248326 + +[:, :, 141] = + -0.167564 -0.241895 -0.269898 + +[:, :, 142] = + -0.198382 -0.28988 -0.325145 + +[:, :, 143] = + -0.190193 -0.274691 -0.308954 + +[:, :, 144] = + -0.164367 -0.235356 -0.264506 + +[:, :, 145] = + -0.168585 -0.245612 -0.273639 + +[:, :, 146] = + -0.146785 -0.210873 -0.235221 + +[:, :, 147] = + -0.23117 -0.339433 -0.38506 + +[:, :, 148] = + -0.151623 -0.217167 -0.243276 + +[:, :, 149] = + -0.171926 -0.247709 -0.278381 + +[:, :, 150] = + -0.130441 -0.186429 -0.207541 + +[:, :, 151] = + -0.124612 -0.17517 -0.197384 + +[:, :, 152] = + -0.227914 -0.332301 -0.379083 + +[:, :, 153] = + -0.209602 -0.30737 -0.348098 + +[:, :, 154] = + -0.121033 -0.172756 -0.192205 + +[:, :, 155] = + -0.189307 -0.276265 -0.309519 + +[:, :, 156] = + -0.176345 -0.256208 -0.286709 + +[:, :, 157] = + -0.179865 -0.260353 -0.290873 + +[:, :, 158] = + -0.162518 -0.23573 -0.262435 + +[:, :, 159] = + -0.14841 -0.214032 -0.238902 + +[:, :, 160] = + -0.175029 -0.254328 -0.284384 + +[:, :, 161] = + -0.187785 -0.274063 -0.306795 + +[:, :, 162] = + -0.164439 -0.238981 -0.265863 + +[:, :, 163] = + -0.179146 -0.261088 -0.291655 + +[:, :, 164] = + -0.174582 -0.253612 -0.283677 + +[:, :, 165] = + -0.146835 -0.212141 -0.236504 + +[:, :, 166] = + -0.169574 -0.244662 -0.274579 + +[:, :, 167] = + -0.205169 -0.300378 -0.338329 + +[:, :, 168] = + -0.193459 -0.280816 -0.316494 + +[:, :, 169] = + -0.200406 -0.291517 -0.328319 + +[:, :, 170] = + -0.200175 -0.290885 -0.327673 + +[:, :, 171] = + -0.139527 -0.196866 -0.221303 + +[:, :, 172] = + -0.237291 -0.345947 -0.391304 + +[:, :, 173] = + -0.159724 -0.230503 -0.257995 + +[:, :, 174] = + -0.170648 -0.246842 -0.277382 + +[:, :, 175] = + -0.128632 -0.184283 -0.20528 + +[:, :, 176] = + -0.185905 -0.270254 -0.304107 + +[:, :, 177] = + -0.161168 -0.232131 -0.258788 + +[:, :, 178] = + -0.197273 -0.285652 -0.321442 + +[:, :, 179] = + -0.209952 -0.307914 -0.348789 + +[:, :, 180] = + -0.265724 -0.385954 -0.437209 + +[:, :, 181] = + -0.165994 -0.238608 -0.267949 + +[:, :, 182] = + -0.158609 -0.228565 -0.255802 + +[:, :, 183] = + -0.160324 -0.230812 -0.261482 + +[:, :, 184] = + -0.196514 -0.283855 -0.319215 + +[:, :, 185] = + -0.107441 -0.153569 -0.171727 + +[:, :, 186] = + -0.182517 -0.262905 -0.299795 + +[:, :, 187] = + -0.196173 -0.284077 -0.322929 + +[:, :, 188] = + -0.167405 -0.243004 -0.270949 + +[:, :, 189] = + -0.181083 -0.264399 -0.295156 + +[:, :, 190] = + -0.166454 -0.240585 -0.263743 + +[:, :, 191] = + -0.233863 -0.34417 -0.388829 + +[:, :, 192] = + -0.16662 -0.242443 -0.269792 + +[:, :, 193] = + -0.160664 -0.233362 -0.259544 + +[:, :, 194] = + -0.164726 -0.239385 -0.266441 + +[:, :, 195] = + -0.132454 -0.188973 -0.211022 + +[:, :, 196] = + -0.161302 -0.234395 -0.260481 + +[:, :, 197] = + -0.205169 -0.300378 -0.338329 + +[:, :, 198] = + -0.208202 -0.303859 -0.342555 + +[:, :, 199] = + -0.168634 -0.244804 -0.273155 + +[:, :, 200] = + -0.167564 -0.241895 -0.269898 + +[:, :, 201] = + -0.168502 -0.245323 -0.272658 + +[:, :, 202] = + -0.219244 -0.320418 -0.362164 + +[:, :, 203] = + -0.146067 -0.210437 -0.23644 + +[:, :, 204] = + -0.137563 -0.196391 -0.220473 + +[:, :, 205] = + -0.164275 -0.237357 -0.265263 + +[:, :, 206] = + -0.171608 -0.248259 -0.27865 + +[:, :, 207] = + -0.162244 -0.234602 -0.26246 +```` + +The output of the model is a tensor of size `(1, 3, 207)`, which corresponds to the dimension of the feature (in this case speed), the number of time steps, and the number of nodes in the graph, respectively. The model outputs the predicted traffic speed for each sensor at each time step. + ![](https://www.researchgate.net/profile/Haifeng-Li-3/publication/335353434/figure/fig4/AS:851870352437249@1580113127759/The-architecture-of-the-Gated-Recurrent-Unit-model.jpg) ## Training @@ -230,70 +869,70 @@ GNNChain( function plot_predicted_data(graph, features, targets, sensor) p = plot(xlabel="Time (h)", ylabel="Normalized speed") prediction = [] - grand_truth = [] + ground_truth = [] for i in 1:3:length(features) - push!(grand_truth,targets[i][1,:,sensor]) + push!(ground_truth,targets[i][1,:,sensor]) push!(prediction, model(graph, features[i])[1,:,sensor]) end prediction = reduce(vcat,prediction) - grand_truth = reduce(vcat, grand_truth) - plot!(p, collect(1:length(features)), grand_truth, color = :blue, label = "Grand Truth", xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) - plot!(p, collect(1:length(features)), prediction, color = :red, label= "Prediction") + ground_truth = reduce(vcat, ground_truth) + plot!(p, collect(1:length(prediction)), prediction, color = :red, label= "Prediction") + plot!(p, collect(1:length(ground_truth)), ground_truth, color = :blue, label = "Ground Truth", xticks = ([i for i in 0:50:250], ["$(i)" for i in 0:4:20])) return p end -plot_predicted_data(graph,features[301:588],targets[301:588], 1) +plot_predicted_data(graph,features[289:577],targets[289:577], 1) ```` ```@raw html - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ``` @@ -312,7 +951,7 @@ mean([accuracy(model(graph,x), y) for (x, y) in test_loader]) ```` ```` -0.3951533f0 +0.61555225f0 ```` The accuracy is not very good but can be improved by training using more data. We used a small subset of the dataset for this tutorial because of the computational cost of training the model. From the plot of the predictions, we can see that the model is able to capture the general trend of the traffic speed, but it is not able to capture the peaks of the traffic. diff --git a/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl b/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl index ac4392bb2..c869fb664 100644 --- a/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl +++ b/GraphNeuralNetworks/docs/src_tutorials/introductory_tutorials/traffic_prediction.jl @@ -9,11 +9,14 @@ using Flux, GraphNeuralNetworks using Flux.Losses: mae using MLDatasets: METRLA -using Statistics, Plots +using Statistics, Plots, Random + +ENV["DATADEPS_ALWAYS_ACCEPT"] = "true" # don't ask for dataset download confirmation +Random.seed!(42); # for reproducibility # ## Dataset: METR-LA -# We use the `METR-LA` dataset from the paper [Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926.pdf), which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edges represent the distances between the sensors. +# We use the `METR-LA` dataset from the paper [Diffusion Convolutional Recurrent Neural Network: Data-driven Traffic Forecasting](https://arxiv.org/pdf/1707.01926.pdf), which contains traffic data from loop detectors in the highway of Los Angeles County. The dataset contains traffic speed data from March 1, 2012 to June 30, 2012. The data is collected every 5 minutes, resulting in 12 observations per hour, from 207 sensors. Each sensor is a node in the graph, and the edge weights are the distances between the sensor locations. dataset_metrla = METRLA(; num_timesteps = 3) # @@ -29,7 +32,7 @@ features = map(x -> permutedims(x,(1,3,2)), g.node_data.features) size(features[1]) -# The first dimension correspond to the two features (first line the speed value and the second line the time of the day), the second to the number of timestep `num_timesteps` and the third to the nodes. +# The first dimension corresponds to the two features (the first line the speed value and the second line the time of day), the second to the number of time steps `num_timesteps` and the third to the nodes. targets = map(x -> permutedims(x,(1,3,2)), g.node_data.targets) @@ -57,14 +60,14 @@ function plot_data(data,sensor) return p end -plot_data(features[1:288],1) +plot_data(features[1:288],1) # Plot the speed of the first sensor for the first day # Now let's construct the static graph, the `train_loader` and `data_loader`. graph = GNNGraph(g.edge_index; edata = g.edge_data, g.num_nodes); -train_loader = zip(features[1:200], targets[1:200]); -test_loader = zip(features[2001:2288], targets[2001:2288]); +train_loader = zip(features[1:288], targets[1:288]); # train on 24 hours +test_loader = zip(features[289:577], targets[289:577]); # test on next 24 hours # ## Model: T-GCN @@ -72,6 +75,12 @@ test_loader = zip(features[2001:2288], targets[2001:2288]); model = GNNChain(TGCN(2 => 100; add_self_loops = false), Dense(100, 1)) +# Let's look at the output of the model for the first batch of the training data. + +model(graph, features[1]) + +# The output of the model is a tensor of size `(1, 3, 207)`, which corresponds to the dimension of the feature (in this case speed), the number of time steps, and the number of nodes in the graph, respectively. The model outputs the predicted traffic speed for each sensor at each time step. + # ![](https://www.researchgate.net/profile/Haifeng-Li-3/publication/335353434/figure/fig4/AS:851870352437249@1580113127759/The-architecture-of-the-Gated-Recurrent-Unit-model.jpg) # ## Training @@ -106,19 +115,19 @@ train(graph, train_loader, model) function plot_predicted_data(graph, features, targets, sensor) p = plot(xlabel="Time (h)", ylabel="Normalized speed") prediction = [] - grand_truth = [] + ground_truth = [] for i in 1:3:length(features) - push!(grand_truth,targets[i][1,:,sensor]) + push!(ground_truth,targets[i][1,:,sensor]) push!(prediction, model(graph, features[i])[1,:,sensor]) end prediction = reduce(vcat,prediction) - grand_truth = reduce(vcat, grand_truth) - plot!(p, collect(1:length(features)), grand_truth, color = :blue, label = "Grand Truth", xticks =([i for i in 0:50:250], ["$(i)" for i in 0:4:24])) - plot!(p, collect(1:length(features)), prediction, color = :red, label= "Prediction") + ground_truth = reduce(vcat, ground_truth) + plot!(p, collect(1:length(prediction)), prediction, color = :red, label= "Prediction") + plot!(p, collect(1:length(ground_truth)), ground_truth, color = :blue, label = "Ground Truth", xticks = ([i for i in 0:50:250], ["$(i)" for i in 0:4:20])) return p end -plot_predicted_data(graph,features[301:588],targets[301:588], 1) +plot_predicted_data(graph,features[289:577],targets[289:577], 1) # accuracy(ŷ, y) = 1 - Statistics.norm(y-ŷ)/Statistics.norm(y)