Julia. Пакет DrWatson

2025-05-14 · 2 мин. для прочтения

Julia. Пакет DrWatson.

Содержание

1 Общая информация


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/
  • Шаблоны проектов

    • Создайте шаблон через PkgTemplates.jl:
      using PkgTemplates
      t = Template(;
        dir="~/Projects",
        julia=v"1.9",
        plugins=[DrWatsonPlugin()]
      )
      t("MyNewProject")
      
  • Отладка

    • Используйте 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 → Рендерим финальный документ
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Мои научные интересы включают физику, администрирование Unix и сетей.