Core symbolic-planning types and protocols shared by DYNOS packages
Project description
dynos-core
Pure-Python types for describing a planning domain. Predicates, transitions,
object types, and the world states they describe. dynos-core is the data
layer that every other DYNOS package shares.
This contains no planner, no executor, and no network code, it's just classes that define a domain. The DYNOS backend reads these structures to plan/execute/monitor/verify, clients read them to talk about goals, both share the same in-memory representation.
Most users do not install dynos-core directly, You get it transitively when
you pip install dynos-client (or any package above it). Install it on its own
if you are authoring a new domain (or extending a new one, like when making
custom actions) and want the lowest-level types without pulling in the HTTP
client.
Install
pip install dynos-core
Single dependency: varname. This is used to infer the names of objects being
created.
Concepts
DYNOS describes the world as a set of named facts (fluents) about typed objects. A goal is a state of those facts; a plan is a sequence of transitions that move from one state to another. Actions are specific code implementations of transitions.
Fluents and ground atoms
A fluent is a named, parameterised proposition. make_new_fluent creates one;
calling it on specific objects creates a GroundAtom. This is a fluent
applied to particular arguments.
from dynos_core import make_new_fluent, ObjectType, World
class Robot(ObjectType): ...
class Room(ObjectType): ...
at = make_new_fluent("at", robot=Robot, room=Room)
r = Robot("r1")
kitchen = Room("kitchen")
current = World({at(r, kitchen)})
print(at(r, kitchen) in current) # True
A World is a frozenset of GroundAtom describing what is currently true. In
the current implementation, anything not in the set is false (closed-world
assumption), but more principled approaches are being designed.
Object types and value fields
An ObjectType is a category of thing in the domain. For example, Robot, Room,
Zone, Coordinate. ValueField descriptors attach typed numeric/string fields:
from dynos_core import ObjectType, ValueField
class Zone(ObjectType):
altitude = ValueField(float)
vertices = ValueField(list)
The class is pure Python; instances live in a backend-managed numeric database
at runtime, accessible through the same descriptor syntax
(zone.altitude.get() / .set(70.0)). dynos-core only declares the schema.
Transitions
A Transition is an action schema: name, parameter type, preconditions,
effects. It says nothing about how the action runs.
from dynos_core import Transition, TransitionParams
class GotoParams(TransitionParams):
start: Room
end: Room
goto = Transition("goto", params_type=GotoParams).define(
preconditions=[at(GotoParams.start)],
adds=[at(GotoParams.end)],
removes=[at(GotoParams.start)],
)
The define() call stores the symbolic spec on the transition. The dynos
backend extends Transition with cost callbacks, applicability checks, and
execution hooks; this package's Transition is just data.
Extensions
extend_object_type and extend_transition_params add fields after the class
is declared. This supports the publish-stub pattern: a domain package
declares a small public schema; the backend extends it with private fields at
import time. The public release strips the extension calls so users see only
the public surface.
from dynos_core.extension import extend_object_type
extend_object_type(Zone, depth=ValueField(float)) # backend-only addition
See extension.py for the full rules (additive only, must run before any plan construction, etc.).
What dynos-core does NOT do
- No planner. The actual planning lives in the
dynosbackend (not on PyPI). - No
@Action/@Belief/@Scriptdecorators. Those run code; this package is data only. They live in the backend (and you import them fromdynos.databases.typed_actionwhen building a backend; or via the conditional-import pattern documented indynos-client's README when authoring client-only code). - No network or robot connectivity. That's
dynos-client.
Public API
| Symbol | Purpose |
|---|---|
GroundAtom |
A fluent applied to specific objects; the leaf of the symbolic state tree. |
World |
Frozenset of GroundAtom; one snapshot of the symbolic state. |
FluentBase |
Base class for fluents (rarely instantiated directly). |
make_new_fluent(name, **types) |
Factory: returns a callable that produces GroundAtom. |
make_new_object(type, name, **fields) |
Factory: registers an ObjectType instance with the numeric database. |
Transition |
Action schema (preconditions, effects, parameter type). |
TransitionParams |
Base class for typed parameter dataclasses. |
PrimitiveAction |
Frozen (action_name, parameters) pair — what flows over the wire. |
ObjectType |
Base class for typed domain entities. |
SymbolicObject |
An instance of an ObjectType. |
ValueField |
Descriptor for typed numeric/string attributes on ObjectType. |
Next
To talk to a running DYNOS backend, install dynos-client. To get the Sentry
survey vocabulary, install dynos-sentry-domain. The walkthrough at
user_guide.md ties them together end-to-end.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dynos_core-0.1.2.tar.gz.
File metadata
- Download URL: dynos_core-0.1.2.tar.gz
- Upload date:
- Size: 13.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.8.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dcc9d75ede7f9663961a35d7b615db6926d9a844b918fe8b553d5b385d8f826a
|
|
| MD5 |
8f4d6caaa988cde2c87a775ac9d14ea8
|
|
| BLAKE2b-256 |
67cc914f63976cc957e0cf65caede441ffe44bcee00a6ee6abd1d8e38f0fe3f3
|
File details
Details for the file dynos_core-0.1.2-py3-none-any.whl.
File metadata
- Download URL: dynos_core-0.1.2-py3-none-any.whl
- Upload date:
- Size: 13.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.8.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92129aefe93206b5008f6c98280b9cfc3aed26deba23299f3478bec52eec694e
|
|
| MD5 |
f75f50a49d00fd05c5c70f3a3ed9850e
|
|
| BLAKE2b-256 |
e2d98522b88fd719134bc5a228ef618cbf7f02dd2bf9d7b7d229e4e2ea1a861f
|