Issues with the CSV package

Hello !
I just began an internship and was given the following code made by a person that left the company :

using Pkg
Pkg.activate(".")
using CSV
using MAT
using ProgressBars
using HDF5
using LightXML
using Mmap
using Distributions
using Interpolations
using DataFrames
using TFRecord

# A small julia script to extract very efficiently
# spikes times and align them with a nnBehavior matrix.
# The results is stored in a CSV folder.

# The script should be launched with the following arguments, in order:
#   the path to the xml file
#   the path to the dat file
#   the path to the nnBehavior.mat file
#   the path at which the output csv file will be written
# 	the path to the dataset where we will write the awake spike
# 	the path to the dataset where we will write the sleeping spike
# e.g:
# xmlPath = "~/dataTest/Mouse-M1199-1304/continuous.xml"
# datPath = "~/dataTest/Mouse-M1199-1304/continuous.dat"
# behavePath = "~/dataTest/Mouse-M1199-1304/nnBehavior.mat"
# fileName = "~/dataTest/Mouse-M1199-1304/test_spikeJulia.csv"
#
xmlPath = ARGS[2]
datPath = ARGS[3]
behavePath = ARGS[4]
fileName = ARGS[5]
thresholdsFileName = replace(fileName,"spikeData_fromJulia"=>"thresholds_Julia")
datasetName = ARGS[6]
datasetNameSleep = ARGS[7]
BUFFERSIZE = parse(Int64,ARGS[8])
WINDOWSIZE = parse(Float32,ARGS[9])
WINDOWSTRIDE = parse(Float32,ARGS[10])


print(xmlPath)

using CodecZlib
using BufferedStreams
#we modify the TFrecord so it Effectively appends
function TFRecord.write(s::AbstractString, x;compression=nothing, bufsize=1024*1024)
    io = BufferedOutputStream(open(s, "a"), bufsize)
    if compression == :gzip
        io = GzipCompressorStream(io)
    elseif compression == :zlib
        io = ZlibCompressorStream(io)
    else
        isnothing(compression) || throw(ArgumentError("unsupported compression method: $compression"))
    end
    TFRecord.write(io, x)
    close(io)
end


function isInEpochs(time,epochs)
	# for an epochs array in the format [[start,end,start,end,....]]
	# verify if time is in any of these epochs:
	if size(epochs,1)>0
		return map(t->sum((t.>=epochs[1:2:end-1,1]).*(t.<epochs[2:2:end,1]))>0,time)
	else
		return map(t->false,time)
	end
end


