EpochSim.Serialization
0.1.0
See the version list below for details.
dotnet add package EpochSim.Serialization --version 0.1.0
NuGet\Install-Package EpochSim.Serialization -Version 0.1.0
<PackageReference Include="EpochSim.Serialization" Version="0.1.0" />
<PackageVersion Include="EpochSim.Serialization" Version="0.1.0" />
<PackageReference Include="EpochSim.Serialization" />
paket add EpochSim.Serialization --version 0.1.0
#r "nuget: EpochSim.Serialization, 0.1.0"
#:package EpochSim.Serialization@0.1.0
#addin nuget:?package=EpochSim.Serialization&version=0.1.0
#tool nuget:?package=EpochSim.Serialization&version=0.1.0
EpochSim
Детерминированный движок тиковых симуляций на C# с журналом событий, воспроизведением, снапшотами и инструментами анализа.
Зачем
EpochSim полезен, когда нужно:
- гарантировать повторяемость результатов при одинаковых входных данных;
- логировать все события и уметь воспроизводить симуляцию;
- быстро перематывать состояние с помощью снапшотов;
- иметь воспроизводимые тесты и удобные CLI‑инструменты.
Установка (NuGet)
Основные пакеты:
EpochSim.KernelEpochSim.ExecutionEpochSim.SerializationEpochSim.Observability
Метапакет:
EpochSim.All— подтягивает основные пакеты одним зависимым.
CLI как .NET tool:
dotnet tool install -g EpochSim.Cli
epochsim --help
EpochSim.Samples — демо‑домен, на NuGet не публикуется.
Быстрый старт
Примеры ниже используют демо‑домен Population.
Запуск симуляции и запись артефактов в artifacts/:
dotnet run --project src/EpochSim.Cli run artifacts
Валидация (инварианты + дампы при нарушении):
dotnet run --project src/EpochSim.Cli validate-run artifacts
Проверка детерминизма по state fingerprints:
dotnet run --project src/EpochSim.Cli verify-run artifacts
Быстрое воспроизведение с использованием снапшотов:
dotnet run --project src/EpochSim.Cli fast-replay artifacts
Сводка по событиям:
dotnet run --project src/EpochSim.Cli event-stats artifacts
Таймлайн событий за диапазон тиков:
dotnet run --project src/EpochSim.Cli timeline artifacts 0 100
Инспект артефактов:
dotnet run --project src/EpochSim.Cli inspect-run artifacts <runId>
dotnet run --project src/EpochSim.Cli pretty-inspect artifacts <runId>
Бисект первого нарушения инварианта:
dotnet run --project src/EpochSim.Cli bisect artifacts <runId>
Что создаёт запуск
В каталоге artifacts/<runId>/:
events.jsonl/events.jsonl.gz— журнал событий (JSONL, v2).trace.jsonl/trace.jsonl.gz— трассировка.statefp.jsonl— отпечатки состояния (SHA‑256 от канонического JSON).snapshots/— снапшоты состояния.dumps/— дампы при нарушениях инвариантов.manifest.json— манифест запуска (версии, опции, интервалы).meta.txt— старый мета‑файл (для совместимости).failure-report.jsonиfailure-snapshot.json— отчёт о падении (если ошибка во время прогона).
Основные правила
- Детерминизм: одинаковые входные данные дают идентичный результат.
- Тики:
OnTickStart(T)вызывается до любого диспетча событий тикаT.
OnTickEnd(T)— после завершения обработки команд/событий. - Очереди: команды и события обрабатываются FIFO.
- Планировщик:
ScheduleAtразрешён только на будущий тик (targetTick > currentTick).
Для удобства естьScheduleNextTickиScheduleInTicks(>=1). - Немедленные события:
ctx.Events.Emit(ev)добавляет событие в текущий тик (в рамках pump‑цикла). - Replay: в strict‑режиме
Emitзапрещён.
Подробно: DeterminismContract.
Пример API
public sealed class WorldState
{
public int Value { get; set; }
}
public sealed record IncCommand(int Delta) : ICommand { public string Kind => "Inc"; }
public sealed record ValueChanged(int Delta) : IEvent { public string Kind => "ValueChanged"; }
public sealed class IncHandler : ICommandHandler<WorldState, IncCommand>
{
public void Handle(WorldState state, IncCommand command, IEventBuffer events)
=> events.Emit(new ValueChanged(command.Delta));
}
public sealed class WorldSystem : ISystem<WorldState>
{
public string Name => "world";
public void Tick(TickContext<WorldState> ctx)
{
if (ctx.Time.Tick == 0)
ctx.Commands.Enqueue(new IncCommand(5));
}
public void Handle(EventContext<WorldState> ctx, IEvent ev)
{
if (ev is ValueChanged e)
{
ctx.State.Value += e.Delta;
// Немедленное событие в текущем тике:
// ctx.Events.Emit(new SomeEvent(...));
}
}
}
Запуск:
var engine = new SimulationEngine<WorldState>();
engine.AddSystem(new WorldSystem());
engine.RegisterCommandHandler(new IncHandler());
var state = new WorldState();
engine.RunTicks(state, seed: 12345, start: SimTime.Zero, endInclusive: new SimTime(100));
Воспроизведение
var codec = /* IEventCodecV2 */;
var entries = EventLogReader.ReadStream("events.jsonl");
engine.ReplayFromLogStream(
state,
seed: 12345,
start: SimTime.Zero,
endInclusive: new SimTime(100),
entries: entries,
codec: codec);
Опции запуска
В RunOptions можно ограничивать pump‑цикл:
MaxPumpStepsPerTick— защита от бесконечного цикла команд/событий.MaxEventsPerTick— лимит событий на тик.RngVersion— версия генератора (V1для совместимости,V2по умолчанию).
В CLI:
--max-pump-steps N
--max-events-per-tick N
--snapshot-every N
--fingerprint-every N
--rng-version v1|v2
--compress
--cancel-after-ms N
Доменный адаптер CLI
CLI не зависит от конкретного домена — он работает через IDomainAdapter.
Минимальный набор:
CreateInitialState()CreateSystems()/ConfigureEngine()Codec,SerializerCreateInvariants()(если нужны)
См. пример: PopulationDomainAdapter.cs.
Тесты и бенчмарки
Тесты:
dotnet test tests/EpochSim.Determinism.Tests/EpochSim.Determinism.Tests.csproj
Бенчмарки:
dotnet run -c Release --project benchmarks/EpochSim.Benchmarks
Структура репозитория
src/EpochSim.All— метапакет (NuGet)src/EpochSim.Kernel— ядро: время, события, планировщик, RNGsrc/EpochSim.Execution— движок и middlewaresrc/EpochSim.Serialization— event log, снапшоты, сериализацияsrc/EpochSim.Observability— трассировкаsrc/EpochSim.Samples— демо‑домен Population (не публикуется)src/EpochSim.Cli— CLI‑инструментыtests/— детерминизм и семантикаbenchmarks/— BenchmarkDotNet
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- EpochSim.Kernel (>= 0.1.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on EpochSim.Serialization:
| Package | Downloads |
|---|---|
|
EpochSim.All
Batteries-included meta-package for EpochSim that references the complete module set (facade, engine, serialization, observability, kernel). |
|
|
EpochSim.Execution
Simulation engine and execution pipeline for EpochSim, including replay, snapshots, and run limits. |
|
|
EpochSim
Facade-first package for EpochSim: ergonomic entrypoints, quick presets, and minimal wiring for deterministic runs. |
GitHub repositories
This package is not used by any popular GitHub repositories.