载入中...
搜索中...
未找到
Decision.cpp
浏览该文件的文档.
47 std::invoke(std::forward<Release>(release), ref).ignore("rollback failed owned decision allocation");
51 auto result = eve::script::projectStatusResult(vm, eve::Status::success(eve::StatusCode::Applied));
100eve::Result<void> DecisionContext::set(const std::string& board, const std::string& key, const std::string& valueJson) {
105 eve::DiagnosticCode::InvalidArgument, "blackboard name must not be empty", "board", {}, "decision"));
109 eve::DiagnosticCode::InvalidArgument, "blackboard key must not be empty", "key", {}, "decision"));
113 eve::DiagnosticCode::ParseError, parseError.empty() ? "invalid blackboard JSON" : parseError, "value", {},
118 eve::DiagnosticCode::InvalidArgument, "blackboard value must be a JSON scalar", "value", {}, "decision"));
135eve::Result<void> DecisionContext::addTransition(const std::string& m, const std::string& f, const std::string& t,
219eve::Result<void> DecisionContext::newGrid(const std::string& name, int width, int height, float cellSize,
223 eve::DiagnosticCode::InvalidArgument, "influence grid name must not be empty", "name", {}, "decision"));
230 if (!std::isfinite(cellSize) || cellSize <= 0 || !std::isfinite(originX) || !std::isfinite(originY)) {
233 "influence grid geometry must be finite and have a positive cell size", "geometry", {}, "decision"));
246 if (x < 0 || y < 0 || x >= gridIt->second.width || y >= gridIt->second.height || !std::isfinite(value)) {
248 eve::DiagnosticCode::InvalidArgument, "influence grid cell or value is invalid", "cell", {}, "decision"));
261 if (x < 0 || y < 0 || x >= gridIt->second.width || y >= gridIt->second.height || !std::isfinite(delta)) {
263 eve::DiagnosticCode::InvalidArgument, "influence grid cell or value is invalid", "cell", {}, "decision"));
276float DecisionContext::sample(const std::string& name, float worldX, float worldY, float fallback) const {
320 o << "[" << quote(m) << ',' << quote(key.first) << ',' << quote(key.second) << ',' << quote(to) << "]";
344 if (!d.root().isObject()) return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
349 eve::DiagnosticCode::UnknownVersion, "unsupported decision snapshot version", "version", {}, "decision"));
352 if (!b.isObject()) return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
356 if (!v.isObject()) return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
361 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
368 if (!st.isObject()) return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
372 if (!state.isString()) return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
378 if (!tr.isArray()) return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
383 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
384 "FSM transition must contain four strings", "transitions[" + std::to_string(i) + "]", {}, "decision"));
387 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
388 "FSM transition must contain four strings", "transitions[" + std::to_string(i) + "]", {}, "decision"));
389 auto result = n.addTransition(v.at(0).asString(), v.at(1).asString(), v.at(2).asString(), v.at(3).asString());
393 if (!gs.isArray()) return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
398 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
406 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
409 n.newGrid(name.asString(), w, h, float(cell.asDouble()), float(ox.asDouble()), float(oy.asDouble()));
413 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
414 "influence grid values have the wrong size", "grids[" + std::to_string(i) + "].values", {}, "decision"));
418 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::SerializationError,
419 "influence grid cell must be a finite number", "grids[" + std::to_string(i) + "].values[" + std::to_string(z) + "]", {}, "decision"));
445 eve::DiagnosticCode::StaleHandle, "Decision module is no longer loaded", "context", {}, "decision"));
458 auto x = t.addClass<DecisionContext>("DecisionContext", std::function<DecisionContext*()>([]() { return nullptr; }),
461 [vm](DecisionContext* value, const std::string& board, const std::string& key, const std::string& json) {
470 x.addFunc("addTransition", [vm](DecisionContext* value, const std::string& machine, const std::string& from,
478 x.addFunc("setState", [vm](DecisionContext* value, const std::string& machine, const std::string& state) {
485 x.addFunc("trigger", [vm](DecisionContext* value, const std::string& machine, const std::string& trigger) {
496 x.addFunc("utility", [](DecisionContext*, const std::string& s) { return DecisionContext::utility(s); });
497 x.addFunc("choose", [](DecisionContext*, const std::string& s) { return DecisionContext::choose(s); });
498 x.addFunc("newGrid", [vm](DecisionContext* value, const std::string& name, int width, int height, float cellSize,
504 return eve::script::projectResult(vm, value->newGrid(name, width, height, cellSize, originX, originY));
506 x.addFunc("setCell", [vm](DecisionContext* value, const std::string& name, int x, int y, float cell) {
513 x.addFunc("addCell", [vm](DecisionContext* value, const std::string& name, int x, int y, float delta) {
548 owned.addFunc("setState", [vm](ScriptDecisionContext* value, const std::string& machine, const std::string& state) {
562 owned.addFunc("set", [vm](ScriptDecisionContext* value, const std::string& board, const std::string& key,
564 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
572 owned.addFunc("get", [](ScriptDecisionContext* value, const std::string& board, const std::string& key,
574 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
579 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
588 "trigger", [vm](ScriptDecisionContext* value, const std::string& machine, const std::string& trigger) {
589 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
601 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
604 owned.addFunc("newGrid", [vm](ScriptDecisionContext* value, const std::string& name, int width, int height,
606 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
612 return eve::script::projectResult(vm, view->newGrid(name, width, height, cellSize, originX, originY));
614 owned.addFunc("setCell", [vm](ScriptDecisionContext* value, const std::string& name, int x, int y, float cell) {
615 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
623 owned.addFunc("addCell", [vm](ScriptDecisionContext* value, const std::string& name, int x, int y, float delta) {
624 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
632 owned.addFunc("sample", [](ScriptDecisionContext* value, const std::string& name, float worldX, float worldY,
634 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
638 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
642 auto view = value ? Decision::resolve(value->reference) : eve::script::Borrowed<DecisionContext>();
651 [](ScriptDecisionContext*, const std::string& input) { return DecisionContext::utility(input); });
653 [](ScriptDecisionContext*, const std::string& input) { return DecisionContext::choose(input); });
661 vm, Decision::newContext(), [](DecisionContextHandleRef ref) { return Decision::release(ref); });
The single Squirrel projection for common Result, Status and Value.
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
void ignore(std::string_view reason={}) const noexcept
Explicitly discard this result after documenting the reason.
Definition Result.h:537
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
Data-oriented blackboard, FSM, utility and influence-map workspace.
Definition Decision.h:23
eve::Result< void > setState(const std::string &machine, const std::string &state)
Sets the current state explicitly.
Definition Decision.cpp:144
static std::string choose(const std::string &options)
Selects an option from name=considerations entries; ties use lexical name.
Definition Decision.cpp:196
std::string state(const std::string &machine) const
Gets current machine state.
Definition Decision.cpp:168
float sample(const std::string &name, float worldX, float worldY, float fallback) const
Samples the containing cell, returning fallback outside the grid.
Definition Decision.cpp:276
eve::Result< void > set(const std::string &board, const std::string &key, const std::string &valueJson)
Sets a scalar JSON value on a named blackboard.
Definition Decision.cpp:100
eve::Result< void > addTransition(const std::string &machine, const std::string &from, const std::string &trigger, const std::string &to)
Adds or replaces a finite-state transition.
Definition Decision.cpp:135
static float utility(const std::string &considerationsCsv)
Scores CSV considerations formatted value:weight using a weighted mean.
Definition Decision.cpp:172
eve::Result< void > addCell(const std::string &name, int x, int y, float delta)
Adds to one grid cell, or returns a structured not-found/validation failure.
Definition Decision.cpp:255
eve::Result< bool > trigger(const std::string &machine, const std::string &trigger)
Applies an explicit trigger.
Definition Decision.cpp:152
eve::Result< void > restoreJson(const std::string &json)
Restores a version-1 snapshot transactionally.
Definition Decision.cpp:337
eve::Result< void > setCell(const std::string &name, int x, int y, float value)
Sets one grid cell, or returns a structured not-found/validation failure.
Definition Decision.cpp:240
eve::Result< void > newGrid(const std::string &name, int width, int height, float cellSize, float originX, float originY)
Creates or replaces a zero-filled 2D influence grid.
Definition Decision.cpp:219
std::string get(const std::string &board, const std::string &key, const std::string &fallbackJson) const
Gets canonical scalar JSON or the supplied fallback.
Definition Decision.cpp:125
static eve::Result< void > release(DecisionContextHandleRef reference)
Releases a module-owned decision context.
Definition Decision.cpp:441
static bool isStale(DecisionContextHandleRef reference) noexcept
Reports whether a decision context reference is stale.
Definition Decision.cpp:449
static eve::script::Borrowed< DecisionContext > resolve(DecisionContextHandleRef reference) noexcept
Resolves a live context as a non-owning observation.
Definition Decision.cpp:435
static eve::Result< DecisionContextHandleRef > newContext()
Allocates a module-owned decision context and returns its handle.
Definition Decision.cpp:430
static Document parse(const std::string &text, std::string *error=nullptr)
Parse.
Definition Json.cpp:581
Non-owning C++ observation with no implicit lifetime extension.
Definition RuntimeRegistry.h:42
Definition Condition.cpp:7
eve::script::RuntimeHandleRef< DecisionContextHandleTag > DecisionContextHandleRef
Generation- and module-epoch-qualified decision context reference.
Definition Decision.h:20
@ Borrowed
ssq::Table projectStatusResult(HSQUIRRELVM vm, const Status &status)
Project a checked native status that carries no payload.
Definition SquirrelBinding.cpp:454
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
Definition SquirrelBinding.cpp:470
@ InvalidArgument
@ NotFound
@ UnknownVersion
@ SerializationError
@ Failed
@ ParseError
@ StaleHandle
@ NoOp
@ Applied
Handle plus owner-lifetime epoch for a non-ECS registry object.
Definition RuntimeRegistry.h:91