function extract_spike_with_buffer(xmlPath,datPath,behavePath,fileName,datasetName,datasetNameSleep,BUFFERSIZE,WINDOWSIZE)
	#Read the xml file:
	xdoc = parse_file(xmlPath)
	xroot = root(xdoc)
	acquiSystem =  xroot["acquisitionSystem"]
	nbits = parse(Float16,content(acquiSystem[1]["nBits"][1]))
	Nchannel = parse(Float16,content(acquiSystem[1]["nChannels"][1]))
	samplingRate = parse(Float16,content(acquiSystem[1]["samplingRate"][1]))
	spd = xroot["spikeDetection"]
	groupList = spd[1]["channelGroups"][1]["group"]
	pint =s-> parse(Int64,s)
	#We need to add 1 to all channels because they are indexed starting at 0!!
	list_channels = map(s->pint.(map(c->content(c),s["channels"][1]["channel"])).+1,groupList)

    println("Number of bits: ",nbits)
    println("Number of channel: ",Nchannel)
    println("Sampling rate: ",samplingRate)
    println("List of channels for each group: " ,list_channels)
	println("Window size: " ,string(WINDOWSIZE*1000))

	file = open(datPath)
	isreadable(file)
	#memory-map the file:
	mmapFile = Mmap.mmap(file,Matrix{Int16},(Int(Nchannel),Int(filesize(file)/(2.0*Nchannel))))
	mmapFile = transpose(mmapFile)
	channel_focus = vcat(list_channels...)

	# first we will associate each spike to a measurement of environmental feature
	# and the time at which it was measured
	behaveMat = h5open(behavePath)
	position_time = behaveMat["behavior"]["position_time"][:,:]
	speed = behaveMat["behavior"]["speed"][:,:]
	positions = behaveMat["behavior"]["positions"][:,:]
	sleepPeriods =[]
	try
		# sleepPeriods = vcat(behaveMat["behavior"]["sleepPeriods"][:]...)
		# sleepPeriods = reshape(sleepPeriods,(size(sleepPeriods,1),1))
		sleepPeriods = behaveMat["behavior"]["sleepPeriods"][:,:]
		sleepPeriods = reshape(sleepPeriods,(size(sleepPeriods,2),1))
		println("Detected sleep periods in nnBehavior.mat")
		println(sleepPeriods)
	catch
		println("No sleep periods detected in nnBehavior.mat, saving all spikes in the position_time limit in the same dataset")
		sleepPeriods =[]
	end
	maxpos = maximum(positions)

	nodes = (position_time[:,1],)
	nodes_index = float.(1:1:size(position_time,1))
	itp = interpolate(nodes, nodes_index, (Gridded(Constant())))

	nGroups = size(list_channels,1)

	print("subtracting the low pass (fc=350Hz) filtered voltage to itself ")

	buffer_mmap = zeros(Float32,BUFFERSIZE+15+16,size(mmapFile,2))
	#15 at the beginning to complete early spikes of the buffer
	#16 at the end to complete final spike of the buffer
	state = zeros(Float32,size(channel_focus,1))
	old_possibleSpike_sum = map(id->zeros(Int64,14),1:1:nGroups)
	α = Float32(exp(-2π*350.0/samplingRate))
	β = Float32(1-α)
	thresholds = [zeros(Float32,(1,size(l,1))) for l in list_channels]

	feats = [] #list storing all spikes fromatted as Dict for tensorflow
	lastBuffIndex = (size(mmapFile,1)%BUFFERSIZE==0) ? (size(mmapFile,1)÷BUFFERSIZE) : (size(mmapFile,1)÷BUFFERSIZE)+1
	for idBuff in ProgressBar(1:1:lastBuffIndex)
		# we should begin at spikes which timing are above the first position measure:
		possibleTime_spike  = collect(float.(1+(idBuff-1)*BUFFERSIZE:1:min(size(mmapFile,1),BUFFERSIZE*idBuff))./samplingRate)
		# we need to be careful with the last buffer, which might contain less elements
		posindexOfSpikes  = zeros(Int64,size(possibleTime_spike,1)) #of size BUFFERSIZE or, for the last buffer, less
		if position_time[1,1]>possibleTime_spike[end]
			# no position should be saved:
			posindexOfSpikes .= -1
		elseif position_time[end,1]<possibleTime_spike[1]
			# no position should be saved:
			posindexOfSpikes .= -1
		elseif position_time[1,1]>=possibleTime_spike[1]
			# the buffer spreads over the min limit of position
			minTest = possibleTime_spike.-position_time[1,1]
			minTest[minTest.<0] .= Inf
			spikeMin = argmin(abs.(minTest))
			if  position_time[end,1]>possibleTime_spike[end]
				nodeTest = (possibleTime_spike[spikeMin:end],)
				spikePosIndex = itp.(nodeTest)
				posindexOfSpikes[1:spikeMin-1] .= -1
				posindexOfSpikes[spikeMin:end] .= spikePosIndex[1]
			else
				maxTest = position_time[end,1].-possibleTime_spike
				maxTest[maxTest.<0] .= Inf
				spikeMax = argmin(abs.(maxTest))
				nodeTest = (possibleTime_spike[spikeMin:spikeMax],)
				spikePosIndex = itp.(nodeTest)
				posindexOfSpikes[1:spikeMin-1] .= -1
				posindexOfSpikes[spikeMin:spikeMax] .= spikePosIndex[1]
				posindexOfSpikes[spikeMax+1:end] .= -1
			end
		elseif position_time[1,1]<possibleTime_spike[1]
			if position_time[end,1]<=possibleTime_spike[end]
				# the buffer spreads over the max limit of position
				maxTest = position_time[end,1].-possibleTime_spike
				maxTest[maxTest.<0] .= Inf
				spikeMax = argmin(abs.(maxTest))
				nodeTest = (possibleTime_spike[1:spikeMax],)
				spikePosIndex = itp.(nodeTest)
				posindexOfSpikes[1:spikeMax] .= spikePosIndex[1]
				posindexOfSpikes[spikeMax+1:end] .= -1
			else
				# the buffer is included inside the max and the min limit of position
				nodeTest = (possibleTime_spike[1:end],)
				spikePosIndex = itp.(nodeTest)
				posindexOfSpikes .= spikePosIndex[1]
			end
		end
		#finally, we assign to each time step that belongs to a sleep period a posindex of -2
		# as referenced by the sleepEpcohs in nnBehavior.mat
		# which consists of an array [start,end,start,end,....] of sleep epochs
		# Note: for future purpose (decoding of other env feature present in sleep)
		# or decoding of feature found in the neurons activity this might not be the best
		# way to go. Notably if we want to train during sleep!
		posindexOfSpikes[isInEpochs(possibleTime_spike,sleepPeriods)] .= -2

		# first buffer: 15 first time step are set at 0
		 # other buffers: we already have filtered the end of the previous buffer (15 time steps) and beginning of the buffer (16 time steps)
		startid = idBuff == 1 ? 15 + 1 : 15+16+1
		#take care of last buffer:
		lastid = idBuff*BUFFERSIZE+16 > size(mmapFile,1) ? (size(mmapFile,1) - (idBuff-1)*BUFFERSIZE-1-16) + startid   :  size(buffer_mmap,1)
		buffer_mmap[startid:lastid,:] = idBuff == 1 ? mmapFile[1:min(BUFFERSIZE+16,size(mmapFile,1)),:].*0.195 : mmapFile[(idBuff-1)*BUFFERSIZE+16+1:min(idBuff*BUFFERSIZE+16,size(mmapFile,1)),:].*0.195
		#apply the low pass filter on the mmapFile:
		for id in (startid:1:size(buffer_mmap,1))
			temp = buffer_mmap[id,channel_focus] .- state
			state = α*state .+ β*buffer_mmap[id,channel_focus]
			buffer_mmap[id,channel_focus] .= temp
		end
		#Note: to reduce the memory footprint we decide to round the filtering result to the upper integer
		# 16/6/2021: modified by adding a temporal variable as in Intan filter.
		#


	    # print("applying spike thresholds")
		sidThresh = idBuff == 1 ? 1 : (15+1) #start index to look for new spikes
	    #thresholds are computed for each channel in each group....
	    possileSpike = map(id->zeros(Int64,BUFFERSIZE),1:1:size(list_channels,1))
	    possibleSpike_sum = map(id->zeros(Int64,BUFFERSIZE),1:1:size(list_channels,1))
	    noPreviousSpike = map(id->zeros(Int64,BUFFERSIZE),1:1:size(list_channels,1))

        #note: changed to see the effect of a varying threshold:
        #if idBuff == 1
        #    for tppl in enumerate(list_channels)
    	#        id,l = tppl
    	#        thresholds[id] .= 3*std(buffer_mmap[sidThresh:end-16,l],dims=1)
    	#    end
        #end
        thresholds = map(l->3*std(buffer_mmap[sidThresh:end-16,l],dims=1),list_channels)

        dicThresholds = Dict()
        map(i -> dicThresholds[i]=thresholds[i],1:1:size(thresholds,1))
        CSV.write(thresholdsFileName,dicThresholds ,append=true)

    	map(id->noPreviousSpike[id][1:end] .= prod(buffer_mmap[sidThresh:sidThresh+BUFFERSIZE-1,list_channels[id]] .>= -thresholds[id], dims=2)[:,1],1:1:size(list_channels,1))
    	map(id->possileSpike[id][1:end] .= sum(buffer_mmap[sidThresh:sidThresh+BUFFERSIZE-1,list_channels[id]] .< -thresholds[id], dims=2)[:,1],1:1:size(list_channels,1))
    	map(id->possibleSpike_sum[id][2:end] .= noPreviousSpike[id][1:end-1].*possileSpike[id][2:end],1:1:size(list_channels,1))
		#note: still work for the last buffer: the buffer_mmap is initialized at 0, so unless thresholds are at 0, which will never be the case
		#	we obtain possileSpike =0 for the time step beyond the end of the last buffer, and will therefore have no influence
		# to the rest of the algo.
    	#special case of first value of the buffer:
    	if idBuff>1
    		map(id->possibleSpike_sum[id][1] = possileSpike[id][sidThresh],1:1:size(list_channels,1))
			#so we have to save noPreviousSpike and garbage collect it correctly too.
		else
			#for the first buffer we don't have previous voltage measure so we accept to use the spike as is.
			map(id->possibleSpike_sum[id][1] = possileSpike[id][1],1:1:size(list_channels,1))
		end

		#finally we need to check if there was a spike in the 14 last bin of the previous possibleSpike_sum buffer...
		for index_before in 1:1:14
			for i in 1:1:nGroups
				if old_possibleSpike_sum[i][index_before] >0
					possibleSpike_sum[i][1:index_before] .=  0
				end
			end
		end

	    spikesFound = []
	    for index in 1:1:BUFFERSIZE #
	        time = float(index+(idBuff-1)*BUFFERSIZE)/samplingRate
	        for i in 1:1:nGroups
	            if possibleSpike_sum[i][index] >0 && (index+(idBuff-1)*BUFFERSIZE<=size(mmapFile,1)-16) #forbid too late spike because we would miss the info to capture waveform
	                # lastBestTime[i] = findtime(position_time,lastBestTime[i],time)
	                # posiiton_index = lastBestTime[i]
	                posiiton_index = posindexOfSpikes[index]
	                #time, group, spike_index, position_index
	                append!(spikesFound,[[time,i,index+(idBuff-1)*BUFFERSIZE,posiiton_index]])
	                # forbid other spikes in other channels of the group for 14 time-steps.
	                possibleSpike_sum[i][index:min(index+14,size(possibleSpike_sum[i],1))] .= 0
	            end
	        end
	    end
		spikesBehaveFound =[]
		spikesSleepFound =[]
	    #write last batch of spikes:
		if size(spikesFound,1)>0
		    spikesFound = transpose(reduce(hcat,spikesFound))
			CSV.write(fileName,(t=spikesFound[:,1],group=float(spikesFound[:,2]),
								spike_id=float(spikesFound[:,3]),pos_id=float(spikesFound[:,4])),append=true,
								header=["t", "group", "spike_id","pos_id"])
			#indicate that the last spikes were saved and can be used to forbid early spikes in the next buffer
			map(id->old_possibleSpike_sum[id] .= possibleSpike_sum[id][end-13:end],1:1:nGroups)
			#saving as a tensorflow tf.rec:

		    window_length = WINDOWSIZE
		    function stack_spikes(spIndex,g)
		    	if size(spIndex,1) ==0
		    		return zeros((0,size(list_channels[g],1),32))
		    	else
					spIndex = spIndex .- (idBuff-1)*BUFFERSIZE .+15 #correct to set at the right position in the buffer
		    		catspike = cat(map(s->buffer_mmap[Int(s)-15:Int(s)+16,list_channels[g]],spIndex)...,dims=3)
					# Julia and python do not ravel a tensor similarly,
					# For Julia, it progressively increases index from left to right gathering: [A[1,1,1],A[2,1,1],A[1,2,1],A[2,2,1],...]
					# Whereas Python starts from the end.
					# So that python reshape our array we thus store it by raveling from [32timsStepVoltageMeasure,NChannel,NspikesIn36msWindow]
					# And it will be read as [NspikesIn36msWindow,NChannel,32timsStepVoltageMeasure] in python!
					# So we don't permutedims!
					#permutedims(catspike,[3,2,1])
		    		return catspike
		    	end
		    end
	    	inBehaveEpoch = spikesFound[:,4] .> -1
	    	spikesBehaveFound = spikesFound[inBehaveEpoch,:]
			inSleepEpoch = spikesFound[:,4] .== -2
			spikesSleepFound = spikesFound[inSleepEpoch,:]
		end

		function saveSpikesFound(spikesFound)
			feats = []
			if size(spikesFound,1)>0 #if there is any spike to extract:
			    #🔥 : the group will be indexed from 0 to nGroups-1 in python
			    # so we need to do the same in Julia

			    #Let us find the start of windows aligned on the first spike of windows of length window_stride (36ms)
			    currentFirstSpikeTime = spikesFound[1,1]
                currentFirstSpikeId = 1
                startWind = []
                for i in 1:1:size(spikesFound,1)
                    if (spikesFound[i,1]>currentFirstSpikeTime+WINDOWSTRIDE) # we find the beginning of the next window
                        append!(startWind,[currentFirstSpikeId])
                        currentFirstSpikeId = i
                        currentFirstSpikeTime = spikesFound[i,1]
                    else
                        if(i==size(spikesFound,1))
                           append!(startWind,[currentFirstSpikeId])
                        #    println("unfinished 36 ms window at buffer limit")
                        end
                    end
                end

                #For each of these start we find the stopindex =(last spike id)+1 which is less than window_length from the starting spike
                stopWind = []
			    currentWindow = 1
			    lastSpikeId = size(spikesFound,1)
                for i in 1:1:size(spikesFound,1)
                    if (spikesFound[i,1]>spikesFound[startWind[currentWindow],1]+window_length) # we find the beginning of the next window
                        append!(stopWind,[i])
                        currentWindow= currentWindow + 1
                    end
                end
                # Account for situations when WINDOWSIZE > WINDOWSTRIDE (late windows in the buffer are shorter)
                while (size(stopWind,1)!=size(startWind,1))
                   append!(stopWind,[lastSpikeId+1])
                   currentWindow= currentWindow + 1
                end
                # println("unfinished longer window at buffer limit")

                for i in 1:1:size(stopWind,1)
                    startindex = startWind[i]
                    lastindex = stopWind[i]

                    spikeIndex = [spikesFound[startindex:lastindex-1,3][spikesFound[startindex:lastindex-1,2].==g] for g in 1:1:nGroups]
                    spikes = [stack_spikes(spikeIndex[g],g) for g in 1:1:nGroups]

                    # save into tensorflow the spike window:
                    if spikesFound[lastindex-1,4] == -2
                        feat = Dict(
                            "pos_index" => [-2],
                            "pos" => Float32.([0,0]),
                            "length" =>[lastindex-startindex],
                            "groups" => Int.(spikesFound[startindex:(lastindex-1),2] .-1),
                            "time" => [Float32.(mean(spikesFound[startindex:(lastindex-1), 1]))],
                            "indexInDat" => Int.(spikesFound[startindex:(lastindex-1),3] .-1)
                        )
                    else
                        feat = Dict(
                            "pos_index" => [Int(spikesFound[lastindex-1,4])-1],
                            "pos" => Float32.(positions[Int(spikesFound[lastindex-1,4]),:]/maxpos),
                            "length" =>[lastindex-startindex],
                            "groups" => Int.(spikesFound[startindex:(lastindex-1),2] .-1),
                            "time" => [Float32.(mean(spikesFound[startindex:(lastindex-1), 1]))],
                            "indexInDat" => Int.(spikesFound[startindex:(lastindex-1),3] .-1)
                        )
                    end
                    # Pierre: convert the spikes dic into a tf.train.Feature, used for the tensorflow protocol.
                    # their is no reason to change the key name but still done here.
                    for g in 1:1:nGroups
                        feat[string("group",g-1)] =  Array{Float32}(vcat(spikes[g]...).*0.195)
                    end
                    append!(feats,[feat])
                end
			end
			return feats
		end
		feats = saveSpikesFound(spikesBehaveFound)
		if size(feats,1)>0
			TFRecord.write(datasetName,feats)
		end
		feats = saveSpikesFound(spikesSleepFound)
		if size(feats,1)>0
			TFRecord.write(datasetNameSleep,feats)
		end

		buffer_end = buffer_mmap[end-15-16+1:end]
		#save the end of the buffer mmap as we will use it again
		#without filtering it once more.
		buffer_mmap = zeros(Float32,1) #before: Int16
		feats = []
		GC.gc()  #garbage collect the buffer as well as the feat dictionaries and all other arrays
		buffer_mmap = zeros(Float32,BUFFERSIZE+15+16,size(mmapFile,2))
		buffer_mmap[1:31] .= buffer_end
	end
