Julia. Пакет DrWatson
2025-05-14
·
2 мин. для прочтения
Julia. Пакет DrWatson.
Содержание
1 Общая информация
- DrWatson.jl — фреймворк для организации научных проектов в Julia.
- Репозиторий: https://github.com/JuliaDynamics/DrWatson.jl
- Документация: https://juliadynamics.github.io/DrWatson.jl
2 Установка и инициализация
Установка в REPL:
# Установка using Pkg Pkg.add("DrWatson") # Создание проекта using DrWatson initialize_project("MyProject"; authors=["Ваше Имя"], git=true)
Создаваемая структура:
MyProject/ ├── Project.toml ├── Manifest.toml ├── data/ │ ├── sims/ # Результаты симуляций │ ├── exp_raw/ # Сырые экспериментальные данные │ └── exp_pro/ Обработанные данные ├── scripts/ # Скрипты для анализа ├── src/ # Исходный код проекта └── _research/ # Черновики и временные файлы
Активирует окружение проекта, загружает зависимости:
@quickactivate :MyProject # Автоматически находит Project.toml
3 Пути
- Стандартные пути:
datadir() # → "data" plotsdir() # → "plots" projectdir() # → Корень проекта scriptdir("analysis.jl") → "scripts/analysis.jl"
4 Сохранение результатов
using DrWatson: savename, @dict, safesave
params = @dict(α=0.1, β=2.0) # Автоматическое именование
results = Dict(:data => rand(10))
# Сохранение с уникальным именем
filename = savename(params, "jld2") # → "α=0.1_β=2.0.jld2"
safesave(datadir("sims", filename), results)
5 Загрузка данных
using DrWatson: load, @strdict
# Поиск файлов по параметрам
filter = @strdict(α=0.1)
file = getlatest(filter, datadir("sims")) # Последний файл с α=0.1
data = load(file)["data"]
6 Воспроизводимость
gitdescribe() # Возвращает текущий коммит Git → "v0.1.0-5-gf7a2d"
tag!(filename) # Добавляет хеш коммита к имени файла
7 Пакетная обработка
using BSON
# Генерация параметров
all_params = Dict(:α => [0.1, 0.5], :β => 1:5)
# Запуск симуляций
for params in dict_list(all_params)
result = simulate(params)
safesave(datadir("sims", savename(params, "bson")), result)
end
8 Анализ результатов
using DataFrames
# Сбор всех данных в DataFrame
df = collect_results(datadir("sims"))
select!(df, :α, :β, :result)
9 Интеграция с Literate.jl
# scripts/generate_report.jl
using Literate
Literate.markdown("scripts/analysis.jl", "docs"; flavor = Literate.QuartoFlavor())
10 Makefile
- Сделаем Makefile:
.PHONY: report clean report: julia --project=. scripts/run_simulations.jl julia --project=. scripts/generate_report.jl quarto render docs/report.qmd clean: rm -rf data/sims/* rm -rf plots/*
11 Практики
Структура кода
- Храните многократно используемые функции в
src/
как модуль:# src/MyProject.jl module MyProject export simulate function simulate(params) # ... end end
- Храните многократно используемые функции в
Версионирование данных
- Используйте Git LFS для больших файлов в
data/
- Используйте Git LFS для больших файлов в
Шаблоны проектов
- Создайте шаблон через PkgTemplates.jl:
using PkgTemplates t = Template(; dir="~/Projects", julia=v"1.9", plugins=[DrWatsonPlugin()] ) t("MyNewProject")
- Создайте шаблон через PkgTemplates.jl:
Отладка
- Используйте
produce_or_load
для кэширования результатов:produce_or_load(params, datadir("cache")) do p compute_expensive_operation(p) end
- Используйте
12 Пример рабочего процесса
initialize_project()
→ Создает структуруquickactivate()
→ Активирует окружение- Редактируем скрипты в
scripts/
savename()
+safesave()
→ Сохраняем результатыcollect_results()
→ Анализируем данные- Literate.jl → Генерируем отчет
- Quarto → Рендерим финальный документ