载入中...
搜索中...
未找到
SimulationBackend.cpp
浏览该文件的文档.
23eve::Result<void> validateStep(const eve::SimulationStep& step, const SimulationSettings& settings,
28 eve::DiagnosticCode::InvalidArgument, "Physics simulation step duration must be finite and non-negative",
33 eve::DiagnosticCode::InvalidArgument, "Physics simulation step duration must be in [0, 0.05] seconds",
39 "Physics simulation tick must increase strictly for every backend step", "physics.simulationStep.tick"));
41 if (settings.velocityIterations < kMinimumIterations || settings.velocityIterations > kMaximumIterations ||
42 settings.positionIterations < kMinimumIterations || settings.positionIterations > kMaximumIterations ||
45 eve::DiagnosticCode::InvalidArgument, "Physics simulation iteration counts must be in [1, 1024]",
51eve::Result<eve::Duration> accumulatedDuration(const eve::Duration& current, const eve::Duration& delta) {
62 CallbackSimulationBackend(void* context, SimulationStepCallback callback, SimulationBackendKind kind,
66 [[nodiscard]] eve::Result<void> step(const eve::SimulationStep& step, const SimulationSettings& settings) override {
79 [[nodiscard]] SimulationObservation observation() const noexcept override { return observation_; }
83 [[nodiscard]] SimulationDeterminism determinism() const noexcept override { return determinism_; }
85 [[nodiscard]] eve::Result<void> restoreObservation(const SimulationObservation& observation) override {
86 auto valid = detail::validateSimulationObservation(observation, "physics.simulationBackend.restoreObservation");
100void stepBox2D(void* context, const eve::SimulationStep& step, const SimulationSettings& settings) noexcept {
102 world->Step(static_cast<float>(step.delta.seconds()), settings.velocityIterations, settings.positionIterations);
116eve::Result<SimulationBackendSelection> cpuFallback(std::unique_ptr<ISimulationBackend> cpuBackend,
131eve::Diagnostic attemptedProviderWarning(const eve::Diagnostic& diagnostic, std::size_t attempt) {
134 return eve::Diagnostic::warning(diagnostic.code(), diagnostic.message(), diagnostic.path(), std::move(details),
157AcceleratorBackendProviderRegistration::AcceleratorBackendProviderRegistration(
178eve::Result<void> validateSimulationStep(const eve::SimulationStep& step, const SimulationSettings& settings,
183eve::Result<SimulationObservation> advanceSimulationObservation(const SimulationObservation& current,
187 eve::DiagnosticCode::InvariantViolation, "Physics simulation observation step count cannot overflow",
208eve::Result<void> validateSimulationObservation(const SimulationObservation& observation, const char* path) {
215 eve::DiagnosticCode::InvalidArgument, "Simulation observation contains invalid progress values", path));
218 if (!std::isfinite(durationSeconds) || std::fabs(durationSeconds - observation.simulatedSeconds) > 1e-6) {
220 eve::DiagnosticCode::Conflict, "Simulation observation seconds disagree with exact duration", path));
226 if (!world) throw eve::Exception("Physics: cannot create a simulation backend for a null world");
231std::unique_ptr<ISimulationBackend> makeCallbackSimulationBackend(void* context, SimulationStepCallback callback,
234 if (!callback) throw eve::Exception("Physics: callback simulation backend requires a callback");
239 return std::make_unique<CallbackSimulationBackend>(nullptr, nullptr, SimulationBackendKind::MockAccelerator,
248 eve::DiagnosticCode::InvalidArgument, "Physics backend selection requires a CPU fallback backend",
262 if (auto* provider = eve::cap::listenerAt<IAcceleratorBackendProvider>(index)) providers.push_back(provider);
291 eve::DiagnosticCode::InvariantViolation, "Physics accelerator provider returned a null backend",
301 failedDiagnostics.insert(failedDiagnostics.end(), successDiagnostics.begin(), successDiagnostics.end());
307 eve::DiagnosticCode::CallbackFailure, error.what(), "physics.simulationBackend.provider.create",
Backend-neutral, observable fixed-step contract for physics domains.
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
const std::string & path() const noexcept
Optional field, property, URI, or logical path.
Definition Diagnostic.h:149
void addDetail(std::string key, std::string value)
Add structured context without changing the stable code.
Definition Diagnostic.h:156
static Diagnostic warning(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct a warning diagnostic.
Definition Diagnostic.h:134
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
const DiagnosticDetails & details() const noexcept
Structured context in insertion order.
Definition Diagnostic.h:151
const std::string & source() const noexcept
Optional producer or subsystem that emitted the diagnostic.
Definition Diagnostic.h:153
constexpr std::int64_t nanoseconds() const noexcept
Return the exact signed nanosecond representation.
Definition Time.h:69
double seconds() const noexcept
Return this duration as seconds for legacy/presentation APIs.
Definition Time.cpp:28
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
constexpr bool isZero() const noexcept
Returns whether this value is zero.
Definition StrongUint64.h:28
Move-only lifetime token for one independently registered accelerator provider.
Definition SimulationBackend.h:250
static eve::Result< AcceleratorBackendProviderRegistration > registerProvider(IAcceleratorBackendProvider &provider, int priority=0)
Registers an externally owned provider for multi-provider selection.
Definition SimulationBackend.cpp:140
AcceleratorBackendProviderRegistration & operator=(const AcceleratorBackendProviderRegistration &)=delete
void reset() noexcept
Removes this provider immediately; safe to call more than once.
Definition SimulationBackend.cpp:169
~AcceleratorBackendProviderRegistration()
Removes this registration without affecting other providers.
Definition SimulationBackend.cpp:155
Optional provider that creates an accelerator backend for domain state.
Definition SimulationBackend.h:216
static constexpr const char * capabilityName
Definition SimulationBackend.h:218
constexpr HexDirection next(HexDirection d) noexcept
The next direction clockwise (NW wraps to NE).
Definition HexMetrics.h:76
constexpr std::string_view simulationBackendDomainName(SimulationBackendDomain domain) noexcept
Returns the stable diagnostic spelling for an accelerated simulation domain.
Definition SimulationBackend.h:50
void(*)(void *context, const eve::SimulationStep &step, const SimulationSettings &settings) noexcept SimulationStepCallback
Callback used by a domain-owned CPU or test backend adapter.
Definition SimulationBackend.h:301
SimulationBackendKind
Kind of implementation that owns a simulation step.
Definition SimulationBackend.h:32
@ MockAccelerator
SimulationBackendDomain
Domain state consumed by an accelerator provider.
Definition SimulationBackend.h:39
SimulationDeterminism
Determinism guarantee made by a simulation backend.
Definition SimulationBackend.h:64
@ ToleranceBounded
Results are equivalent within a documented numeric tolerance.
@ InvalidArgument
@ CallbackFailure
@ PreconditionViolation
@ Unsupported
@ InvariantViolation
@ Conflict
@ Applied
Result of choosing an optional accelerator or CPU alternate path.
Definition SimulationBackend.h:288
bool usedFallback
Whether CPU was selected after an accelerator request.
Definition SimulationBackend.h:296
SimulationBackendKind requestedKind
Provider family requested by the owner.
Definition SimulationBackend.h:292
SimulationBackendKind actualKind
Provider family actually selected.
Definition SimulationBackend.h:294
std::unique_ptr< ISimulationBackend > backend
Owning selected backend; it borrows the supplied domain state.
Definition SimulationBackend.h:290
Observable backend progress shared by CPU and accelerator providers.
Definition SimulationBackend.h:136
eve::Duration simulatedDuration
Accumulated logical simulation time, never wall-clock time.
Definition SimulationBackend.h:142
float lastDeltaSeconds
Duration consumed by the most recently completed step.
Definition SimulationBackend.h:146
double simulatedSeconds
Accumulated logical simulation time in seconds.
Definition SimulationBackend.h:144
eve::SimulationTick lastTick
Tick of the most recently completed step.
Definition SimulationBackend.h:140
std::uint64_t stepCount
Number of completed steps since backend creation.
Definition SimulationBackend.h:138
Validated solver policy for one simulation step.
Definition SimulationBackend.h:120