end

extract_spike_with_buffer(xmlPath,datPath,behavePath,fileName,datasetName,datasetNameSleep,BUFFERSIZE,WINDOWSIZE)

The problem is that I get the following error message :

Does anyone know how I could fix the problem ? I tried updating all the julia packages and reinstalling the CSV package but it didn’t work.

You have some very old versions of packages in there… somewhere… leading to these incompatibilities.

Thank you, I’ll check it out.

Do you happen to have the original author’s Manifest.toml? From that we may be able to reconstruct the environment in which this code was intended to run.

I didn’t know how to find it so I asked ChatGPT. Here is what he told me :

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

So I did that and couldn’t find it :

terminql

So I told chatGPT that and he told me to use the command ‘find ~ -name “Manifest.toml”’ which resulted in a huge list that I don’t really know how to use (I would have put a screenshot here but ‘new users aren’t allowed to put more than one embedded image’…)

Here is the list (a part of it) :

Oh, I forgot to say, the computer I’m using has Julia v1.5.3 whereas the computer on which the program I’m trying to run was created has Julia v1.6.1.

I’ve just tried uploading v1.6.1 and adding CSV package with Pkg.add(“CSV”). Then I changed /path/to/julia1.5.3 to /path/to/julia1.6.1 in the shell script used to run the program and now I get the following error message :

