Add Abiliity to Pass Custom Load Function to `collect_results!`
Opened this issue · 2 comments
Firstly, thank you writing this amazing package. I love it and have used it for over a year now in my academic work.
I have been trying to take full advantage of every capability DrWatson has to offer and I've pretty much done that except for collect_results!
. I'd really like to be able to take advantage of this because I have many many simulations and a summary table of the most important parameters would really help when preparing results and reviewing what additional runs I need to make.
Here is my problem and I apologize if there is already an obvious solution and I missed it. I save all my simulation results in a struct around which I've built a lot of methods. My structs contain all the parameters that are important to my simulations as well as my results themselves. Something like this
struct MySim
Param1::Float64
Param2::Int64
Result1::Matrix{Float64}
# and so on, many more
end
It is important that when I save this to disc, it is saved as a struct and not as a dict. That means that when I save it I do something like this
wsave("full_path_to_result.jld2", "solution", myresult) # where myresult is of type MySim
And when I load I have to do
result = wload("full_path_to_result.jld2")["solution"]
But this seems problematic for collect_results!
which expects (as far as I can tell) that myresult
has passed through struct2dict
. I really only need this step if I am printing a summary table to file. Thus, I'm wondering can we add a kwarg to collect_results!
that wraps the call to wload
just within the source of collect_results!
? I'm happy to write the pull request but I wanted to make sure this was sensible before I did. I'm thinking something like this.
function collect_results!(filename, folder;
valid_filetypes = [".bson", "jld", ".jld2"],
subfolders = false,
rpath = nothing,
verbose = true,
update = false,
newfile = false, # keyword only for defining collect_results without !
rinclude = [r""],
rexclude = [r"^\b$"],
load_function = () -> ()
kwargs...)
# Skipping some code here
data = load_function(wload(filename))
This way, I could implement a load function like this and I'd get the desired behavior.
load_function = (d) -> struct2dict(d["solution"])
Perhaps this is too specialized for my use case? I'm not sure. Please let me know if this could be achieved in a better fashion or if I am missing something here. The only thing I insist on is that I'd like to maintain saving my results as structs and not converting them to dictionaries. If I converted them to dicts I'd have to define new functions to rebuild the structs from the loaded dicts which I'd like to avoid.
thanks for the good words!
The simple solution i see is to add a new keyword argument to collect_results
that is the load function itself. It would default to wload
but could be overloaded by anything. Such as your load_function
above.
This would be a very simple change to do in a Pull Request if you are up for it!
Created new PR, now in #424