ripped ML out into the SkraakML repo, compiles quicker now
[?]
AEj8dahVWy718uSSFPe9VSRJ5qX5G8pC2zvFzJJ8yzBd
Nov 10, 2024, 1:42 AM
QA2TJZRA7RYN5UMRDLXWASQBU7YXV63R2A33EVJME6FV4S67WY3ACDependencies
- [2]
X54TLSYEcatch up commit, train now working with julia 1.10.5 but not 1.11 - [3]
YODTMMPTadded a whole bunch of functions to Labels.jl for working with raven and avians labels - [4]
PHGT4YMBextended Skraak.dddict, and work on all the functions that call it or make it - [5]
2UBDFCJHnew files tracked - [6]
WOSKMRI4added module Base and module ML - [7]
ZGLDIQ4Grolled back reduced and bifurcated training set used to test models before going away - [8]
AQWXGGE3mod to clips.jl - [9]
3FAESP6Ncatch up with changes, mainly construct primary dataset - [10]
G4IN2F2T - [11]
NMQCXLNGcatch up commit, about to do some work on prediction loop - [12]
U46LDPL7added model, CUDA works again now on ubuntu - [13]
PQ6OQCBQwork on construct primary dataset - [14]
L7G33K4Cfixed a comment problem in Clips, and upgraded, now it compiles on Mac again - [15]
JYCKLP2Echanges to clips and predict - [16]
EDYR5C55fixed ConstructPrimaryDataSet, licence date, Readme, re-arranged Predict.jl - [17]
OFTU77S5first commit - [18]
SMODB47Pmods to clips to truncate freq to max 16000 - [19]
MMG2PLXKnew functiion to make clips of downloaded bisd calls - [20]
E5JDMNIAadded kiwi 1-4 model - [21]
NV7FXZ5Qfirst commit - [22]
4BTZNCRMcatch up commit before starting work - [23]
27HKDBYTchanget train api to take a list of images instead of glob pattern - [24]
ETOIK7VErecording changes, but this does not work anymore - [25]
RBXUHIO2made somn small changes and reverted them mostly - [26]
QPBH7QWCadded MLBaste for confusion matrix, f1, roc, must still remove freq tables - [27]
RQ56K2G4minor work on train and predict - [28]
2O6SHIVYadded avianz_of_raven function to Labels.jl - [29]
E3Y55MPRadded perceptual colour maps and changed get_image_from_sample - [30]
BOPNWZL4refactored Skraak.jl into sub files, tidy now - [31]
FY7CEMM2mac work on train.jl - [32]
ROFI4OLAcatch up, working on colour images - [33]
YXAKJSDTadded check_change_avianz_species! function to Labels.jl - [34]
VLYXSYADadded .ignore
Change contents
- file deletion: LICENSE
MIT LicenseCopyright (c) 2023 David Cary <cdecary@gmail.com> and contributorsPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE. - file deletion: Train.jl
# Train.jlexport train #beware Flux.train! is not Skraak.trainimport Base: length, getindeximport MLBaseusing CUDA, Dates, Images, Flux, Glob, JLD2, Noiseusing Random: shuffle!, seed!using Metalhead: ResNet#=function train(model_name::String,train_epochs::Int64,images::Vector{String},pretrain::Model=true,train_test_split::Float64 = 0.8,batch_size::Int64 = 64,)Note:Dont forget temp env, julia -t 4Assumes 224x224 pixel RGB images as png'sSaves jld2's in current directoryUse like:using Skraak, Globimages = glob("kiwi_set*/*/[N,K]/*.png") #11699814-element Vector{String}model = "/media/david/SSD2/PrimaryDataset/model_K1-9_original_set_CPU_epoch-7-0.9924-2024-03-05.jld2"train("K1-10_total_set_no_augumentation", 2, images, model, 0.97, 64)images = glob("*/[D,F,M,N]/*.png") #from SSD2/Clipsmodel = "/media/david/SSD2/PrimaryDataset/model_K1-5_CPU_epoch-6-0.9795-2023-12-16.jld2"train("DFMN1-5", 20, images, model)=#const LABELTOINDEX::Dict{String,Int32} = Dict()Model = Union{Bool,String}function train(model_name::String,train_epochs::Int64,images::Vector{String}, #glob_pattern::String = "*/*.png"pretrain::Model = true,train_test_split::Float64 = 0.8,batch_size::Int64 = 64,)epochs = 1:train_epochs#images = glob(glob_pattern) #|> shuffle! |> x -> x[1:640]@assert !isempty(images) "No png images found"@info "$(length(images)) images in dataset"label_to_index = labels_to_dict(images)register_label_to_index!(label_to_index)@info "Text labels translate to: " label_to_indexclasses = length(label_to_index)@assert classes >= 2 "At least 2 label classes are required, for example: kiwi, not_kiwi"@info "$classes classes in dataset"@info "Device: $device"ceiling = seil(length(images), batch_size)train_test_index = train_test_idx(ceiling, batch_size, train_test_split)train, train_sample, test = process_data(images, train_test_index, ceiling, batch_size)@info "Made data loaders"model = load_model(pretrain, classes)@info "Loaded model"opt = Flux.setup(Flux.Optimisers.Adam(1e-5), model)@info "Setup optimiser"@info "Training for $epochs epochs: " now()training_loop!(model,opt,train,train_sample,test,epochs,model_name,classes,label_to_index,)@info "Finished $(last(epochs)) epochs: " now()endstruct ImageContainer{T<:Vector}img::Tendstruct ValidationImageContainer{T<:Vector}img::TendContainer = Union{ImageContainer,ValidationImageContainer}function seil(n::Int, batch_size::Int)return n ÷ batch_size * batch_sizeendfunction train_test_idx(ceiling::Int, batch_size::Int, train_test_split::Float64)::Intt =#! format: offceiling ÷ batch_size * train_test_split |>round |>x -> x * batch_size |>x -> convert(Int, x)#! format: onendfunction labels_to_dict(list::Vector{String})::Dict{String,Int32}l =#! format: offmap(x -> split(x, "/")[end-1], list) |>unique |>sort |>x -> zip(x, 1:length(x)) |>Dict#! format: onreturn lend"""register_label_to_index!(label_to_index::Dict{String,Int32})This will replace the content of the global variable LABELTOINDEXwith the content intended by the caller.Thanks algunionhttps://discourse.julialang.org/t/dataloader-scope-troubles/105207/4"""function register_label_to_index!(label_to_index::Dict{String,Int32})empty!(LABELTOINDEX)merge!(LABELTOINDEX, label_to_index)enddevice = CUDA.functional() ? gpu : cpufunction process_data(array_of_file_names, train_test_index, ceiling, batch_size)seed!(1234)images = shuffle!(array_of_file_names)train =ImageContainer(images[1:train_test_index]) |> x -> make_dataloader(x, batch_size)train_sample =ValidationImageContainer(images[1:(ceiling-train_test_index)]) |>x -> make_dataloader(x, batch_size)test =ValidationImageContainer(images[train_test_index+1:ceiling]) |>x -> make_dataloader(x, batch_size)return train, train_sample, testendlength(data::ImageContainer) = length(data.img)length(data::ValidationImageContainer) = length(data.img)function getindex(data::ImageContainer{Vector{String}}, index::Int)path = data.img[index]img =#! format: offImages.load(path) |>#x -> Images.imresize(x, 224, 224) |>#x -> Images.RGB.(x) |>x -> Noise.add_gauss(x, (rand() * 0.2)) |>x -> apply_mask!(x, 3, 3, 12) |>x -> collect(channelview(float32.(x))) |>x -> permutedims(x, (3, 2, 1))#! format: ony = LABELTOINDEX[(split(path, "/")[end-1])]return img, yendfunction getindex(data::ValidationImageContainer{Vector{String}}, index::Int)path = data.img[index]img =#! format: offImages.load(path) |>#x -> Images.imresize(x, 224, 224) |>#x -> Images.RGB.(x) |>x -> collect(channelview(float32.(x))) |>x -> permutedims(x, (3, 2, 1))#! format: ony = LABELTOINDEX[(split(path, "/")[end-1])]return img, yend# assumes 224px square imagesfunction apply_mask!(img::Array{RGB{N0f8},2},max_number::Int = 3,min_size::Int = 3,max_size::Int = 22,)# horizontalfor range in get_random_ranges(max_number, min_size, max_size)img[range, :] .= RGB{N0f8}(0.7, 0.7, 0.7)end# verticalfor range in get_random_ranges(max_number, min_size, max_size)img[:, range] .= RGB{N0f8}(0.7, 0.7, 0.7)endreturn imgend# assumes 224px square imagesfunction get_random_ranges(max_number::Int, min_size::Int, max_size::Int)number = rand(0:max_number)ranges = []while length(ranges) < numberstart = rand(1:224)size = rand(min_size:max_size)if start + size > 224continueendpush!(ranges, start:start+size)endreturn rangesendfunction make_dataloader(container::Container, batch_size::Int)data =Flux.DataLoader(container; batchsize = batch_size, collate = true, parallel = true)device == gpu ? data = CuIterator(data) : nothingreturn dataend# see load_model() from predict, and belowfunction load_model(pretrain::Bool, classes::Int64)fst = Metalhead.ResNet(18, pretrain = pretrain).layerslst = Flux.Chain(AdaptiveMeanPool((1, 1)), Flux.flatten, Dense(512 => classes))model = Flux.Chain(fst[1], lst) |> devicereturn modelend#If model classes == desired classes I don't empty the last layer#That means that I can just train from where I left off for new data, DFMN model#Could be a gotcha if I want to train a different 4 class model, no need for a switch just yetfunction load_model(model_path::String, classes::Int64)model_state = JLD2.load(model_path, "model_state")model_classes = length(model_state[1][2][1][3][2])f = Metalhead.ResNet(18, pretrain = false).layersl = Flux.Chain(AdaptiveMeanPool((1, 1)), Flux.flatten, Dense(512 => model_classes))m = Flux.Chain(f[1], l)Flux.loadmodel!(m, model_state)if classes == model_classesmodel = m |> deviceelsefst = m.layerslst = Flux.Chain(AdaptiveMeanPool((1, 1)), Flux.flatten, Dense(512 => classes))model = Flux.Chain(fst[1], lst) |> deviceendreturn modelendfunction evaluate(m, d, c)good = 0count = 0pred = Int64[]actual = Int64[]for (x, y) in dp = Flux.onecold(m(x))good += sum(p .== y)count += length(y)append!(pred, p)append!(actual, y)endaccuracy = round(good / count, digits = 4)confusion_matrix = MLBase.confusmat(c, actual, pred)#freqtable(DataFrame(targets = actual, predicts = pred), :targets, :predicts)#roc=MLBase.roc(actual, pred, 100)#f1=MLBase.f1score(roc)return accuracy, confusion_matrix #, roc, f1endfunction train_epoch!(model; opt, train, classes)Flux.train!(model, train, opt) do m, x, yFlux.Losses.logitcrossentropy(m(x), Flux.onehotbatch(y, 1:classes))endendfunction dict_to_text_file(dict, model_name)text = ""for (key, value) in dicttext = text * "$(key) => $(value)\n"endopen("labels_$(model_name)-$(today()).txt", "w") do filewrite(file, text)end@info "Saved labels to file for future reference"endfunction training_loop!(model,opt,train,train_sample,test,epochs::UnitRange{Int64},model_name::String,classes,label_to_index,)@time eval, vcm = evaluate(model, test, classes)@info "warm up accuracy" accuracy = eval@info "warm up confusion matrix" vcma = 0for epoch in epochsprintln("")@info "Starting Epoch: $epoch"epoch == 1 && dict_to_text_file(label_to_index, model_name)@time train_epoch!(model; opt, train, classes)@time train_accuracy, train_confusion_matrix =evaluate(model, train_sample, classes)@info "Epoch: $epoch"@info "train" accuracy = train_accuracy@info "train" train_confusion_matrix@time test_accuracy, test_confusion_matrix = evaluate(model, test, classes)@info "test" accuracy = test_accuracy@info "test" test_confusion_matrix# number kiwi guessed right, assumes kiwi=1, not=2 (alphabetical)#test_confusion_matrix[1,1] > a && begin#a = test_confusion_matrix[1,1]let _model = cpu(model)jldsave("/media/david/SSD2/model_$(model_name)_CPU_epoch-$epoch-$test_accuracy-$(today()).jld2";model_state = Flux.state(_model),)@info "Saved a best_model"end#endendend - file deletion: Predict.jl
# Predict.jlusing WAV,DSP, Images, ThreadsX, Dates, DataFrames, CSV, Flux, CUDA, Metalhead, JLD2, FLAC, Globimport Base: length, getindex"""predict(glob_pattern::String, model::String)This function takes a glob pattern for folders (or a vector of folders) to run over, and a model path. It saves results in a csv in each folder, similar to opensoundscapeArgs:• glob pattern (folder/) or a vector of folders• model pathReturns: Nothing - This function saves csv files.I use this function to find kiwi from new data gathered on a trip. And to predict D/F/M/N for images clipped from primary detections.It works on both audio (wav or flac) and png images.Note:From Pomona-3/Pomona-3/Use like:using Skraakglob_pattern = "*/*/"model = "/media/david/SSD2/PrimaryDataset/model_K1-9_original_set_CPU_epoch-7-0.9924-2024-03-05.jld2"glob_pattern = "Clips_2024-10-21/"model = "/media/david/SSD1/Clips/model_DFMN1-5_CPU_epoch-18-0.9132-2024-01-29.jld2"predict(glob_pattern, model)"""function predict(glob_pattern::String, model::String)model = load_model_pred(model) |> devicefolders = glob(glob_pattern)@info "Folders: $folders"for folder in folders@info "Working on: $folder"predict_folder(folder, model)endendfunction predict(folders::Vector{String}, model::String)model = load_model_pred(model) |> device@info "Folders: $folders"for folder in folders@info "Working on: $folder"predict_folder(folder, model)endend#~~~~~ The guts ~~~~~#struct PredictImageContainer{T<:Vector}img::Tendlength(data::PredictImageContainer) = length(data.img)function getindex(data::PredictImageContainer{Vector{String}}, idx::Int)path = data.img[idx]img =#! format: offImages.load(path) |>x -> Images.imresize(x, 224, 224)|>x -> Images.RGB.(x) |>x -> collect(channelview(float32.(x))) |>x -> permutedims(x, (3, 2, 1))#! format: onreturn img, pathendfunction predict_image_folder(png_files::Vector{String}, model, folder::String)l = length(png_files)@assert (l > 0) "No png files present in $folder"@info "$(l) png_files in $folder"save_path = "$folder/preds-$(today()).csv"loader = png_loader(png_files)@time preds, files = predict_pngs(model, loader)f = split.(files, "/") |> x -> last.(x)df = DataFrame(file = f, label = preds)CSV.write("$save_path", df)endfunction png_loader(png_files::Vector{String})loader = Flux.DataLoader(PredictImageContainer(png_files);batchsize = 64,collate = true,parallel = true,)device == gpu ? loader = CuIterator(loader) : nothingreturn loaderendfunction predict_pngs(m, d)@info "Predicting..."pred = []path = []for (x, pth) in dp = Flux.onecold(m(x))append!(pred, p)append!(path, pth)endreturn pred, pathend# Predict from audio filesfunction predict_audio_folder(audio_files::Vector{String}, model, folder::String)l = length(audio_files)@assert (l > 0) "No wav or flac audio files present in $folder"@info "$(l) audio_files in $folder"df = DataFrame(file = String[],start_time = Float64[],end_time = Float64[],label = Int[],)save_path = "$folder/preds-$(today()).csv"CSV.write("$save_path", df)for file in audio_filesdf = predict_audio_file(file, model)CSV.write("$save_path", df, append = true)endendfunction predict_audio_file(file::String, model)#check form of opensoundscape preds.csv and needed by my make_clips@info "File: $file"@time data = audio_loader(file)pred = []time = []@time for (x, t) in datap = Flux.onecold(model(x))append!(pred, p)append!(time, t)endf = (repeat(["$file"], length(time)))df = DataFrame(:file => f,:start_time => first.(time),:end_time => last.(time),:label => pred,)sort!(df)return dfendfunction audio_loader(file::String, increment::Int = 5, divisor::Int = 2)raw_images, n_samples = get_images_from_audio(file::String, increment, divisor)images = reshape_images(raw_images, n_samples)start_time = 0:(increment/divisor):(n_samples-1)*(increment/divisor)end_time = increment:(increment/divisor):(n_samples+1)*(increment/divisor)time = collect(zip(start_time, end_time))loader = Flux.DataLoader((images, time), batchsize = n_samples, shuffle = false)device == gpu ? loader = CuIterator(loader) : nothing #check this works with gpureturn loaderendfunction reshape_images(raw_images, n_samples)images =#! format: offhcat(raw_images...) |>x -> reshape(x, (224, 224, 3, n_samples))#! format: onreturn imagesend# need to change divisor to a overlap fraction, chech interaction with audioloader()# if divisor is 0, then no overlap atmfunction get_images_from_audio(file::String, increment::Int = 5, divisor::Int = 2) #5s sample, 2.5s hopsignal, freq = load_audio_file(file)if freq > 16000signal, freq = resample_to_16000hz(signal, freq)endf = convert(Int, freq)inc = increment * f#hop = f * increment ÷ divisor #need guarunteed Int, maybe not anymore, refactorhop = 0 #f * increment / divisor |> x -> x == Inf ? 0 : trunc(Int, x)split_signal = DSP.arraysplit(signal[:, 1], inc, hop)raw_images = ThreadsX.map(x -> get_image_from_sample(x, f), split_signal)n_samples = length(raw_images)return raw_images, n_samplesendfunction load_audio_file(file::String)ext = split(file, ".")[end]@assert ext in ["WAV", "wav", "flac"] "Unsupported audio file type, requires wav or flac."if ext in ["WAV", "wav"]signal, freq = WAV.wavread(file)elsesignal, freq = load(file)end@assert !isempty(signal[:, 1]) "$file seems to be empty, could it be corrupted?\nYou could delete it, or replace it with a known\ngood version from SD card or backup."return signal, freqendfunction resample_to_16000hz(signal, freq)signal = DSP.resample(signal, 16000.0f0 / freq; dims = 1)freq = 16000return signal, freqend############### PYTHON Opensoundscape #################=# Dont forget conda activate opensoundscape# Dont forget to modify file names and glob pattern# Run script in Pomona-2, hard code trip date in the glob# python /media/david/USB/Skraak/src/predict.pyfrom opensoundscape.torch.models.cnn import load_modelimport opensoundscapeimport torchfrom pathlib import Pathimport numpy as npimport pandas as pdfrom glob import globimport osfrom datetime import datetimemodel = load_model('/home/david/best.model0')# folders = glob('./*/2023-?????/')# folders = glob('./*/*/2024-05-0?')folders = glob('./*/2024-10-18/')for folder in folders:os.chdir(folder)print(folder, ' start: ', datetime.now())# Beware, secretary island files are .wavfield_recordings = glob('./*.[W,w][A,a][V,v]')scores, preds, unsafe = model.predict(field_recordings,binary_preds = 'single_target',overlap_fraction = 0.5,batch_size = 128,num_workers = 12)scores.to_csv("scores-2024-10-21.csv")preds.to_csv("preds-2024-10-21.csv")os.chdir('../..') # Be careful this matches the glob on line 284print(folder, ' done: ', datetime.now())print()print()=##=Kahurangifolders = glob('./*/')for folder in folders:os.chdir(folder)print(folder, ' start: ', datetime.now())# Beware, secretary island files are .wavfield_recordings = glob('./*.[W,w][A,a][V,v]')scores, preds, unsafe = model.predict(field_recordings,binary_preds = 'single_target',overlap_fraction = 0.5,batch_size = 128,num_workers = 12)scores.to_csv("scores-2024-10-21.csv")preds.to_csv("preds-2024-10-21.csv")os.chdir('./..') # Be careful this matches the glob on line 284print(folder, ' done: ', datetime.now())print()print()=## Python 3.8.12, opensoundscape 0.7.1function resample_to_8000hz(signal, freq)signal = DSP.resample(signal, 8000.0f0 / freq; dims = 1)freq = 8000return signal, freqendfunction get_image_for_inference(sample, f)image =#! format: offget_image_from_sample(sample, f) |># x -> collect(channelview(float32.(x))) |>x -> permutedims(x, (3, 2, 1))#! format: onreturn imageend=##= not needed# Start time and end time for each 5s audio clip, in seconds relative to the start of the file.# see load_model() from train, different input typesfunction load_model_pred(model_path::String)model_state = JLD2.load(model_path, "model_state")model_classes = length(model_state[1][2][1][3][2])f = Metalhead.ResNet(18, pretrain = false).layersl = Flux.Chain(AdaptiveMeanPool((1, 1)), Flux.flatten, Dense(512 => model_classes))model = Flux.Chain(f[1], l)Flux.loadmodel!(model, model_state)return modelend#=function load_bson(model_path::String)BSON.@load model_path modelend=#function predict_folder(folder::String, model)wav = glob("$folder/*.[W,w][A,a][V,v]")flac = glob("$folder/*.flac")audio_files = vcat(wav, flac) #if wav and flac both present will predict on allpng_files = glob("$folder/*.png")#it will predict on images when both images and audio presentif isempty(png_files)length(audio_files) > 0 ? predict_audio_folder(audio_files, model, folder) :@info "No png, flac, wav, WAV files present in $folder"elsepredict_image_folder(png_files, model, folder)endenddevice = CUDA.functional() ? gpu : cpu# Predict from png images@info "Model classes: $model_classes"julia -t 4Dont forget temp environment: ] activate --tempexport predictexport get_images_from_audio - replacement in src/Utility.jl at line 5
using CSV, DataFrames, Dates, Glob, HTTP, Images, JSON3, TimeZones, WAV, DataFramesMetausing CSV,DataFrames,Dates,Glob,HTTP,ImageTransformations,JSON3,TimeZones,WAV,DataFramesMeta - replacement in src/Utility.jl at line 37
p = glob("$folder/*.png")p = Glob.glob("$folder/*.png") - replacement in src/Utility.jl at line 42
w = glob("$folder/*.[W,w][A,a][V,v]")w = Glob.glob("$folder/*.[W,w][A,a][V,v]") - replacement in src/Utility.jl at line 72
a=glob("*/*.png")a=Glob.glob("*/*.png") - replacement in src/Utility.jl at line 80
small_image = imresize(load(name), (x, y))small_image = ImageTransformations.imresize(load(name), (x, y)) - replacement in src/Utility.jl at line 95
df = DataFrame(Date=[], Dawn=[], Dusk=[])df = DataFrames.DataFrame(Date=[], Dawn=[], Dusk=[]) - edit in src/Utility.jl at line 105
#####deprecated now have a big sunset_sunrise_utc.csv to work from - edit in src/Utility.jl at line 108
#deprecated now have a big sunset_sunrise_utc.csv to work from - replacement in src/Utility.jl at line 128
function dawn_dusk_lt_of_sunrise_sunset_utc(file::String)df = DataFrame(CSV.File(file))#dawn_dusk is local time, sunrise_sunret is utcfunction dawn_dusk_of_sunrise_sunset(file::String)df = DataFrames.DataFrame(CSV.File(file)) - replacement in src/Utility.jl at line 168
df = DataFrame([name => [] for name in cols])df = DataFrames.DataFrame([name => [] for name in cols]) - replacement in src/Utility.jl at line 252
a = glob("*/2022-12-17/")a = Glob.glob("*/2022-12-17/") - replacement in src/Utility.jl at line 256
files = glob("*.WAV")files = Glob.glob("*.WAV") - edit in src/Utility.jl at line 298[5.329751]
function resample_to_16000hz(signal, freq)signal = DSP.resample(signal, 16000.0f0 / freq; dims = 1)freq = 16000return signal, freqendfunction resample_to_8000hz(signal, freq)signal = DSP.resample(signal, 8000.0f0 / freq; dims = 1)freq = 8000return signal, freqend - replacement in src/Skraak.jl at line 12[5.356020]→[5.475:497](∅→∅),[5.497]→[5.35:55](∅→∅),[5.35]→[5.35:55](∅→∅),[5.81]→[5.81:82](∅→∅),[5.82]→[5.360059:360071](∅→∅),[5.360059]→[5.360059:360071](∅→∅)
include("Predict.jl")include("Train.jl")end # module[5.356020]end # Skraak module - replacement in src/Labels.jl at line 13
a=glob("[M,F,D,N]/*.png")df = DataFrame(file=a)a=Glob.glob("[M,F,D,N]/*.png")df = DataFrames.DataFrame(file=a) - replacement in src/Labels.jl at line 21
df=DataFrame(CSV.File("actual_mfdn.csv"))df=DataFrames.DataFrame(CSV.File("actual_mfdn.csv")) - replacement in src/Labels.jl at line 39
paths = append!(paths, glob("$l/*.png"))paths = append!(paths, Glob.glob("$l/*.png")) - replacement in src/Labels.jl at line 41
df = DataFrame(file = paths)df = DataFrames.DataFrame(file = paths) - edit in src/Labels.jl at line 46
"""aggregate_labels(actual="actual.csv", outfile="labels.csv") - edit in src/Labels.jl at line 47
file[D, F, M, N]/C05-2023-04-15-20230219_223000-380-470.pngThis function takes the csv output from my hand classification and ouputs a df, and csv for insertion into AudioData.duckdb using the duckdb cli or using DFto.audiodata_db()assumes run from Clips_xxxx-xx-xx folder and that "actual.csv" present if not specified.returns a dataframeusing CSV, DataFrames, DataFramesMeta""" - edit in src/Labels.jl at line 73
"""aggregate_labels(actual="actual.csv", outfile="labels.csv")file[D, F, M, N]/C05-2023-04-15-20230219_223000-380-470.pngThis function takes the csv output from my hand classification and ouputs a df, and csv for insertion into AudioData.duckdb using the duckdb cli or using DFto.audiodata_db()assumes run from Clips_xxxx-xx-xx folder and that "actual.csv" present if not specified.returns a dataframeusing CSV, DataFrames, DataFramesMeta""" - replacement in src/Labels.jl at line 91
df = DataFrame(CSV.File(actual))df = DataFrames.DataFrame(CSV.File(actual)) - replacement in src/Labels.jl at line 172
# a=glob("*/*/*.Table.1.selections.txt")# a=Glob.glob("*/*/*.Table.1.selections.txt") - replacement in src/Labels.jl at line 176
df = DataFrame(CSV.File(f))df = DataFrames.DataFrame(CSV.File(f)) - replacement in src/Labels.jl at line 202
df = DataFrame(df = DataFrames.DataFrame( - replacement in src/Labels.jl at line 231
df = DataFrame(df = DataFrames.DataFrame( - replacement in src/Labels.jl at line 260
# a=glob("*.WAV.data")# a=Glob.glob("*.WAV.data") - replacement in src/Labels.jl at line 294
files = glob("$folder/*.['W','w']['A','a']['V','v'].data")df = DataFrame(files = Glob.glob("$folder/*.['W','w']['A','a']['V','v'].data")df = DataFrames.DataFrame( - replacement in src/Labels.jl at line 313
files = glob("$folder/*.Table.1.selections.txt")df = DataFrame(files = Glob.glob("$folder/*.Table.1.selections.txt")df = DataFrames.DataFrame( - replacement in src/Labels.jl at line 323
df1 = DataFrame(CSV.File(file))df1 = DataFrames.DataFrame(CSV.File(file)) - replacement in src/FileMetaData.jl at line 9
# needs SSD1 present for dawn_dusk.csv# needs SSD1 present for dawn_dusk.csv (not anymore, gets from dddict) - replacement in src/FileMetaData.jl at line 12
folders=glob("*/2024-10-18/")folders=Glob.glob("*/2024-10-18/") - replacement in src/FileMetaData.jl at line 55
df = DataFrame(df = DataFrames.DataFrame( - replacement in src/FileMetaData.jl at line 77
wav_list = glob("*.WAV") |> sortwav_list = Glob.glob("*.WAV") |> sort - replacement in src/FileMetaData.jl at line 92
waypoint = glob("*.gpx")waypoint = Glob.glob("*.gpx") - replacement in src/FileMetaData.jl at line 100
_, _, _, binary_metadata_start = wavread(wav_list[1])_, _, _, binary_metadata_start = WAV.wavread(wav_list[1]) - replacement in src/FileMetaData.jl at line 128
_, _, _, binary_metadata_end = wavread(wav_list[end])_, _, _, binary_metadata_end = WAV.wavread(wav_list[end]) - replacement in src/FileMetaData.jl at line 165
audio_data, sample_rate, _, binary_metadata = wavread(file)audio_data, sample_rate, _, binary_metadata = WAV.wavread(file) - replacement in src/ConstructPrimaryDataset.jl at line 26
df = DataFrame(CSV.File(input_file))df = DataFrames.DataFrame(CSV.File(input_file)) - replacement in src/ConstructPrimaryDataset.jl at line 45
b = glob("$l/*/$f")b = Glob.glob("$l/*/$f") - replacement in src/ConstructPrimaryDataset.jl at line 62
gdf = groupby(df, :key)gdf = DataFrames.groupby(df, :key) - replacement in src/ConstructPrimaryDataset.jl at line 67
#signal, freq = wavread("kiwi_set_2023-11-13/$folder/$file")#signal, freq = WAV.wavread("kiwi_set_2023-11-13/$folder/$file") - replacement in src/ConstructPrimaryDataset.jl at line 75
ldf = DataFrame(second = 1:duration, kiwi = false)ldf = DataFrames.DataFrame(second = 1:duration, kiwi = false) - replacement in src/ConstructPrimaryDataset.jl at line 92
plot = get_image_from_sample(sample, freq)plot = Skraak.get_image_from_sample(sample, freq) - replacement in src/ConstructPrimaryDataset.jl at line 114
plot = get_image_from_sample(sample, freq)plot = Skraak.get_image_from_sample(sample, freq) - replacement in src/Clips.jl at line 11
Images,ImageTransformations, - edit in src/Clips.jl at line 21[5.718]→[5.12570:13038](∅→∅),[5.12570]→[5.12570:13038](∅→∅),[5.13038]→[5.859:929](∅→∅),[5.929]→[5.13089:13189](∅→∅),[5.13089]→[5.13089:13189](∅→∅)
make_clips(preds_path::String, dawn_dusk_dict::Dict{Dates.Date, Tuple{Dates.DateTime, Dates.DateTime}} = construct_dawn_dusk_dict("/media/david/SSD1/dawn_dusk.csv"))This function takes a preds.csv files and generatesfile names, wav's, spectrograms etc to be reviewed.it calls night() and may call construct_dawn_dusk_dict() unless the dict is globally defined and passed inIt should be run from Pomona-1/, Pomona-2/ or Pomona-3/, assumes it is, it uses the pathIt saves wav and png files to current working directory, ie Pomona-3need to use a try/catch because the 2 assert functions thow an error to short circuit the function - replacement in src/Clips.jl at line 22
predictions = glob("*/2024-10-18/preds*")predictions = Glob.glob("*/2024-10-18/preds*") - edit in src/Clips.jl at line 38
=# - edit in src/Clips.jl at line 42
=#"""make_clips(preds_path::String, dawn_dusk_dict::Dict{Dates.Date, Tuple{Dates.DateTime, Dates.DateTime}} = construct_dawn_dusk_dict("/media/david/SSD1/dawn_dusk.csv"))This function takes a preds.csv files and generatesfile names, wav's, spectrograms etc to be reviewed.it calls night() and may call construct_dawn_dusk_dict() unless the dict is globally defined and passed inIt should be run from Pomona-1/, Pomona-2/ or Pomona-3/, assumes it is, it uses the pathIt saves wav and png files to current working directory, ie Pomona-3need to use a try/catch because the 2 assert functions thow an error to short circuit the function""" - replacement in src/Clips.jl at line 67
DataFrame(CSV.File(preds_path)) |>x -> assert_not_empty(x, preds_path) |>x -> rename_column!(x, "1.0", "label") |> #can remove now, needs to be labelx -> assert_detections_present(x, label, location, trip_date) |>x -> filter_positives!(x, label) |>DataFrames.DataFrame(CSV.File(preds_path)) |>x -> Skraak.assert_not_empty(x, preds_path) |>x -> Skraak.rename_column!(x, "1.0", "label") |> #can remove now, needs to be labelx -> Skraak.assert_detections_present(x, label, location, trip_date) |>x -> Skraak.filter_positives!(x, label) |> - replacement in src/Clips.jl at line 73
x -> night_or_day!(x, dawn_dusk_dict, night) |> #true=night, false=dayx -> Skraak.night_or_day!(x, dawn_dusk_dict, night) |> #true=night, false=day - replacement in src/Clips.jl at line 79
file_name, extension = path_to_file_string(v.file[1])file_name, extension = Skraak.path_to_file_string(v.file[1]) - replacement in src/Clips.jl at line 82
detections = cluster_detections(start_times)detections = Skraak.cluster_detections(start_times) - replacement in src/Clips.jl at line 85
signal, freq = wavread("$location/$trip_date/$(file_name).$(extension)")##signal, freq = wavread("$location/$h/$trip_date/$(file_name).$(extension)")signal, freq = WAV.wavread("$location/$trip_date/$(file_name).$(extension)")##signal, freq = WAV.wavread("$location/$h/$trip_date/$(file_name).$(extension)") - replacement in src/Clips.jl at line 94
st, en = calculate_clip_start_end(detection, freq, length_signal)st, en = Skraak.calculate_clip_start_end(detection, freq, length_signal) - replacement in src/Clips.jl at line 102
wavwrite(sample, "$outfile.wav", Fs = Int(freq))WAV.wavwrite(sample, "$outfile.wav", Fs = Int(freq)) - replacement in src/Clips.jl at line 106
image = get_image_from_sample(sample, freq)image = Skraak.get_image_from_sample(sample, freq) - replacement in src/Clips.jl at line 154
file_string = path_to_file_string(file) |> firstfile_string = Skraak.path_to_file_string(file) |> first - replacement in src/Clips.jl at line 165
@transform!(df, @byrow :DateTime = filename_to_datetime!(String(:file)))@transform!(df, @byrow :DateTime = Skraak.filename_to_datetime!(String(:file))) - replacement in src/Clips.jl at line 175
night_time ? @subset!(df, @byrow night(:DateTime, dawn_dusk_dict)) :night_time ? @subset!(df, @byrow Skraak.night(:DateTime, dawn_dusk_dict)) : - replacement in src/Clips.jl at line 181
gdf = groupby(df, :file)gdf = DataFrames.groupby(df, :file) - replacement in src/Clips.jl at line 227
x -> applycolourmap(x, cmap("L4")) |>x -> PerceptualColourMaps.applycolourmap(x, cmap("L4")) |> - replacement in src/Clips.jl at line 229
x -> imresize(x, 224, 224) |>x -> ImageTransformations.imresize(x, 224, 224) |> - edit in src/Clips.jl at line 234
#=dict = construct_dawn_dusk_dict("/Volumes/SSD1/dawn_dusk.csv") - edit in src/Clips.jl at line 238
df=DataFrames.DataFrame(dict)df=CSV.File("dawn_dusk.csv") |> DataFrameopen("dict.jl", "w") do filewrite(file, "const dddict = Dict(")for row in eachrow(df)line="\tDates.Date(\"$(row.Date)\") =>(Dates.DateTime(\"$(row.Dawn)\"), Dates.DateTime(\"$(row.Dusk)\")),\n"write(file, line)endwrite(file, ")")endusing CSV, DataFrames=# - replacement in src/Clips.jl at line 254
sun = DataFrame(CSV.File(file))sun = DataFrames.DataFrame(CSV.File(file)) - replacement in src/Clips.jl at line 256
Takes dawn_dusk.csv and returns a dict to be consumeed by night().Takes dawn_dusk.csv and returns a dict to be consumed by night(). - replacement in src/Clips.jl at line 260
I use this to decide if a file with a local time encoded name was recorded at nightdict = construct_dawn_dusk_dict("/Volumes/SSD1/dawn_dusk.csv")using CSV, DataFramesI use this to decide if a file with a local time encoded name was recorded at nigh - replacement in src/Clips.jl at line 263
sun = DataFrame(CSV.File(file))sun = DataFrames.DataFrame(CSV.File(file)) - replacement in src/Clips.jl at line 301
p = glob("*.png")w = glob("*.[W,w][A,a][V,v]")p = Glob.glob("*.png")w = Glob.glob("*.[W,w][A,a][V,v]") - replacement in src/Clips.jl at line 330
wavs = glob("*.wav")wavs = Glob.glob("*.wav") - replacement in src/Clips.jl at line 336
signal, freq = wavread("$file")signal, freq = WAV.wavread("$file") - replacement in src/Clips.jl at line 343
image = get_image_from_sample(part, freq)image = Skraak.get_image_from_sample(part, freq) - replacement in src/Clips.jl at line 377
a=glob("*/*/*.csv")b=glob("*/*/*/*.csv")c=glob("*/*/*/*/*.csv")a=Glob.glob("*/*/*.csv")b=Glob.glob("*/*/*/*.csv")c=Glob.glob("*/*/*/*/*.csv") - replacement in src/Clips.jl at line 405
DataFrame(CSV.File(preds_path)) |>DataFrames.DataFrame(CSV.File(preds_path)) |> - replacement in src/Clips.jl at line 421
signal, freq = Skraak.wavread("$pth$(file_name).$(extension)")signal, freq = WAV.wavread("$pth$(file_name).$(extension)") - replacement in src/Clips.jl at line 439
Skraak.wavwrite(sample, "$outfile.wav", Fs = Int(freq))Skraak.WAV.wavwrite(sample, "$outfile.wav", Fs = Int(freq)) - replacement in src/Clips.jl at line 451
a=glob("*/*/preds-2024-08-29.csv")b=glob("*/*/*/preds-2024-08-29.csv")c=glob("*/*/*/*/preds-2024-08-29.csv")a=Glob.glob("*/*/preds-2024-08-29.csv")b=Glob.glob("*/*/*/preds-2024-08-29.csv")c=Glob.glob("*/*/*/*/preds-2024-08-29.csv") - replacement in src/Clips.jl at line 456
predictions = glob("*/*/preds-2024-10-21.csv")predictions = Glob.glob("*/*/preds-2024-10-21.csv") - edit in Project.toml at line 8
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - edit in Project.toml at line 16
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" - replacement in Project.toml at line 18
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819"ImageTransformations = "02fcd773-0e25-5acc-982a-7f6622650795" - edit in Project.toml at line 20[5.772]→[5.1147:1195](∅→∅),[5.386213]→[5.1147:1195](∅→∅),[5.1195]→[5.386213:386311](∅→∅),[5.386213]→[5.386213:386311](∅→∅)
MLBase = "f0e99cf1-93fa-52ec-9ecc-5026115318e0"Metalhead = "dbeba491-748d-5e0e-a39e-b530a07fa0cc"Noise = "81d43f40-5267-43b7-ae1c-8b967f377efa" - edit in Project.toml at line 24
ThreadsX = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d" - edit in Project.toml at line 27
cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" - replacement in Manifest.toml at line 5
project_hash = "05f43fbbf5550775beb65cc441429ae846ed9652"project_hash = "8a2989b77560f8052503af51052115b4c49ef719" - edit in Manifest.toml at line 17[5.1348]→[5.2180:2200](∅→∅),[5.2200]→[5.859:1029](∅→∅),[5.1029]→[5.2375:2421](∅→∅),[5.1443]→[5.2375:2421](∅→∅),[5.2375]→[5.2375:2421](∅→∅),[5.2421]→[5.1030:1049](∅→∅),[5.1049]→[5.1348:1349](∅→∅),[5.1463]→[5.1348:1349](∅→∅),[5.2440]→[5.1348:1349](∅→∅),[5.1348]→[5.1348:1349](∅→∅),[5.1349]→[5.2441:2511](∅→∅),[5.2511]→[5.1050:1082](∅→∅),[5.1082]→[5.2511:2649](∅→∅),[5.2511]→[5.2511:2649](∅→∅),[5.2649]→[5.1083:1113](∅→∅),[5.1113]→[5.1464:1500](∅→∅),[5.2649]→[5.1464:1500](∅→∅),[5.1500]→[5.2649:2734](∅→∅),[5.2649]→[5.2649:2734](∅→∅),[5.2734]→[5.1114:1165](∅→∅),[5.1165]→[5.2734:2962](∅→∅),[5.2734]→[5.2734:2962](∅→∅),[5.2962]→[5.1166:1216](∅→∅),[5.1216]→[5.1501:1554](∅→∅),[5.2962]→[5.1501:1554](∅→∅),[5.1554]→[5.2962:2963](∅→∅),[5.2962]→[5.2962:2963](∅→∅),[5.2963]→[5.1349:1401](∅→∅),[5.1349]→[5.1349:1401](∅→∅),[5.1401]→[5.1217:1276](∅→∅),[5.1075]→[5.1460:1506](∅→∅),[5.1276]→[5.1460:1506](∅→∅),[5.3023]→[5.1460:1506](∅→∅),[5.1460]→[5.1460:1506](∅→∅),[5.1506]→[5.1277:1295](∅→∅),[5.1094]→[5.1524:1765](∅→∅),[5.1295]→[5.1524:1765](∅→∅),[5.3042]→[5.1524:1765](∅→∅),[5.1524]→[5.1524:1765](∅→∅)
[[deps.Accessors]]deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"]git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8"uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"version = "0.1.38"[deps.Accessors.extensions]AccessorsAxisKeysExt = "AxisKeys"AccessorsDatesExt = "Dates"AccessorsIntervalSetsExt = "IntervalSets"AccessorsStaticArraysExt = "StaticArrays"AccessorsStructArraysExt = "StructArrays"AccessorsTestExt = "Test"AccessorsUnitfulExt = "Unitful"[deps.Accessors.weakdeps]AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"Requires = "ae029012-a4dd-5104-9daa-d747884805df"StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"[[deps.Adapt]]deps = ["LinearAlgebra", "Requires"]git-tree-sha1 = "50c3c56a52972d78e8be9fd135bfb91c9574c140"uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"version = "4.1.1"weakdeps = ["StaticArrays"][deps.Adapt.extensions]AdaptStaticArraysExt = "StaticArrays"[[deps.ArgCheck]]git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4"uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197"version = "2.3.0" - edit in Manifest.toml at line 30
[[deps.Atomix]]deps = ["UnsafeAtomics"]git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be"uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458"version = "0.1.0" - edit in Manifest.toml at line 42[5.3511]→[5.3511:3584](∅→∅),[5.3584]→[5.1375:1434](∅→∅),[5.1434]→[5.3643:3689](∅→∅),[5.3643]→[5.3643:3689](∅→∅),[5.3689]→[5.1435:1453](∅→∅),[5.1453]→[5.3707:3722](∅→∅),[5.3707]→[5.3707:3722](∅→∅),[5.3722]→[5.3122:3181](∅→∅),[5.3181]→[5.3781:3827](∅→∅),[5.3781]→[5.3781:3827](∅→∅),[5.3827]→[5.3182:3200](∅→∅),[5.3200]→[5.3845:3864](∅→∅),[5.3845]→[5.3845:3864](∅→∅),[5.3864]→[5.1454:1600](∅→∅),[5.1600]→[5.4029:4075](∅→∅),[5.3260]→[5.4029:4075](∅→∅),[5.4029]→[5.4029:4075](∅→∅),[5.4075]→[5.1601:1619](∅→∅),[5.1619]→[5.4094:4306](∅→∅),[5.3280]→[5.4094:4306](∅→∅),[5.4094]→[5.4094:4306](∅→∅),[5.4306]→[5.1620:1653](∅→∅),[5.1653]→[5.4306:4611](∅→∅),[5.4306]→[5.4306:4611](∅→∅),[5.4611]→[5.1654:1706](∅→∅),[5.1706]→[5.4611:4668](∅→∅),[5.4611]→[5.4611:4668](∅→∅)
[[deps.BFloat16s]]deps = ["LinearAlgebra", "Printf", "Random", "Test"]git-tree-sha1 = "2c7cc21e8678eff479978a0a2ef5ce2f51b63dff"uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b"version = "0.5.0"[[deps.BSON]]git-tree-sha1 = "4c3e506685c527ac6a54ccc0c8c76fd6f91b42fb"uuid = "fbb218c0-5317-5bc6-957e-2ee96dd4b1f0"version = "0.3.9"[[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" - edit in Manifest.toml at line 45
[[deps.Baselet]]git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e"uuid = "9718e550-a3fa-408a-8086-8db961cd8217"version = "0.1.1" - edit in Manifest.toml at line 67[5.1635]→[5.5494:5509](∅→∅),[5.2029]→[5.5494:5509](∅→∅),[5.5494]→[5.5494:5509](∅→∅),[5.5509]→[5.2030:2550](∅→∅),[5.2550]→[5.6018:6064](∅→∅),[5.3864]→[5.6018:6064](∅→∅),[5.6018]→[5.6018:6064](∅→∅),[5.6064]→[5.2551:2569](∅→∅),[5.2569]→[5.6132:6201](∅→∅),[5.6132]→[5.6132:6201](∅→∅),[5.6201]→[5.2570:2603](∅→∅),[5.2603]→[5.6201:6246](∅→∅),[5.6201]→[5.6201:6246](∅→∅),[5.6246]→[5.2604:2808](∅→∅),[5.2808]→[5.6246:6272](∅→∅),[5.6246]→[5.6246:6272](∅→∅),[5.6272]→[5.2809:2920](∅→∅),[5.2920]→[5.6400:6446](∅→∅),[5.6400]→[5.6400:6446](∅→∅),[5.6446]→[5.2921:2942](∅→∅),[5.2942]→[5.6466:6516](∅→∅),[5.6466]→[5.6466:6516](∅→∅),[5.6516]→[5.2943:3002](∅→∅),[5.3002]→[5.6575:6621](∅→∅),[5.3943]→[5.6575:6621](∅→∅),[5.6575]→[5.6575:6621](∅→∅),[5.6621]→[5.3003:3021](∅→∅),[5.3021]→[5.6639:6755](∅→∅),[5.3962]→[5.6639:6755](∅→∅),[5.6639]→[5.6639:6755](∅→∅),[5.6755]→[5.3022:3081](∅→∅),[5.3081]→[5.6814:6860](∅→∅),[5.4022]→[5.6814:6860](∅→∅),[5.6814]→[5.6814:6860](∅→∅),[5.6860]→[5.3082:3103](∅→∅),[5.3103]→[5.6881:6991](∅→∅),[5.4044]→[5.6881:6991](∅→∅),[5.6881]→[5.6881:6991](∅→∅),[5.6991]→[5.3104:3163](∅→∅),[5.3163]→[5.7050:7096](∅→∅),[5.7050]→[5.7050:7096](∅→∅),[5.7096]→[5.3164:3184](∅→∅)
[[deps.CUDA]]deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "StaticArrays", "Statistics", "demumble_jll"]git-tree-sha1 = "e0725a467822697171af4dae15cec10b4fc19053"uuid = "052768ef-5323-5732-b1bb-66c8b64840ba"version = "5.5.2"[deps.CUDA.extensions]ChainRulesCoreExt = "ChainRulesCore"EnzymeCoreExt = "EnzymeCore"SpecialFunctionsExt = "SpecialFunctions"[deps.CUDA.weakdeps]ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"[[deps.CUDA_Driver_jll]]deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]git-tree-sha1 = "ccd1e54610c222fadfd4737dac66bff786f63656"uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc"version = "0.10.3+0"[[deps.CUDA_Runtime_Discovery]]deps = ["Libdl"]git-tree-sha1 = "33576c7c1b2500f8e7e6baa082e04563203b3a45"uuid = "1af6417a-86b4-443c-805f-a4643ffb695f"version = "0.3.5"[[deps.CUDA_Runtime_jll]]deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]git-tree-sha1 = "e43727b237b2879a34391eeb81887699a26f8f2f"uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2"version = "0.15.3+0"[[deps.CUDNN_jll]]deps = ["Artifacts", "CUDA_Runtime_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]git-tree-sha1 = "9851af16a2f357a793daa0f13634c82bc7e40419"uuid = "62b44479-cb7b-5706-934f-f13b2eb2e645"version = "9.4.0+0" - edit in Manifest.toml at line 78[5.3263]→[5.8049:8292](∅→∅),[5.10260971]→[5.8049:8292](∅→∅),[5.8292]→[5.3264:3323](∅→∅),[5.3323]→[5.8351:8397](∅→∅),[5.4104]→[5.8351:8397](∅→∅),[5.8351]→[5.8351:8397](∅→∅),[5.8397]→[5.3324:3343](∅→∅)
[[deps.ChainRules]]deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"]git-tree-sha1 = "be227d253d132a6d57f9ccf5f67c0fb6488afd87"uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2"version = "1.71.0" - edit in Manifest.toml at line 125[5.10261157]→[5.10326:10356](∅→∅),[5.10356]→[5.3744:3825](∅→∅),[5.3825]→[5.10445:10491](∅→∅),[5.10445]→[5.10445:10491](∅→∅),[5.10491]→[5.3826:3844](∅→∅),[5.3844]→[5.10509:10510](∅→∅),[5.10509]→[5.10509:10510](∅→∅)
[[deps.CommonSubexpressions]]deps = ["MacroTools"]git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5"uuid = "bbf7d656-a473-5ed7-a52c-81e309532950"version = "0.3.1" - edit in Manifest.toml at line 139[5.1369]→[5.10616:10766](∅→∅),[5.3945]→[5.10616:10766](∅→∅),[5.10261562]→[5.10616:10766](∅→∅),[5.10766]→[5.4632:4664](∅→∅)
[[deps.CompositionsBase]]git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"version = "0.1.2"weakdeps = ["InverseFunctions"] - edit in Manifest.toml at line 140
[deps.CompositionsBase.extensions]CompositionsBaseInverseFunctionsExt = "InverseFunctions" - edit in Manifest.toml at line 168
[[deps.ContextVariablesX]]deps = ["Compat", "Logging", "UUIDs"]git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc"uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5"version = "0.1.3" - edit in Manifest.toml at line 227[5.12215]→[5.12215:12364](∅→∅),[5.12364]→[5.10263999:10264163](∅→∅),[5.10263999]→[5.10263999:10264163](∅→∅),[5.10264163]→[5.12365:12774](∅→∅)
[[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" - edit in Manifest.toml at line 312[5.14786]→[5.14786:14936](∅→∅),[5.14936]→[5.5360:5419](∅→∅),[5.5419]→[5.14995:15041](∅→∅),[5.14995]→[5.14995:15041](∅→∅),[5.15041]→[5.5420:5438](∅→∅),[5.5438]→[5.15059:15232](∅→∅),[5.15059]→[5.15059:15232](∅→∅),[5.15232]→[5.10265521:10265522](∅→∅),[5.10265521]→[5.10265521:10265522](∅→∅)
[[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" - edit in Manifest.toml at line 331[5.10266183]→[5.15313:15334](∅→∅),[5.15334]→[5.5759:5843](∅→∅),[5.5843]→[5.15428:15474](∅→∅),[5.15428]→[5.15428:15474](∅→∅),[5.15474]→[5.5844:5863](∅→∅),[5.5863]→[5.10266183:10266184](∅→∅),[5.15492]→[5.10266183:10266184](∅→∅),[5.10266183]→[5.10266183:10266184](∅→∅),[5.10266184]→[5.15493:15849](∅→∅)
[[deps.FillArrays]]deps = ["LinearAlgebra"]git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a"uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"version = "1.13.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" - edit in Manifest.toml at line 343[5.6055]→[5.10266712:10266713](∅→∅),[5.16102]→[5.10266712:10266713](∅→∅),[5.10266712]→[5.10266712:10266713](∅→∅),[5.10266713]→[5.16103:16117](∅→∅),[5.16117]→[5.6056:6398](∅→∅),[5.2256]→[5.16430:16476](∅→∅),[5.5318]→[5.16430:16476](∅→∅),[5.6398]→[5.16430:16476](∅→∅),[5.16430]→[5.16430:16476](∅→∅),[5.16476]→[5.6399:6419](∅→∅)
[[deps.Flux]]deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLDataDevices", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "Setfield", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"]git-tree-sha1 = "df520a0727f843576801a0294f5be1a94be28e23"uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c"version = "0.14.25" - edit in Manifest.toml at line 344[5.16496]→[5.16496:16618](∅→∅),[5.16618]→[5.6420:6517](∅→∅),[5.6517]→[5.16645:16773](∅→∅),[5.16645]→[5.16645:16773](∅→∅),[5.16773]→[5.6518:6669](∅→∅),[5.6669]→[5.16824:17059](∅→∅),[5.16824]→[5.16824:17059](∅→∅),[5.17059]→[5.6670:6729](∅→∅),[5.6729]→[5.17118:17164](∅→∅),[5.17118]→[5.17118:17164](∅→∅),[5.17164]→[5.6730:6750](∅→∅),[5.6750]→[5.17184:17296](∅→∅),[5.17184]→[5.17184:17296](∅→∅),[5.17506]→[5.17506:17549](∅→∅),[5.17549]→[5.6751:6810](∅→∅),[5.5399]→[5.17608:17654](∅→∅),[5.6810]→[5.17608:17654](∅→∅),[5.17608]→[5.17608:17654](∅→∅),[5.17654]→[5.6811:6830](∅→∅),[5.5418]→[5.10266886:10266887](∅→∅),[5.6830]→[5.10266886:10266887](∅→∅),[5.17672]→[5.10266886:10266887](∅→∅),[5.10266886]→[5.10266886:10266887](∅→∅)
[deps.Flux.extensions]FluxAMDGPUExt = "AMDGPU"FluxCUDAExt = "CUDA"FluxCUDAcuDNNExt = ["CUDA", "cuDNN"]FluxEnzymeExt = "Enzyme"FluxMPIExt = "MPI"FluxMPINCCLExt = ["CUDA", "MPI", "NCCL"][deps.Flux.weakdeps]AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"NCCL = "3fe64909-d7a1-4096-9b7d-7a0f12cf0f6b"cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"[[deps.ForwardDiff]]deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"]git-tree-sha1 = "a2df1b776752e3f344e5116c06d75a10436ab853"uuid = "f6369f11-7733-5829-9624-2563aa707210"version = "0.10.38"weakdeps = ["StaticArrays"][deps.ForwardDiff.extensions]ForwardDiffStaticArraysExt = "StaticArrays"[[deps.Functors]]deps = ["LinearAlgebra"]git-tree-sha1 = "64d8e93700c7a3f28f717d265382d52fac9fa1c1"uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196"version = "0.4.12" - edit in Manifest.toml at line 347[5.10266967]→[5.10266967:10266968](∅→∅),[5.10266968]→[5.17673:17814](∅→∅),[5.17814]→[5.6831:6890](∅→∅),[5.5478]→[5.17873:17919](∅→∅),[5.6890]→[5.17873:17919](∅→∅),[5.17873]→[5.17873:17919](∅→∅),[5.17919]→[5.6891:6910](∅→∅),[5.5498]→[5.17937:17978](∅→∅),[5.6910]→[5.17937:17978](∅→∅),[5.17937]→[5.17937:17978](∅→∅),[5.17978]→[5.5499:5558](∅→∅),[5.5558]→[5.18037:18083](∅→∅),[5.18037]→[5.18037:18083](∅→∅),[5.18083]→[5.5559:5577](∅→∅)
[[deps.GPUArrays]]deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"]git-tree-sha1 = "62ee71528cca49be797076a76bdc654a170a523e"uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"version = "10.3.1"[[deps.GPUArraysCore]]deps = ["Adapt"]git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950"uuid = "46192b85-c4d5-4398-a991-12ede77f4527"version = "0.1.6" - edit in Manifest.toml at line 348[5.18102]→[5.18102:18123](∅→∅),[5.18123]→[5.6911:7134](∅→∅),[5.7134]→[5.18287:18333](∅→∅),[5.18287]→[5.18287:18333](∅→∅),[5.18333]→[5.7135:7154](∅→∅),[5.7154]→[5.18352:18353](∅→∅),[5.18352]→[5.18352:18353](∅→∅)
[[deps.GPUCompiler]]deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "TimerOutputs", "UUIDs"]git-tree-sha1 = "1d6f290a5eb1201cd63574fbc4440c788d5cb38f"uuid = "61eb1bfa-7361-4325-ad38-22787b887f55"version = "0.27.8" - edit in Manifest.toml at line 377[5.19499]→[5.19499:19516](∅→∅),[5.19516]→[5.7395:7496](∅→∅),[5.5637]→[5.19625:19671](∅→∅),[5.7496]→[5.19625:19671](∅→∅),[5.19625]→[5.19625:19671](∅→∅),[5.19671]→[5.7497:7516](∅→∅),[5.5657]→[5.19830:19831](∅→∅),[5.7516]→[5.19830:19831](∅→∅),[5.19830]→[5.19830:19831](∅→∅)
[[deps.IRTools]]deps = ["InteractiveUtils", "MacroTools"]git-tree-sha1 = "950c3717af761bc3ff906c2e8e52bd83390b6ec2"uuid = "7869d1d1-7146-5819-86e3-90919afe41df"version = "0.4.14" - edit in Manifest.toml at line 489[5.25371]→[5.25371:25517](∅→∅),[5.25517]→[5.10267717:10267718](∅→∅),[5.10267717]→[5.10267717:10267718](∅→∅)
[[deps.InitialValues]]git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3"uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c"version = "0.3.1" - edit in Manifest.toml at line 535[5.26708]→[5.7435:7461](∅→∅),[5.7461]→[5.8302:8361](∅→∅),[5.8361]→[5.7536:7582](∅→∅),[5.7536]→[5.7536:7582](∅→∅),[5.7582]→[5.8362:8526](∅→∅),[5.8526]→[5.7601:7602](∅→∅),[5.7601]→[5.7601:7602](∅→∅)
[[deps.InverseFunctions]]git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"uuid = "3587e190-3f89-42d0-90ee-14403ec27112"version = "0.1.17"weakdeps = ["Dates", "Test"][deps.InverseFunctions.extensions]InverseFunctionsDatesExt = "Dates"InverseFunctionsTestExt = "Test" - edit in Manifest.toml at line 596[5.3297]→[5.10269054:10269055](∅→∅),[5.9249]→[5.10269054:10269055](∅→∅),[5.27548]→[5.10269054:10269055](∅→∅),[5.10269054]→[5.10269054:10269055](∅→∅),[5.10269055]→[5.27549:27943](∅→∅),[5.27943]→[5.10269273:10269274](∅→∅),[5.10269273]→[5.10269273:10269274](∅→∅),[5.10269274]→[5.27944:27972](∅→∅),[5.27972]→[5.9250:9464](∅→∅),[5.1496]→[5.28219:28265](∅→∅),[5.3357]→[5.28219:28265](∅→∅),[5.7742]→[5.28219:28265](∅→∅),[5.9464]→[5.28219:28265](∅→∅),[5.28219]→[5.28219:28265](∅→∅),[5.28265]→[5.9465:9484](∅→∅)
[[deps.JuliaNVTXCallbacks_jll]]deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]git-tree-sha1 = "af433a10f3942e882d3c671aacb203e006a5808f"uuid = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e"version = "0.2.1+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", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"]git-tree-sha1 = "e73a077abc7fe798fe940deabe30ef6c66bdde52"uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c"version = "0.9.29" - edit in Manifest.toml at line 597[5.28285]→[5.28285:28355](∅→∅),[5.28355]→[5.9485:9561](∅→∅),[5.9561]→[5.28355:28451](∅→∅),[5.28355]→[5.28355:28451](∅→∅),[5.28451]→[5.9562:9679](∅→∅),[5.9679]→[5.28451:28452](∅→∅),[5.28451]→[5.28451:28452](∅→∅)
[deps.KernelAbstractions.extensions]EnzymeExt = "EnzymeCore"LinearAlgebraExt = "LinearAlgebra"SparseArraysExt = "SparseArrays"[deps.KernelAbstractions.weakdeps]EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - edit in Manifest.toml at line 602[5.9805]→[5.28647:28662](∅→∅),[5.28647]→[5.28647:28662](∅→∅),[5.28662]→[5.9806:9944](∅→∅),[5.3437]→[5.28812:28858](∅→∅),[5.7822]→[5.28812:28858](∅→∅),[5.9944]→[5.28812:28858](∅→∅),[5.28812]→[5.28812:28858](∅→∅),[5.28858]→[5.9945:9963](∅→∅),[5.3456]→[5.28876:28960](∅→∅),[5.7841]→[5.28876:28960](∅→∅),[5.9963]→[5.28876:28960](∅→∅),[5.28876]→[5.28876:28960](∅→∅),[5.28960]→[5.10269463:10269464](∅→∅),[5.10269463]→[5.10269463:10269464](∅→∅),[5.10269464]→[5.28961:29054](∅→∅),[5.29054]→[5.9964:10023](∅→∅),[5.3516]→[5.29113:29159](∅→∅),[5.7901]→[5.29113:29159](∅→∅),[5.10023]→[5.29113:29159](∅→∅),[5.29113]→[5.29113:29159](∅→∅),[5.29159]→[5.10024:10045](∅→∅),[5.3538]→[5.29180:29326](∅→∅),[5.7923]→[5.29180:29326](∅→∅),[5.10045]→[5.29180:29326](∅→∅),[5.29180]→[5.29180:29326](∅→∅)
[[deps.LLVM]]deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"]git-tree-sha1 = "d422dfd9707bec6617335dc2ea3c5172a87d5908"uuid = "929cbde3-209d-540e-8aea-75f648917ca0"version = "9.1.3"weakdeps = ["BFloat16s"][deps.LLVM.extensions]BFloat16sExt = "BFloat16s"[[deps.LLVMExtra_jll]]deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"]git-tree-sha1 = "05a8bd5a42309a9ec82f700876903abce1017dd3"uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab"version = "0.0.34+0"[[deps.LLVMLoopInfo]]git-tree-sha1 = "2e5c102cfc41f48ae4740c7eca7743cc7e7b75ea"uuid = "8b046642-f1f6-4319-8d3c-209ddc03c586"version = "1.0.0" - edit in Manifest.toml at line 696[5.10707]→[5.31081:31082](∅→∅),[5.31081]→[5.31081:31082](∅→∅),[5.31082]→[5.4036:4232](∅→∅),[5.4232]→[5.10708:11643](∅→∅)
[[deps.MLBase]]deps = ["IterTools", "Random", "Reexport", "StatsBase"]git-tree-sha1 = "ac79beff4257e6e80004d5aee25ffeee79d91263"uuid = "f0e99cf1-93fa-52ec-9ecc-5026115318e0"version = "0.9.2"[[deps.MLDataDevices]]deps = ["Adapt", "Compat", "Functors", "Preferences", "Random"]git-tree-sha1 = "d0666f5a9294484110e2bfc12e07cff5a434488d"uuid = "7e8f7934-dd98-4c1a-8fe8-92b47a384d40"version = "1.5.0"[deps.MLDataDevices.extensions]MLDataDevicesAMDGPUExt = "AMDGPU"MLDataDevicesCUDAExt = "CUDA"MLDataDevicesChainRulesCoreExt = "ChainRulesCore"MLDataDevicesFillArraysExt = "FillArrays"MLDataDevicesGPUArraysExt = "GPUArrays"MLDataDevicesMLUtilsExt = "MLUtils"MLDataDevicesMetalExt = ["GPUArrays", "Metal"]MLDataDevicesReactantExt = "Reactant"MLDataDevicesRecursiveArrayToolsExt = "RecursiveArrayTools"MLDataDevicesReverseDiffExt = "ReverseDiff"MLDataDevicesSparseArraysExt = "SparseArrays"MLDataDevicesTrackerExt = "Tracker"MLDataDevicesZygoteExt = "Zygote"MLDataDevicescuDNNExt = ["CUDA", "cuDNN"]MLDataDevicesoneAPIExt = ["GPUArrays", "oneAPI"] - edit in Manifest.toml at line 697[5.11644]→[5.11644:12498](∅→∅),[5.4232]→[5.31082:31539](∅→∅),[5.12498]→[5.31082:31539](∅→∅),[5.31082]→[5.31082:31539](∅→∅),[5.31539]→[5.10272056:10272057](∅→∅),[5.10272056]→[5.10272056:10272057](∅→∅)
[deps.MLDataDevices.weakdeps]AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"Metal = "dde4c033-4e86-420c-a63e-0dd931031962"Reactant = "3c362404-f566-11ee-1572-e11a4b42c853"RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b"[[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" - edit in Manifest.toml at line 728[5.32264]→[5.32264:32440](∅→∅),[5.32440]→[5.12499:12558](∅→∅),[5.8063]→[5.32499:32545](∅→∅),[5.12558]→[5.32499:32545](∅→∅),[5.32499]→[5.32499:32545](∅→∅),[5.32545]→[5.12559:12577](∅→∅),[5.8082]→[5.32563:32673](∅→∅),[5.12577]→[5.32563:32673](∅→∅),[5.32563]→[5.32563:32673](∅→∅),[5.32673]→[5.12578:12687](∅→∅),[5.12687]→[5.32781:32827](∅→∅),[5.32781]→[5.32781:32827](∅→∅),[5.32827]→[5.12688:12706](∅→∅)
[[deps.Metalhead]]deps = ["Artifacts", "BSON", "ChainRulesCore", "Flux", "Functors", "JLD2", "LazyArtifacts", "MLUtils", "NNlib", "PartialFunctions", "Random", "Statistics"]git-tree-sha1 = "aef476e4958303f5ea9e1deb81a1ba2f510d4e11"uuid = "dbeba491-748d-5e0e-a39e-b530a07fa0cc"version = "0.9.4"weakdeps = ["CUDA"][deps.Metalhead.extensions]MetalheadCUDAExt = "CUDA"[[deps.MicroCollections]]deps = ["Accessors", "BangBang", "InitialValues"]git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f"uuid = "128add7d-3638-4c79-886c-908ea0c25c34"version = "0.2.0" - edit in Manifest.toml at line 753[5.10273140]→[5.33061:33077](∅→∅),[5.33077]→[5.12865:13049](∅→∅),[5.4292]→[5.33280:33326](∅→∅),[5.8142]→[5.33280:33326](∅→∅),[5.13049]→[5.33280:33326](∅→∅),[5.33280]→[5.33280:33326](∅→∅),[5.33326]→[5.13050:13069](∅→∅),[5.4312]→[5.33345:33510](∅→∅),[5.8162]→[5.33345:33510](∅→∅),[5.13069]→[5.33345:33510](∅→∅),[5.33345]→[5.33345:33510](∅→∅),[5.33510]→[5.13070:13136](∅→∅),[5.13136]→[5.33510:33695](∅→∅),[5.33510]→[5.33510:33695](∅→∅),[5.33695]→[5.13137:13244](∅→∅),[5.13244]→[5.33695:34145](∅→∅),[5.33695]→[5.33695:34145](∅→∅)
[[deps.NNlib]]deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "Statistics"]git-tree-sha1 = "da09a1e112fd75f9af2a5229323f01b56ec96a4c"uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd"version = "0.9.24"[deps.NNlib.extensions]NNlibAMDGPUExt = "AMDGPU"NNlibCUDACUDNNExt = ["CUDA", "cuDNN"]NNlibCUDAExt = "CUDA"NNlibEnzymeCoreExt = "EnzymeCore"NNlibFFTWExt = "FFTW"NNlibForwardDiffExt = "ForwardDiff"[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"ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"[[deps.NVTX]]deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"]git-tree-sha1 = "53046f0483375e3ed78e49190f1154fa0a4083a1"uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f"version = "0.3.4"[[deps.NVTX_jll]]deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]git-tree-sha1 = "ce3269ed42816bf18d500c9f63418d4b0d9f5a3b"uuid = "e98f9f5b-d649-5603-91fd-7774390e6439"version = "3.1.0+2" - edit in Manifest.toml at line 759
[[deps.NameResolution]]deps = ["PrettyPrint"]git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e"uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391"version = "0.1.5" - edit in Manifest.toml at line 776
[[deps.Noise]]deps = ["ImageCore", "PoissonRandom", "Random"]git-tree-sha1 = "d34a07459e1ebdc6b551ecb28e3c19993f544d91"uuid = "81d43f40-5267-43b7-ae1c-8b967f377efa"version = "0.3.3" - edit in Manifest.toml at line 780
weakdeps = ["Adapt"] - edit in Manifest.toml at line 783
[deps.OffsetArrays.weakdeps]Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - edit in Manifest.toml at line 793[5.35774]→[5.35774:35884](∅→∅),[5.35884]→[5.8163:8222](∅→∅),[5.8222]→[5.35943:35989](∅→∅),[5.35943]→[5.35943:35989](∅→∅),[5.35989]→[5.8223:8241](∅→∅),[5.8241]→[5.10273527:10273528](∅→∅),[5.36007]→[5.10273527:10273528](∅→∅),[5.10273527]→[5.10273527:10273528](∅→∅)
[[deps.OneHotArrays]]deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"]git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d"uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f"version = "0.2.5" - edit in Manifest.toml at line 839[5.36411]→[5.36411:36510](∅→∅),[5.36510]→[5.13807:13866](∅→∅),[5.8383]→[5.36569:36615](∅→∅),[5.13866]→[5.36569:36615](∅→∅),[5.36569]→[5.36569:36615](∅→∅),[5.36615]→[5.13867:13885](∅→∅),[5.8402]→[5.10274444:10274445](∅→∅),[5.13885]→[5.10274444:10274445](∅→∅),[5.36633]→[5.10274444:10274445](∅→∅),[5.10274444]→[5.10274444:10274445](∅→∅)
[[deps.Optimisers]]deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"]git-tree-sha1 = "c9ff5c686240c31eb8570b662dd1f66f4b183116"uuid = "3bd65402-5787-11e9-1adc-39752487f4e2"version = "0.3.4" - edit in Manifest.toml at line 868[5.37377]→[5.37377:37548](∅→∅),[5.37548]→[5.10274782:10274783](∅→∅),[5.10274782]→[5.10274782:10274783](∅→∅)
[[deps.PartialFunctions]]deps = ["MacroTools"]git-tree-sha1 = "47b49a4dbc23b76682205c646252c0f9e1eb75af"uuid = "570af359-4316-4cb7-8c74-252c00c2016b"version = "1.2.0" - edit in Manifest.toml at line 884
[[deps.PoissonRandom]]deps = ["Random"]git-tree-sha1 = "a0f1159c33f846aa77c3f30ebbc69795e5327152"uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab"version = "0.4.4" - edit in Manifest.toml at line 920[5.1674]→[5.10276256:10276257](∅→∅),[5.4631]→[5.10276256:10276257](∅→∅),[5.10276256]→[5.10276256:10276257](∅→∅),[5.10276257]→[5.38243:38387](∅→∅)
[[deps.PrettyPrint]]git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4"uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98"version = "0.2.0" - edit in Manifest.toml at line 931
[[deps.ProgressLogging]]deps = ["Logging", "SHA", "UUIDs"]git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539"uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c"version = "0.1.4" - edit in Manifest.toml at line 968[5.10276978]→[5.39333:39388](∅→∅),[5.39388]→[5.4632:4691](∅→∅),[5.4691]→[5.39447:39493](∅→∅),[5.39447]→[5.39447:39493](∅→∅),[5.39493]→[5.4692:4710](∅→∅)
[[deps.Random123]]deps = ["Random", "RandomNumbers"]git-tree-sha1 = "4743b43e5a9c4a2ede372de7061eed81795b12e7"uuid = "74087812-796a-5b5d-8853-05524746bad3"version = "1.7.0" - edit in Manifest.toml at line 969[5.39512]→[5.39512:39535](∅→∅),[5.39535]→[5.14443:14520](∅→∅),[5.14520]→[5.39624:39670](∅→∅),[5.39624]→[5.39624:39670](∅→∅),[5.39670]→[5.14521:14539](∅→∅),[5.14539]→[5.39688:39689](∅→∅),[5.39688]→[5.39688:39689](∅→∅)
[[deps.RandomNumbers]]deps = ["Random"]git-tree-sha1 = "c6ec94d2aaba1ab2ff983052cf6a606ca5985902"uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143"version = "1.6.0" - edit in Manifest.toml at line 1000
[[deps.Referenceables]]deps = ["Adapt"]git-tree-sha1 = "02d31ad62838181c1a3a5fd23a1ce5914a643601"uuid = "42d2dcc6-99eb-4e98-b66c-637b7d73030e"version = "0.1.3" - edit in Manifest.toml at line 1057
[[deps.ShowCases]]git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5"uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3"version = "0.1.0" - edit in Manifest.toml at line 1094
[[deps.SparseInverseSubset]]deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852"uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada"version = "0.1.2" - edit in Manifest.toml at line 1104
[[deps.SplittablesBase]]deps = ["Setfield", "Test"]git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5"uuid = "171d559e-b47b-412a-8079-5efa626c420e"version = "0.1.15" - edit in Manifest.toml at line 1150[5.10279594]→[5.44302:44324](∅→∅),[5.44324]→[5.4790:4898](∅→∅),[5.4898]→[5.44478:44524](∅→∅),[5.9759]→[5.44478:44524](∅→∅),[5.44478]→[5.44478:44524](∅→∅),[5.44524]→[5.4899:5208](∅→∅),[5.5208]→[5.15339:15340](∅→∅)
[[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" - edit in Manifest.toml at line 1156[5.44544]→[5.44544:44678](∅→∅),[5.44678]→[5.10279765:10279766](∅→∅),[5.10279765]→[5.10279765:10279766](∅→∅)
[[deps.SuiteSparse]]deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - edit in Manifest.toml at line 1205[5.10281309]→[5.45082:45100](∅→∅),[5.45100]→[5.9865:10078](∅→∅),[5.10078]→[5.45312:45358](∅→∅),[5.45312]→[5.45312:45358](∅→∅),[5.45358]→[5.10079:10098](∅→∅),[5.10098]→[5.45377:45378](∅→∅),[5.45377]→[5.45377:45378](∅→∅)
[[deps.ThreadsX]]deps = ["Accessors", "ArgCheck", "BangBang", "ConstructionBase", "InitialValues", "MicroCollections", "Referenceables", "SplittablesBase", "Transducers"]git-tree-sha1 = "70bd8244f4834d46c3d68bd09e7792d8f571ef04"uuid = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d"version = "0.1.12" - edit in Manifest.toml at line 1226[5.10281946]→[5.45905:45959](∅→∅),[5.45959]→[5.16256:16315](∅→∅),[5.16315]→[5.46018:46064](∅→∅),[5.46018]→[5.46018:46064](∅→∅),[5.46064]→[5.16316:16335](∅→∅)
[[deps.TimerOutputs]]deps = ["ExprTools", "Printf"]git-tree-sha1 = "3a6f063d690135f5c1ba351412c82bae4d1402bf"uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"version = "0.5.25" - edit in Manifest.toml at line 1231[5.16415]→[5.10282129:10282130](∅→∅),[5.10282129]→[5.10282129:10282130](∅→∅),[5.46085]→[5.46085:46106](∅→∅),[5.46106]→[5.16416:16707](∅→∅),[5.16707]→[5.46405:46451](∅→∅),[5.46405]→[5.46405:46451](∅→∅),[5.46451]→[5.16708:16727](∅→∅)
[[deps.Transducers]]deps = ["Accessors", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"]git-tree-sha1 = "7deeab4ff96b85c5f72c824cae53a1398da3d1cb"uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999"version = "0.4.84" - edit in Manifest.toml at line 1232[5.10282205]→[5.46471:46505](∅→∅),[5.46505]→[5.16728:16762](∅→∅),[5.16762]→[5.46505:46778](∅→∅),[5.46505]→[5.46505:46778](∅→∅),[5.46778]→[5.16763:16814](∅→∅),[5.16814]→[5.46778:47068](∅→∅),[5.46778]→[5.46778:47068](∅→∅),[5.47068]→[5.10282366:10282367](∅→∅),[5.10282366]→[5.10282366:10282367](∅→∅)
[deps.Transducers.extensions]TransducersAdaptExt = "Adapt"TransducersBlockArraysExt = "BlockArrays"TransducersDataFramesExt = "DataFrames"TransducersLazyArraysExt = "LazyArrays"TransducersOnlineStatsBaseExt = "OnlineStatsBase"TransducersReferenceablesExt = "Referenceables"[deps.Transducers.weakdeps]Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"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" - edit in Manifest.toml at line 1254
weakdeps = ["ConstructionBase", "InverseFunctions"] - replacement in Manifest.toml at line 1259
[[deps.UnsafeAtomics]]git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278"uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f"version = "0.2.1"[deps.Unitful.weakdeps]ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - edit in Manifest.toml at line 1263[5.10283047]→[5.47357:47417](∅→∅),[5.47417]→[5.16895:16954](∅→∅),[5.16954]→[5.47476:47522](∅→∅),[5.47476]→[5.47476:47522](∅→∅),[5.47522]→[5.16955:16973](∅→∅),[5.16973]→[5.47540:47541](∅→∅),[5.47540]→[5.47540:47541](∅→∅)
[[deps.UnsafeAtomicsLLVM]]deps = ["LLVM", "UnsafeAtomics"]git-tree-sha1 = "2d17fabcd17e67d7625ce9c531fb9f40b7c42ce4"uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249"version = "0.2.1" - edit in Manifest.toml at line 1319[5.17217]→[5.48832:49190](∅→∅),[5.48832]→[5.48832:49190](∅→∅),[5.49190]→[5.17218:17277](∅→∅),[5.10568]→[5.49249:49295](∅→∅),[5.17277]→[5.49249:49295](∅→∅),[5.49249]→[5.49249:49295](∅→∅),[5.49295]→[5.17278:17297](∅→∅),[5.10588]→[5.49314:49633](∅→∅),[5.17297]→[5.49314:49633](∅→∅),[5.49314]→[5.49314:49633](∅→∅),[5.49633]→[5.10284202:10284203](∅→∅),[5.10284202]→[5.10284202:10284203](∅→∅),[5.10284203]→[5.49634:49695](∅→∅),[5.49695]→[5.10589:10648](∅→∅),[5.10648]→[5.49754:49800](∅→∅),[5.49754]→[5.49754:49800](∅→∅),[5.49800]→[5.10649:10667](∅→∅)
[[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 = "f816633be6dc5c0ed9ffedda157ecfda0b3b6a69"uuid = "e88e6eb3-aa80-5325-afca-941959d7151f"version = "0.6.72"[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" - edit in Manifest.toml at line 1320[5.49819]→[5.49819:49898](∅→∅),[5.49898]→[5.17298:17357](∅→∅),[5.10727]→[5.49957:50003](∅→∅),[5.17357]→[5.49957:50003](∅→∅),[5.49957]→[5.49957:50003](∅→∅),[5.50003]→[5.17358:17569](∅→∅),[5.10746]→[5.50021:50022](∅→∅),[5.17569]→[5.50021:50022](∅→∅),[5.50021]→[5.50021:50022](∅→∅)
[[deps.cuDNN]]deps = ["CEnum", "CUDA", "CUDA_Runtime_Discovery", "CUDNN_jll"]git-tree-sha1 = "4b3ac62501ca73263eaa0d034c772f13c647fba6"uuid = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd"version = "1.4.0"[[deps.demumble_jll]]deps = ["Artifacts", "JLLWrappers", "Libdl"]git-tree-sha1 = "6498e3581023f8e530f34760d18f75a69e3a4ea8"uuid = "1e29f10c-031c-5a83-9565-69cddfc27673"version = "1.3.0+0"