Also I feel like I have to say : I’m not only new to Julia, I am new to programming in general. I mean I do have the basics and I can do some things, but as soon as it gets more than a syntaxic error, I get very confused, and that error message is just gibberish for me.

Why are you using Julia 1.5.3, i.e. an even older version of Julia than the one used to develop the original code?

I would recommend you use Julia 1.6.7, the current patch release of Julia 1.6. Then cd into the directory that holds your Project.toml file and ]instantiate it. Show us the output of ]st after you’ve done that. (Just to be sure, commands prefixed by ] should be entered in the Pkg REPL mode which you access by pressing ].)

1 Like

It’s just the version that was already installed on the computer of the lab I’m using (which isn’t the same computer as the one that was used to write the original code) when I began 2 days ago. Basically my predecessor told me the code was a mess, wished me good luck and now I have to deal with this issue, which I imagine is only the first one among many others that will come.

I will try what you said.

FWIW in Julia 1.10 adding all the packages in your OP to a clean environment resolves to:

(jl_KoNia5) pkg> st
  [336ed68f] CSV v0.10.12
  [a93c6f00] DataFrames v1.6.1
  [31c24e10] Distributions v0.25.107
  [f67ccb44] HDF5 v0.17.1
  [a98d9a8b] Interpolations v0.15.1
  [9c8b4983] LightXML v0.9.1
  [23992714] MAT v0.10.6
  [49802e3a] ProgressBars v1.5.1
  [841416d8] TFRecord v0.4.2
  [a63ad114] Mmap

i.e. all packages are at their latest released versions and compile fine. These package versions will be different (newer) than what was used to write the code you’ve got, so you might have to fix up some things if your code was relying on some package syntax that has changed since.

This is why Mark asked about the Manifest.toml above - from the Manifest you can re-instantiate the exact environment including the exact versions of all direct and transitive dependencies that were used when the code was written, while the Project.toml just records which packages are needed and when instantiated will try to get you the latest compatible versions of those packages.

1 Like

I finally managed to find the Manifest.toml.

Here it is :

# This file is machine-generated - editing it directly is not advised

[[AbstractFFTs]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "485ee0867925449198280d4af84bdb46a2a404d0"
uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
version = "1.0.1"

[[Adapt]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "f1b523983a58802c4695851926203b36e28f09db"
uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
version = "3.3.0"

[[Artifacts]]
deps = ["Pkg"]
git-tree-sha1 = "c30985d8821e0cd73870b17b0ed0ce6dc44cb744"
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
version = "1.3.0"

[[AxisAlgorithms]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
git-tree-sha1 = "a4d07a1c313392a77042855df46c5f534076fab9"
uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
version = "1.0.0"

[[Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"

[[Blosc]]
deps = ["Blosc_jll"]
git-tree-sha1 = "84cf7d0f8fd46ca6f1b3e0305b4b4a37afe50fd6"
uuid = "a74b3585-a348-5f62-a45c-50e91977d574"
version = "0.7.0"

[[Blosc_jll]]
deps = ["Libdl", "Lz4_jll", "Pkg", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "aa9ef39b54a168c3df1b2911e7797e4feee50fbe"
uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9"
version = "1.14.3+1"

[[BufferedStreams]]
deps = ["Compat", "Test"]
git-tree-sha1 = "5d55b9486590fdda5905c275bb21ce1f0754020f"
uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d"
version = "1.0.0"

[[CEnum]]
git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9"
uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
version = "0.4.1"

[[CRC32c]]
uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc"

[[CSV]]
deps = ["Dates", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode"]
git-tree-sha1 = "6d4242ef4cb1539e7ede8e01a47a32365e0a34cd"
uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
version = "0.8.4"

[[CategoricalArrays]]
deps = ["DataAPI", "Future", "JSON", "Missings", "Printf", "Statistics", "StructTypes", "Unicode"]
git-tree-sha1 = "f713d583d10fc036252fd826feebc6c173c522a8"
uuid = "324d7699-5711-5eae-9e2f-1d82baa6b597"
version = "0.9.5"

[[ChainRulesCore]]
deps = ["Compat", "LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "44e9f638aa9ed1ad58885defc568c133010140aa"
uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
version = "0.9.37"

[[CodecZlib]]
deps = ["TranscodingStreams", "Zlib_jll"]
git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
version = "0.7.0"

[[ColorTypes]]
deps = ["FixedPointNumbers", "Random"]
git-tree-sha1 = "32a2b8af383f11cbb65803883837a149d10dfe8a"
uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
version = "0.10.12"

[[Colors]]
deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
git-tree-sha1 = "82f4e6ff9f847eca3e5ebc666ea2cd7b48e8b47e"
uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
version = "0.12.7"

[[Compat]]
deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"]
git-tree-sha1 = "ac4132ad78082518ec2037ae5770b6e796f7f956"
uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
version = "3.27.0"

[[CompilerSupportLibraries_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "8e695f735fca77e9708e795eda62afdb869cbb70"
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
version = "0.3.4+0"

[[Conda]]
deps = ["JSON", "VersionParsing"]
git-tree-sha1 = "6231e40619c15148bcb80aa19d731e629877d762"
uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d"
version = "1.5.1"

[[Crayons]]
git-tree-sha1 = "3f71217b538d7aaee0b69ab47d9b7724ca8afa0d"
uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
version = "4.0.4"

[[DSP]]
deps = ["FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"]
git-tree-sha1 = "2a63cb5fc0e8c1f0f139475ef94228c7441dc7d0"
uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2"
version = "0.6.10"

[[DataAPI]]
git-tree-sha1 = "dfb3b7e89e395be1e25c2ad6d7690dc29cc53b1d"
uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
version = "1.6.0"

[[DataFrames]]
deps = ["CategoricalArrays", "Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
git-tree-sha1 = "d50972453ef464ddcebdf489d11885468b7b83a3"
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
version = "0.22.7"

[[DataStructures]]
deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
git-tree-sha1 = "4437b64df1e0adccc3e5d1adbc3ac741095e4677"
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
version = "0.18.9"

[[DataValueInterfaces]]
git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
version = "1.0.0"

[[Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"

[[DelimitedFiles]]
deps = ["Mmap"]
uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"

[[Distributed]]
deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"

[[Distributions]]
deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns"]
git-tree-sha1 = "e64debe8cd174cc52d7dd617ebc5492c6f8b698c"
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
version = "0.24.15"

[[ExprTools]]
git-tree-sha1 = "10407a39b87f29d47ebaca8edbc75d7c302ff93e"
uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04"
version = "0.1.3"

[[EzXML]]
deps = ["Printf", "XML2_jll"]
git-tree-sha1 = "0fa3b52a04a4e210aeb1626def9c90df3ae65268"
uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
version = "1.1.0"

[[FFTW]]
deps = ["AbstractFFTs", "FFTW_jll", "IntelOpenMP_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Reexport"]
git-tree-sha1 = "1b48dbde42f307e48685fa9213d8b9f8c0d87594"
uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
version = "1.3.2"

[[FFTW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "5a0d4b6a22a34d17d53543bd124f4b08ed78e8b0"
uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
version = "3.3.9+7"

[[FillArrays]]
deps = ["LinearAlgebra", "Random", "SparseArrays"]
git-tree-sha1 = "31939159aeb8ffad1d4d8ee44d07f8558273120a"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
version = "0.11.7"

[[FixedPointNumbers]]
deps = ["Statistics"]
git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc"
uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
version = "0.8.4"

[[Formatting]]
deps = ["Printf"]
git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8"
uuid = "59287772-0a20-5a39-b81b-1366585eb4c0"
version = "0.4.2"

[[Future]]
deps = ["Random"]
uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"

[[Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
git-tree-sha1 = "2c1cf4df419938ece72de17f368a021ee162762e"
uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
version = "1.1.0"

[[HDF5]]
deps = ["Blosc", "Compat", "HDF5_jll", "Libdl", "Mmap", "Random", "Requires"]
git-tree-sha1 = "8a21f34a34491833bcda29a3ec2188b4ec6e558f"
uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
version = "0.15.4"

[[HDF5_jll]]
deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "fd83fa0bde42e01952757f01149dd968c06c4dba"
uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
version = "1.12.0+1"

[[ImageCore]]
deps = ["AbstractFFTs", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"]
git-tree-sha1 = "db645f20b59f060d8cfae696bc9538d13fd86416"
uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
version = "0.8.22"

[[IndirectArrays]]
git-tree-sha1 = "c2a145a145dc03a7620af1444e0264ef907bd44f"
uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959"
version = "0.5.1"

[[IntelOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c"
uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
version = "2018.0.3+2"

[[InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"

[[Interpolations]]
deps = ["AxisAlgorithms", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
git-tree-sha1 = "eb1dd6d5b2275faaaa18533e0fc5f9171cec25fa"
uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
version = "0.13.1"

[[Intervals]]
deps = ["Dates", "Printf", "RecipesBase", "Serialization", "TimeZones"]
git-tree-sha1 = "323a38ed1952d30586d0fe03412cde9399d3618b"
uuid = "d8418881-c3e1-53bb-8760-2df7ec849ed5"
version = "1.5.0"

[[InvertedIndices]]
deps = ["Test"]
git-tree-sha1 = "15732c475062348b0165684ffe28e85ea8396afc"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
version = "1.0.0"

[[IterTools]]
git-tree-sha1 = "05110a2ab1fc5f932622ffea2a003221f4782c18"
uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
version = "1.3.0"

[[IteratorInterfaceExtensions]]
git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
uuid = "82899510-4779-5014-852e-03e436cf321d"
version = "1.0.0"

[[JLLWrappers]]
git-tree-sha1 = "a431f5f2ca3f4feef3bd7a5e94b8b8d4f2f647a0"
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
version = "1.2.0"

[[JSON]]
deps = ["Dates", "Mmap", "Parsers", "Unicode"]
git-tree-sha1 = "81690084b6198a2e1da36fcfda16eeca9f9f24e4"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
version = "0.21.1"

[[LaTeXStrings]]
git-tree-sha1 = "c7f1c695e06c01b95a67f0cd1d34994f3e7db104"
uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
version = "1.2.1"

[[LazyArtifacts]]
deps = ["Pkg"]
git-tree-sha1 = "4bb5499a1fc437342ea9ab7e319ede5a457c0968"
uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
version = "1.3.0"

[[LibCURL_jll]]
deps = ["LibSSH2_jll", "Libdl", "MbedTLS_jll", "Pkg", "Zlib_jll", "nghttp2_jll"]
git-tree-sha1 = "897d962c20031e6012bba7b3dcb7a667170dad17"
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
version = "7.70.0+2"

[[LibGit2]]
deps = ["Printf"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"

[[LibSSH2_jll]]
deps = ["Libdl", "MbedTLS_jll", "Pkg"]
git-tree-sha1 = "717705533148132e5466f2924b9a3657b16158e8"
uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
version = "1.9.0+3"

[[Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

[[Libiconv_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "8e924324b2e9275a51407a4e06deb3455b1e359f"
uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
version = "1.16.0+7"

[[LightXML]]
deps = ["Libdl", "XML2_jll"]
git-tree-sha1 = "e129d9391168c677cd4800f5c0abb1ed8cb3794f"
uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179"
version = "0.9.0"

[[LinearAlgebra]]
deps = ["Libdl"]
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

[[Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"

[[Lz4_jll]]
deps = ["Libdl", "Pkg"]
git-tree-sha1 = "51b1db0732bbdcfabb60e36095cc3ed9c0016932"
uuid = "5ced341a-0733-55b8-9ab6-a4889d929147"
version = "1.9.2+2"

[[MAT]]
deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"]
git-tree-sha1 = "5c62992f3d46b8dce69bdd234279bb5a369db7d5"
uuid = "23992714-dd62-5051-b70f-ba57cb901cac"
version = "0.10.1"

[[MKL_jll]]
deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"]
git-tree-sha1 = "c253236b0ed414624b083e6b72bfe891fbd2c7af"
uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
version = "2021.1.1+1"

[[MacroTools]]
deps = ["Markdown", "Random"]
git-tree-sha1 = "6a8a2a625ab0dea913aba95c11370589e0239ff0"
uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
version = "0.5.6"

[[MappedArrays]]
git-tree-sha1 = "18d3584eebc861e311a552cbb67723af8edff5de"
uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
version = "0.4.0"

[[Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"

[[MbedTLS_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "0eef589dd1c26a3ac9d753fe1a8bcad63f956fa6"
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
version = "2.16.8+1"

[[Missings]]
deps = ["DataAPI"]
git-tree-sha1 = "f8c673ccc215eb50fcadb285f522420e29e69e1c"
uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
version = "0.4.5"

[[Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804"

[[Mocking]]
deps = ["ExprTools"]
git-tree-sha1 = "916b850daad0d46b8c71f65f719c49957e9513ed"
uuid = "78c3b35d-d492-501b-9361-3d52fe80e533"
version = "0.7.1"

[[MosaicViews]]
deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d"
uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389"
version = "0.3.3"

[[NaNMath]]
git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb"
uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
version = "0.3.5"

[[OffsetArrays]]
deps = ["Adapt"]
git-tree-sha1 = "b3dfef5f2be7d7eb0e782ba9146a5271ee426e90"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
version = "1.6.2"

[[OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "71bbbc616a1d710879f5a1021bcba65ffba6ce58"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
version = "1.1.1+6"

[[OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "9db77584158d0ab52307f8c04f8e7c08ca76b5b3"
uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.3+4"

[[OrderedCollections]]
git-tree-sha1 = "4fa2ba51070ec13fcc7517db714445b4ab986bdf"
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
version = "1.4.0"

[[PDMats]]
deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
git-tree-sha1 = "f82a0e71f222199de8e9eb9a09977bd0767d52a0"
uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
version = "0.11.0"

[[PNGFiles]]
deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
git-tree-sha1 = "28f9667d6ca9168b7198a481847f0879e6c72ef1"
uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
version = "0.3.6"

[[PaddedViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "0fa5e78929aebc3f6b56e1a88cf505bb00a354c4"
uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
version = "0.5.8"

[[Parsers]]
deps = ["Dates"]
git-tree-sha1 = "c8abc88faa3f7a3950832ac5d6e690881590d6dc"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "1.1.0"

[[Pkg]]
deps = ["Dates", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"

[[Polynomials]]
deps = ["Intervals", "LinearAlgebra", "OffsetArrays", "RecipesBase"]
git-tree-sha1 = "0b15f3597b01eb76764dd03c3c23d6679a3c32c8"
uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45"
version = "1.2.1"

[[PooledArrays]]
deps = ["DataAPI", "Future"]
git-tree-sha1 = "cde4ce9d6f33219465b55162811d8de8139c0414"
uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720"
version = "1.2.1"

[[PrettyTables]]
deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"]
git-tree-sha1 = "574a6b3ea95f04e8757c0280bb9c29f1a5e35138"
uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
version = "0.11.1"

[[Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"

[[ProgressBars]]
deps = ["Printf"]
git-tree-sha1 = "b25377c38da4181e99832328a240c73f3d57fff2"
uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568"
version = "1.0.0"

[[ProgressMeter]]
deps = ["Distributed", "Printf"]
git-tree-sha1 = "6e9c89cba09f6ef134b00e10625590746ba1e036"
uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
version = "1.5.0"

[[ProtoBuf]]
deps = ["Compat", "Logging"]
git-tree-sha1 = "9ecf92287404ebe5666a1c0488c3aaf90bbb5ff4"
uuid = "3349acd9-ac6a-5e09-bcdb-63829b23a429"
version = "0.10.0"

[[PyCall]]
deps = ["Conda", "Dates", "Libdl", "LinearAlgebra", "MacroTools", "Serialization", "VersionParsing"]
git-tree-sha1 = "169bb8ea6b1b143c5cf57df6d34d022a7b60c6db"
uuid = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0"
version = "1.92.3"

[[PyPlot]]
deps = ["Colors", "LaTeXStrings", "PyCall", "Sockets", "Test", "VersionParsing"]
git-tree-sha1 = "67dde2482fe1a72ef62ed93f8c239f947638e5a2"
uuid = "d330b81b-6aea-500a-939a-2ce795aea3ee"
version = "2.9.0"

[[QuadGK]]
deps = ["DataStructures", "LinearAlgebra"]
git-tree-sha1 = "12fbe86da16df6679be7521dfb39fbc861e1dc7b"
uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
version = "2.4.1"

[[REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"

[[Random]]
deps = ["Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

[[Ratios]]
git-tree-sha1 = "37d210f612d70f3f7d57d488cb3b6eff56ad4e41"
uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
version = "0.4.0"

[[RecipesBase]]
git-tree-sha1 = "b3fb709f3c97bfc6e948be68beeecb55a0b340ae"
uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
version = "1.1.1"

[[Reexport]]
git-tree-sha1 = "57d8440b0c7d98fc4f889e478e80f268d534c9d5"
uuid = "189a3867-3050-52da-a836-e630ba90ab69"
version = "1.0.0"

[[Requires]]
deps = ["UUIDs"]
git-tree-sha1 = "4036a3bd08ac7e968e27c203d45f5fff15020621"
uuid = "ae029012-a4dd-5104-9daa-d747884805df"
version = "1.1.3"

[[Rmath]]
deps = ["Random", "Rmath_jll"]
git-tree-sha1 = "86c5647b565873641538d8f812c04e4c9dbeb370"
uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
version = "0.6.1"

[[Rmath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "1b7bf41258f6c5c9c31df8c1ba34c1fc88674957"
uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
version = "0.2.2+2"

[[SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"

[[SentinelArrays]]
deps = ["Dates", "Random"]
git-tree-sha1 = "6ccde405cf0759eba835eb613130723cb8f10ff9"
uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
version = "1.2.16"

[[Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"

[[SharedArrays]]
deps = ["Distributed", "Mmap", "Random", "Serialization"]
uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"

[[Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"

[[SortingAlgorithms]]
deps = ["DataStructures", "Random", "Test"]
git-tree-sha1 = "03f5898c9959f8115e30bc7226ada7d0df554ddd"
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
version = "0.3.1"

[[SparseArrays]]
deps = ["LinearAlgebra", "Random"]
uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"

[[SpecialFunctions]]
deps = ["ChainRulesCore", "OpenSpecFun_jll"]
git-tree-sha1 = "5919936c0e92cff40e57d0ddf0ceb667d42e5902"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
version = "1.3.0"

[[StackViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c"
uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
version = "0.1.1"

[[StaticArrays]]
deps = ["LinearAlgebra", "Random", "Statistics"]
git-tree-sha1 = "2f01a51c23eed210ff4a1be102c4cc8236b66e5b"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "1.1.0"

[[Statistics]]
deps = ["LinearAlgebra", "SparseArrays"]
uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"

[[StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics"]
git-tree-sha1 = "4bc58880426274277a066de306ef19ecc22a6863"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
version = "0.33.5"

[[StatsFuns]]
deps = ["Rmath", "SpecialFunctions"]
git-tree-sha1 = "ced55fd4bae008a8ea12508314e725df61f0ba45"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
version = "0.9.7"

[[StructTypes]]
deps = ["Dates", "UUIDs"]
git-tree-sha1 = "63fbaf8345b590161cd0c35b927f88d3f7b2cf75"
uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
version = "1.6.0"

[[SuiteSparse]]
deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"

[[TFRecord]]
deps = ["BufferedStreams", "CRC32c", "CodecZlib", "ImageCore", "MacroTools", "PNGFiles", "Printf", "ProgressMeter", "ProtoBuf", "Random"]
git-tree-sha1 = "7021a3d2d91e24d7ff7e3a1914826f716de459df"
uuid = "841416d8-1a6a-485a-b0fc-1328d0f53d5e"
version = "0.2.2"

[[TableTraits]]
deps = ["IteratorInterfaceExtensions"]
git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
version = "1.0.1"

[[Tables]]
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"]
git-tree-sha1 = "c9d2d262e9a327be1f35844df25fe4561d258dc9"
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
version = "1.4.2"

[[Test]]
deps = ["Distributed", "InteractiveUtils", "Logging", "Random"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[[TimeZones]]
deps = ["Dates", "EzXML", "Mocking", "Pkg", "Printf", "RecipesBase", "Serialization", "Unicode"]
git-tree-sha1 = "4ba8a9579a243400db412b50300cd61d7447e583"
uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53"
version = "1.5.3"

[[TranscodingStreams]]
deps = ["Random", "Test"]
git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
version = "0.9.5"

[[UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[[Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"

[[VersionParsing]]
git-tree-sha1 = "80229be1f670524750d905f8fc8148e5a8c4537f"
uuid = "81def892-9a0e-5fdd-b105-ffc91e053289"
version = "1.2.0"

[[WoodburyMatrices]]
deps = ["LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "59e2ad8fd1591ea019a5259bd012d7aee15f995c"
uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
version = "0.5.3"

[[XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "be0db24f70aae7e2b89f2f3092e93b8606d659a6"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
version = "2.9.10+3"

[[Zlib_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "320228915c8debb12cb434c59057290f0834dbf6"
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
version = "1.2.11+18"

[[Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "2c1332c54931e83f8f94d310fa447fd743e8d600"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
version = "1.4.8+0"

[[libpng_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "6abbc424248097d69c0c87ba50fcb0753f93e0ee"
uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
version = "1.6.37+6"

[[nghttp2_jll]]
deps = ["Libdl", "Pkg"]
git-tree-sha1 = "8e2c44ab4d49ad9518f359ed8b62f83ba8beede4"
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
version = "1.40.0+2"

Ok - in that case you can instantiate in the directory in which both Project.toml and Manifest.toml reside and the exact versions in the manifest will be downloaded, see:

https://pkgdocs.julialang.org/v1/api/#Pkg.instantiate

Note that for this to work you want to use the same Julia version which generated the Manifest - if you know this was 1.6 then use 1.6 as I suggested before.

If this script continues to be in use in the company it might be worth spending a day updating it to work with Julia 1.10 and the latest package versions, which might give you some speedups (definitely on latency, maybe even on runtime).

1 Like

Thanks, I am going to do that, I’ll tell you how it goes !

When it comes to upgrading to Julia 1.10, maybe this is something I’ll do toward the end of my internship if I have time (because I’m there for 5 months and have a lot to do) :slight_smile:

Just to be sure updating from 1.6 to 1.10 shouldn’t really require any changes, changes come from updating the package versions (where there is a major version bump).

So e.g. your code uses DataFrames 0.22.7, while the current release is 1.6.1. When you update the DataFrames dependency some code might break as syntax might have changed. For some packages this isn’t a problem at all (e.g. MAT is recorded as 0.10.1 in your Manifest, while it resolves to 0.10.6 currently so this should be a non-breaking change).

You can try updating packages one-by-one if you pin the remaining dependencies.

1 Like

Ok so I decided to try with uploaded v1.6 and using the instantiate method.
Here is a detailed list of the steps I did :

  • I uploaded Julia v1.6, which was the version used to develop the original code.

  • I found the Manifest.toml on the computer that was used to develop the original code, in the directory containing the code.

  • I replaced my Manifest.toml by the one I had found on the other computer (I kept the old one in another folder, just in case).

  • I opened the Julia REPL (v1.6) by running the /path/to/Julia-1.6 command in my terminal.

  • Once inside the Julia REPL, I changed the directory to the desired location using the ; command followed by the cd command.

  • After changing to the desired directory, I ran using Pkg and then the Pkg.instantiate() command to instantiate the project environment.

The ‘good news’, if I can call it that way, is : The big error message is gone and was replaced by a smaller one. However, I still have an error related to the Julia package LightXML :

Isn’t it weird that the instantiate method worked with the other packages but not with this one? I’ll keep trying solving it now that I understand what’s going on a little bit more, but I’m open to any solution :slight_smile: .

It looks like all packages have been installed and compiled successfully, you are now seeing an actual runtime error that comes from parsing of an XML file. Probably worth isolating that (i.e. just install LightXML in a new environment and try only reading in the XML file you are looking to read in) and make a new thread about that, the CSV issue that this topic is about seems to have been solved.

2 Likes

Ok I thought it was probably coming from something else. Thank you very much for your help !!

It is not clear from your explanation whether you activated the project you cd’d to before instantiating it. Just want to make sure that you are in the local environment for the code you are trying to run, using the local Project.toml and Manifest.toml, rather than the global Julia 1.6 environment. You can double check by hitting ] and seeing the environment name in the prompt.

Oh, you’re right, I was in fact in the global Julia 1.6 environment. But I don’t understand, why did it work then ?
Besides I tried running pkg> activate and still ended up in the global Julia1.6 environment…

EDIT : Sorry I should try more before posting : I was able to activate the local environment manually with the commands using Pkg and Pkg.activate("/path/to/localproject"). And then I ran the Pkg.instantiate() command again.
However to be honest, I don’t really see the advantage compared to what I did before since the problem had somehow been resolved but I guess it’s always better when things are done the most proper way.

You can do ]activate . when you are in the right folder. As you wanted to instantiate a previously resolved Manifest file, that‘s what you should be doing. Somehow you managed to install the dependencies in the global environment previously. I recommend you remove packages from the global environment, as it will be stacked underneath any other environment. Best practice is to keep the global environment to only a few developer tooling packages.