Python API Reference#
The Python API provides a ctypes-based interface to the ovstage runtime data plane.
ovstage#
Version and Constants#
- __version__ = '0.1.1'#
str(object=’’) -> str str(bytes_or_buffer[, encoding[, errors]]) -> str
Create a new string object from the given object. If encoding or errors is specified, then the object must expose a data buffer that will be decoded using the given encoding and error handler. Otherwise, returns the result of object.__str__() (if defined) or repr(object). encoding defaults to sys.getdefaultencoding(). errors defaults to ‘strict’.
- library_version()#
Return the loaded library’s
(major, minor, patch)version.Forces the lazy load so a standalone
ovstage.library_version()returns a real version (or raises if the library can’t load) instead ofNonebefore first use.- Return type:
tuple | None
- TIMEOUT_INFINITE = 18446744073709551615#
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- OVSTAGE_TIMEOUT_INFINITE = 18446744073709551615#
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- OVX_API_SUCCESS = 0#
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- OVX_API_ERROR = 1#
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
Stage and Path Dictionary#
- class Stage#
An ovstage instance: the unit of stage-data read/write/query.
- Parameters:
name – Optional instance name used for diagnostics.
config – Optional process configuration. Its runtime-default hierarchy model is captured by this instance and controls automatic transform updates.
- __init__(name=None, config=None)#
- Parameters:
name (str | None)
config (StageConfig | None)
- advance_write_floor(ordinal, scope=Scope.ALL, attributes=None)#
Advance the write floor;
scopeselects the affected attributes (seeScope).Advances clamp to the current value, so a non-monotonic ordinal is a no-op rather than an error.
- clone(source_path, target_paths, ordinal)#
Clone the subtree under
source_pathto each path intarget_paths(blocking).Data-plane peer of ovrtx’s
clone_usd(the_usdpostfix is dropped). Likewrite_attribute(), clone is ordinal-keyed:ordinalmust be greater than the write floor or the op fails with a write-floor violation. The source must exist; each target must not already exist.
- clone_async(source_path, target_paths, ordinal)#
Enqueue a subtree clone of
source_pathtotarget_pathsatordinal(asynchronous).
- compute_hierarchy(
- input_ordinal,
- output_ordinal,
- model=HierarchyComputationModel.CPU_INCREMENTAL,
Compute hierarchy-derived data for
input_ordinal(blocking).
- compute_hierarchy_async(
- input_ordinal,
- output_ordinal,
- model=HierarchyComputationModel.CPU_INCREMENTAL,
Enqueue hierarchy-derived data computation for
input_ordinal.
- delete_attributes(query, attributes, ordinal)#
Enqueue a delete. Empty
attributesdeletes entire prims.
- destroy()#
- Return type:
None
- fetch_hierarchy_result(hierarchy)#
Fetch, copy, and release a completed hierarchy lookup result payload.
- Return type:
- fetch_map_next(mapping, timeout=18446744073709551615)#
- fetch_ordinal(ordinal_query, timeout=18446744073709551615)#
- fetch_query_result(query, timeout=18446744073709551615)#
Fetch (and release) a query result, copying out its scalar summary.
- Parameters:
timeout (int)
- Return type:
- fetch_read_next(read, timeout=18446744073709551615)#
Fetch the next read group, or
Noneat end of iteration.
- get_attribute_write_floor(attribute=None)#
Query a per-attribute write floor, or the global write floor if
attributeis None.- Parameters:
- Return type:
- get_hierarchy(path_list, ordinal, relation)#
Return parent/children/siblings for an ordered path list (blocking).
- Parameters:
- Return type:
- get_hierarchy_async(path_list, ordinal, relation)#
Enqueue a parent/children/siblings lookup for an ordered path list.
- get_hierarchy_computation_models()#
Return the hierarchy computation models supported by this backend.
- Return type:
- get_oldest_preserved_ordinal()#
- Return type:
- get_path_dictionary()#
Return the instance’s shared path-dictionary bundle (
{vtable, context}).The dictionary is owned by ovstage and stays valid while at least one instance is alive; callers must not tear it down. Used by
ovstage.PathDictionary.- Return type:
LP_path_dictionary_instance_t
- map_attribute(
- query,
- attribute,
- ordinal,
- *,
- prim_mode=PrimMode.UPSERT,
- dtype=None,
- semantic=0,
- element_sizes=None,
Reserve a zero-copy map session for an attribute.
dtypeis the element storage type used only when the column does not yet exist (the full per-element tuple width must be encoded indtype.lanes); it is ignored when the attribute already has a type. Fixed-size map groups expose the same lane-canonical layout as raw reads:ndim=1,shape=(data_rows,), and the complete tuple width indtype.lanes. Use the group’sdata_row_index(local)to resolve a logical element through any data index map. Map groups do not reconstruct a convenience write shape such as(N, 4, 4).semanticis theAttributeSemantic(or rawovstage_attribute_semantic_tvalue) carried on the map. Geometric semantics record a geometric role on the column when the map creates it; ID semantics select the corresponding ID storage type and require pre-interned ids in the map buffer (TOKEN_ID/RELATIONSHIP_PATH_IDusedtype = (kDLUInt, 64, 1),CONNECTION_PATH_IDusesdtype = (kDLUInt, 64, 2)).element_sizesgives per-prim element counts for ragged columns.
- query(filter=None, attrs=None)#
Enqueue a filter query.
attrsscopes attribute discovery (tokens).
- query_from_path_list(path_list)#
Create a query handle from an interned prim path list (synchronous).
- read_attributes(query, attrs, ordinal_range)#
- Parameters:
ordinal_range (OrdinalRange)
- Return type:
- release_op(op_id)#
Release op tracking state; returns the raw
ovstage_api_status_t.
- unmap_attribute(mapping, cuda_event=None, cuda_stream=None)#
- unmap_group(mapping, group, cuda_event=None, cuda_stream=None)#
- wait_op(op_id, timeout=18446744073709551615)#
Low-level wait: returns
(code, error_op_ids, lowest_pending_op_id).Does not release the op. Lets callers inspect the wait result struct directly (e.g. timeout’s
lowest_pending_op_idor a failed producer’serror_op_ids).
- wait_op_raw(op_id, timeout=18446744073709551615)#
Wait without raising or releasing; returns the raw
ovstage_api_status_t.
- write_attribute(
- query,
- attribute,
- ordinal,
- tensors,
- *,
- is_array,
- prim_mode=PrimMode.UPSERT,
- semantic=0,
- index_map=None,
- mask=None,
- count=None,
- cuda_event=None,
- cuda_stream=None,
Enqueue a copy-in write.
is_arrayexplicitly declares the logical attribute kind and is never inferred from tensor count, tensor shape, payload width, attribute name, semantic, or existing storage.tensorsis a numpy array /DLTensor, or a list thereof (one per source row for array attributes). Caller-owned tensors are kept alive on the returnedOperationuntilwait().Fixed-size writes (
is_array=False) are normalized to the raw API’s lane-canonical layout: reads and maps returnndim=1, a leading dimension equal to the transported data-row count, and the complete per-row tuple width indtype.lanes. Logical prims select those rows directly or through the group’s data index map. Compact convenience inputs such as a point array shaped(N, 3)or a matrix array shaped(N, 4, 4)are accepted, but their trailing shape is folded and not preserved. Without an index map, the leading dimension must equal the logical element count; a flat(N * L,)array is not inferred asNrows of widthL. This normalization does not describe array/ragged attributes.Array element types are never inferred from tensor shape. If a non-NumPy DLPack producer exposes a vector element as a trailing component axis (for example Warp
vec3fas(N, 3),lanes=1), first callmake_dltensor()with the explicit lane dtype. That helper permits only a validated, compact trailing-axis fold, sopoint3f[]can remain zero-copy without ambiguously reinterpreting scalar arrays.Reserved metadata uses the same contract:
usd-prim-typerequiresis_array=Falseandusd-schemasrequiresis_array=True. Neither attribute is implicitly broadcast; useindex_mapwhen target rows intentionally share source data.countis the number of logical elements the write addresses — the leadingcountprims of the query, in query order. With neitherindex_mapnormaskit defaults to the query’s prim count. When given it must be positive:0is the C contract’s spelling of “the whole query”, so passing it — including aslen()of an empty selection — raisesValueErrorrather than writing nothing.index_mapandmaskare mutually exclusive and both refine that logical element axis:index_map[i]is the source row logical elementireads from, not the prim being written. Use it to gather, reorder, or broadcast rows (index_map=[0, 0]writes one source row to two prims). Every entry must be less than the transported row count, which for a fixed-size write isshape[0]. The map holds one entry per logical element, socountdefaults tolen(index_map)and may not exceed it — to address more of the query, lengthen the map rather than raisingcount.maskis a bitmask over the same logical element axis selecting which prims are written; unselected prims are left untouched. It has no defaultcount: supply one, along with enough 64-bit words to cover it (ceil(count / 64)).
To write a subset of a query’s prims, use
mask;index_mapselects source data, not targets.semanticis theAttributeSemantic(or rawovstage_attribute_semantic_tvalue) carried on the write. Geometric semantics (POINT/VECTOR/NORMAL/COLOR/QUATERNION/MATRIX/TEXTURE_COORDINATE) record a geometric role on the column; ID semantics select the corresponding ID storage type and require pre-interned id payloads (TOKEN_ID/RELATIONSHIP_PATH_IDusedtype = (kDLUInt, 64, 1),CONNECTION_PATH_IDusesdtype = (kDLUInt, 64, 2)).0(NONE) writes the payload without stamping a role / base type on the column.
- write_attributes(
- query,
- writes,
- ordinal,
- *,
- prim_mode=PrimMode.UPSERT,
Enqueue one copy-in operation for multiple attribute columns.
Every write is validated before the operation is queued. The returned operation owns all ctypes/tensor keepalives until
wait(). Each fixed-size entry follows the same lane-canonical normalization aswrite_attribute().
- class StageConfig#
Process configuration applied when creating a
Stage.The configuration is process-scoped. Configured stages may coexist when their concrete settings match; creating a stage with a conflicting setting while another stage is live raises
OvstageError.- __init__(runtime_default_hierarchy_computation_model=None)#
- Parameters:
runtime_default_hierarchy_computation_model (HierarchyComputationModel | None)
- Return type:
None
- runtime_default_hierarchy_computation_model: HierarchyComputationModel | None = None#
- class PathDictionary#
A shared interning dictionary for tokens, prim paths, and path lists.
The dictionary is owned by an ovstage instance. Pass an existing
Stageto share its dictionary, or omitstageto manage a private backing instance whose lifetime is tied to this object.- __init__(stage=None)#
- add_path_list_reference(path_list)#
Increment a path list’s refcount (pair with
destroy_path_list()).- Parameters:
path_list (int)
- Return type:
None
- destroy()#
- Return type:
None
Queries, Reads, and Maps#
- class Query#
-
- result(timeout=18446744073709551615)#
Fetch (and release) the query result.
- Parameters:
timeout (int) – max nanoseconds to wait for the result;
TIMEOUT_INFINITE(default) blocks,0polls.- Raises:
TypeError – if
timeoutis not an integer (e.g.None).ValueError – if
timeoutis negative or does not fit in uint64.
- Return type:
- class OrdinalQuery#
- fetch(timeout=18446744073709551615)#
Fetch the queried ordinal value.
- Parameters:
timeout (int) – max nanoseconds to wait for the value;
TIMEOUT_INFINITE(default) blocks,0polls.- Raises:
TypeError – if
timeoutis not an integer (e.g.None).ValueError – if
timeoutis negative or does not fit in uint64.
- Return type:
- class Read#
- fetch_next(timeout=18446744073709551615)#
Fetch the next read group, or
Noneat end of iteration.- Parameters:
timeout (int) – max nanoseconds to wait for the next group;
TIMEOUT_INFINITE(default) blocks,0polls.- Raises:
TypeError – if
timeoutis not an integer (e.g.None).ValueError – if
timeoutis negative or does not fit in uint64.OvstageError – with
ErrorCode.TIMEOUTif no group is ready in time.
- Return type:
ReadGroup | None
- class Map#
A reserved zero-copy map (write) session.
Reserve via
Stage.map_attribute(), iterate writable groups withgroups()/fetch_next(), fill each group, and commit it withunmap_group(). Finalize withunmap(), which commits any remaining groups and releases the handle.An outstanding map pins session state (a reserved layout) and blocks overlapping writes, maps, and deletes on the same prims until it is unmapped. To guarantee release even when an error interrupts the fill loop, use the session as a context manager:
with stage.map_attribute(query, attr, ordinal=o) as m: m.wait() for mg in m.groups(): fill(mg) m.unmap_group(mg)
Leaving the
withblock — normally or via an exception — callsunmap(). The C API has no cancel: unmap always commits whatever the map buffers currently hold, so an exception mid-fill still persists the partially filled storage (there is no rollback). If a session is dropped without ever unmapping,__del__()issues a best-effort unmap and emits aResourceWarning; rely on the context manager (or an explicitunmap()) rather than the finalizer.- fetch_next(timeout=18446744073709551615)#
Fetch the next writable map group, or
Noneat end of iteration.- Parameters:
timeout (int) – max nanoseconds to wait for the next group;
TIMEOUT_INFINITE(default) blocks,0polls.- Raises:
TypeError – if
timeoutis not an integer (e.g.None).ValueError – if
timeoutis negative or does not fit in uint64.OvstageError – with
ErrorCode.TIMEOUTif no group is ready in time.
- Return type:
MapGroup | None
- unmap(cuda_event=None, cuda_stream=None)#
Commit remaining groups and release the map handle (see class docstring).
- class Operation#
A handle to an enqueued (asynchronous) ovstage operation.
statusis the enqueue status (OVSTAGE_OK= accepted);op_idis the per-op identifier. Callwait()to block until the op (and its ordinal-keyed dependencies) completes, raisingOvstageErrorif it failed.- wait(timeout=18446744073709551615)#
Wait for completion and release the op. Raises on failure.
Mirrors the C++
waitOkhelper: if the enqueue was rejected, or the op or its dependencies failed, raisesOvstageError.- Parameters:
timeout (int) – max nanoseconds to wait;
TIMEOUT_INFINITE(default) blocks,0polls.- Raises:
TypeError – if
timeoutis not an integer (e.g.None).ValueError – if
timeoutis negative or does not fit in uint64.
- Return type:
None
Instancing Queries#
- get_prototype_roots(stage)#
Return every scene-graph-instancing prototype-root path in
stage.
- get_prototype_root(stage, instance_root)#
Return the prototype-root path referenced by
instance_root.- Raises:
OvstageError – If
instance_rootis not an instance root or the native query otherwise fails.- Parameters:
instance_root (str)
- Return type:
Data and Result Types#
- class WriteDesc#
Python-facing form of one native
ovstage_attribute_write_t.Each instance supplies one named attribute write to
Stage.write_attributes().is_arrayis required and explicitly declares the logical attribute kind; it is never inferred fromtensors.tensorsaccepts the same numpy/DLTensor forms asStage.write_attribute(). Sparsity and CUDA synchronization are write-local, as issemantic; the ordinal and prim mode are shared by the batch. Fixed-size convenience shapes are normalized to one source-data-row dimension with the tuple width indtype.lanes; their trailing dimensions are not preserved.- __init__(
- attribute,
- tensors,
- is_array,
- index_map=None,
- mask=None,
- count=None,
- cuda_event=None,
- cuda_stream=None,
- semantic=AttributeSemantic.NONE,
- semantic: AttributeSemantic = 0#
- class OrdinalRange#
Ordinal range for reads.
OrdinalRange.latest(N)→ latest snapshot request; recorded columns return current committed payload rather than historical payload <= N.OrdinalRange.between(start, end)→ select the keys that changed in inclusive [start, end]. An unsealed selected change raisesWRITE_FLOOR_VIOLATION. If a selected key also changed afterend, latest-only storage raisesOUT_OF_RANGEbecause the payload for that fixed range is no longer available.
- __init__(end_ordinal, start_ordinal=None)#
- classmethod between(start_ordinal, end_ordinal)#
- Parameters:
- Return type:
- to_c()#
- Return type:
ovstage_ordinal_range_t
- class Predicate#
A single filter predicate.
attributemay be an int token or a string.- __init__(attribute, op, values=<factory>)#
- class Filter#
Conjunction (AND) of predicates.
Nonefilter = match all prims.
- class ReadGroup#
A read result group (
ovstage_read_group_t).Valid until released via
Stage.release_group(). Exposes the attribute token, ordinal, delete flag, prim grouping, and tensor data.
- class MapGroup#
A writable map group (
ovstage_map_group_t).Fill
array(i)then commit viaStage.unmap_group()(or finalize the whole session withStage.unmap_attribute()).- dlpack(index, *, readonly=False)#
Writable DLPack view of tensor
index(a map group is writable).Fill it in place —
wp.from_dlpack(group.dlpack(i))for a GPU kernel, ornp.from_dlpack(group.dlpack(i))[:] = ...on CPU (numpy >= 2.1 honors the writable flag) — then commit viaStage.unmap_group()/Stage.unmap_attribute().- Parameters:
- Return type:
- class AttributeMeta#
Read-only view of
ovstage_attribute_meta_t.- attribute_write_floor_ordinal#
- layout_generation#
- __init__(raw)#
- Parameters:
raw (ovstage_attribute_meta_t)
- class QueryResult#
Snapshot of a fetched query result (copied out before release).
- __init__(attributes, total_prim_count, all_handle)#
- class HierarchyItem#
Per-input hierarchy lookup result.
- class HierarchyResult#
Copied hierarchy lookup result.
itemspreserves the input path-list order. Each item carries its own status so a missing input prim can be reported without failing the whole batch.- __init__(ordinal, items)#
- Parameters:
ordinal (int)
items (List[HierarchyItem])
- Return type:
None
- items: List[HierarchyItem]#
Enums#
- class ErrorCode#
An enumeration.
- __new__(value)#
- OK = 0#
- INVALID_ARGUMENT = 1#
- INVALID_HANDLE = 2#
- NOT_FOUND = 3#
- PRIM_NOT_FOUND = 4#
- WRITE_FLOOR_VIOLATION = 5#
- NOT_SUPPORTED = 6#
- QUEUE_FULL = 7#
- END_OF_ITERATION = 8#
- OUT_OF_MEMORY = 9#
- LAYOUT_CHANGED = 10#
- TIMEOUT = 11#
- OP_FAILED = 12#
- OUT_OF_RANGE = 13#
- INTERNAL = 99#
- class FilterOp#
An enumeration.
- __new__(value)#
- HAS = 0#
- IN = 1#
- CONTAINS = 2#
- PREFIX = 3#
- LT = 4#
- LE = 5#
- GT = 6#
- GE = 7#
- class AttributeSemantic#
Authored USD interpretation of a column’s bytes (
ovstage_attribute_semantic_t).Geometric semantics (POINT/VECTOR/NORMAL/COLOR/QUATERNION/MATRIX/ TEXTURE_COORDINATE) record a geometric role on the column; storage stays in the requested numeric
dtype.ID semantics select the corresponding ID storage type and require pre-interned id payloads (producers must intern via the path dictionary / token dictionary before writing – ovstage does not stringify or resolve):
TOKEN_ID→dtype = (kDLUInt, 64, 1)carrying one 64-bit token id per row.RELATIONSHIP_PATH_ID→dtype = (kDLUInt, 64, 1)carrying one 64-bit path id per row.CONNECTION_PATH_ID→dtype = (kDLUInt, 64, 2)carrying one(path_id, token_id)pair per row (one 16-byte element per row).
Byte-string semantics (
ASSET_STRING,PATH_EXPRESSION_STRING) keep ragged(kDLUInt, 8, 1)byte-row storage with NUL-separated authored sub-values.STRINGcarries a plain USDstringas raw UTF-8 bytes in a ragged(kDLUInt, 8, 1)byte array (is_array = True), not a token id. It records the USD-string role so the column uses the canonical USD-string representation.The semantic round-trips through the attribute column: writes record it at creation, reads recover it by decoding the column.
- __new__(value)#
- NONE = 0#
- ASSET_STRING = 1#
- TOKEN_ID = 2#
- PATH_EXPRESSION_STRING = 3#
- RELATIONSHIP_PATH_ID = 4#
- POINT = 5#
- VECTOR = 6#
- NORMAL = 7#
- COLOR = 8#
- QUATERNION = 9#
- MATRIX = 10#
- TEXTURE_COORDINATE = 11#
- CONNECTION_PATH_ID = 12#
- STRING = 13#
- class Scope#
Write-floor advance scope (see
Stage.advance_write_floor()).ALL→ advance the global write floor and every known attribute.INCLUDE→ advance only the listed attributes.EXCLUDE→ advance every known attribute except the listed ones (an empty list behaves likeALL).
- __new__(value)#
- ALL = 0#
- INCLUDE = 1#
- EXCLUDE = 2#
Errors#
- class OvstageError#
Raised when an ovstage call or enqueued op fails.
codeis the rawovstage_api_status_t;messageis the human-readable detail fromovstage_get_last_op_error/ovstage_get_last_errorwhen available.
Logging#
- set_log_callback(callback, severity=None, channel_filter=None)#
Install (or clear) a process-global log callback.
Routes ovstage’s log messages — and messages from its USD support layer — to
callback(severity, timestamp, message), whereseverityis aLogSeverity,timestampis wall-clock seconds since the epoch, andmessageis an ownedstr(a decoded copy that remains valid after the call returns).Delivery is asynchronous on a dedicated dispatcher thread (created lazily on the first callback), so the callback never runs on the logging hot path and invocations are serialized. Use
flush_log()to force pending messages through before a checkpoint.Requires the runtime to be bootstrapped — hold a live
Stagewhen calling this.Note
An exception raised by
callbackhas its traceback printed to stderr (so it is visible for debugging) and is then suppressed — it never unwinds into the C dispatcher. Do not emit ovstage/USD log messages from insidecallback: they re-enter the dispatcher and can feed back indefinitely.- Parameters:
callback –
f(severity, timestamp, message)callable, orNoneto flush pending messages and disable delivery.severity – default
LogSeveritythreshold for channels not matched bychannel_filter; messages below it are dropped. Defaults toWARNING.channel_filter (str | None) – optional comma-separated
<channel>=<level>list (e.g."omni.ovstage=verbose");Noneappliesseverityuniformly. Levels: verbose|debug|info|warn|warning|error|fatal|none.
- Raises:
OvstageError –
INVALID_ARGUMENTif the filter fails to parse, orOP_FAILEDif the runtime is not bootstrapped.- Return type:
None
- flush_log(timeout=18446744073709551615)#
Block until log messages emitted before this call have been delivered.
Point-in-time barrier: messages produced concurrently with or after the call are not guaranteed to be included. Returns immediately if no callback is installed (nothing is buffered).
Warning
With the default
OVSTAGE_TIMEOUT_INFINITEthis blocks until the dispatcher drains; a stuck callback makes it hang. Pass a finitetimeoutif the callback might block.- Parameters:
timeout (int) – max nanoseconds to wait;
OVSTAGE_TIMEOUT_INFINITEblocks,0polls.- Returns:
Trueif drained (or no callback installed);Falseif not drained withintimeout.- Raises:
TypeError – if
timeoutis not an integer (e.g.None).ValueError – if
timeoutis negative or does not fit in uint64.OvstageError – on any error other than a timeout.
- Return type:
- class LogSeverity#
Log severity levels (mirrors
ovstage_log_severity_t).Values follow the underlying log-level ordering.
NONEis a threshold sentinel: as a filter level it disables all logging and is never delivered to a callback.- __new__(value)#
- VERBOSE = -2#
- INFO = -1#
- WARNING = 0#
- ERROR = 1#
- NONE = 3#
DLPack Tensor Interchange#
- class DLTensor#
Plain C tensor object; does not manage memory.
- byte_offset#
Structure/Union member
- data#
Structure/Union member
- device#
Structure/Union member
- dtype#
Structure/Union member
- classmethod from_dlpack(obj, stream=None)#
Build a
DLTensorviewing any object implementing the DLPack protocol.Accepts numpy / warp / torch / cupy / jax tensors (anything exposing
__dlpack__) resident on CPU or CUDA and aliases their memory zero-copy, so a GPU producer’s device buffer can be handed straight to ovstage without a host round-trip. Shape and strides are deep-copied, while the consumed producer descriptor/deleter and source object are retained on the returned tensor so the aliased buffer remains valid until the returned tensor is destroyed. The caller must keep the returned tensor alive until the consuming op completes (Stage.write_attributedoes this via theOperationkeepalive).streamis forwarded to a CUDA producer so it can synchronize the exporting stream against the consumer; it is ignored for CPU tensors and for producers that do not advertise__dlpack_device__.
- ndim#
Structure/Union member
- shape#
Structure/Union member
- strides#
Structure/Union member
- class DLDataType#
Descriptor of the element data type of a DLTensor.
- bits#
Structure/Union member
- code#
Structure/Union member
- lanes#
Structure/Union member
- class DLDevice#
Device where DLTensor memory is allocated.
- device_id#
Structure/Union member
- device_type#
Structure/Union member
- class DLDeviceType#
The enum encoding the type of device where DLTensor memory lives.
- kDLCPU = 1#
- kDLCUDA = 2#
- kDLCUDAHost = 3#
- kDLCUDAManaged = 13#
- kDLExtDev = 12#
- kDLHexagon = 16#
- kDLMAIA = 17#
- kDLMetal = 8#
- kDLOneAPI = 14#
- kDLOpenCL = 4#
- kDLROCM = 10#
- kDLROCMHost = 11#
- kDLTrn = 18#
- kDLVPI = 9#
- kDLVulkan = 7#
- kDLWebGPU = 15#
- class DLDataTypeCode#
An integer encoding the category of a DLTensor element’s data type.
- kDLBfloat = 4#
- kDLBool = 6#
- kDLComplex = 5#
- kDLFloat = 2#
- kDLInt = 0#
- kDLOpaqueHandle = 3#
- kDLUInt = 1#
- class ManagedDLTensor#
A DLPack-exportable view of an ovstage tensor.
Obtained from
ovstage.ReadGroup.dlpack()/ovstage.MapGroup.dlpack(). Pass the instance tonp.from_dlpack()/wp.from_dlpack()/torch.from_dlpack()for zero-copy access (CPU or CUDA), or callnumpy()for a CPU numpy view.The tensor data is borrowed from ovstage and valid only until the owning read/map group is released — copy it if it must outlive the read. A read group is exported
readonly=True; a (writable) map groupreadonly=False. DLPack consumers see one trailing dimension added for a multi-lane dtype; for example, a raw fixed matrixshape=(N,),lanes=16is exported as(N, 16)rather than as any convenience input shape.ManagedDLTensor.shapeand its representation report the raw, unexpanded(N,)shape; the trailing lane axis materializes only in a DLPack consumer such asnp.from_dlpack().manager_ctxis retained by this object and by any capsule it exports, but a capsule is destroyed as soon as a consumer takes ownership of it — which is before that consumer releases the tensor. The DLPack deleter runs no Python (see_C_FREE_DELETER), so it cannot release a Python reference at that later point. Ifmanager_ctxis the sole owner of the backing memory, keep thisManagedDLTensoralive for as long as the consumer’s view is used:managed = ManagedDLTensor(tensor, manager_ctx=owner) view = np.from_dlpack(managed) # `managed` must outlive `view`
This does not invalidate
np.from_dlpack(group.dlpack(0))for ovstage read/map groups: theirmanager_ctxdoes not own the backing allocation, and the view remains valid while the owning read/map operation is alive.- __dlpack__(
- *,
- stream=None,
- max_version=None,
- dl_device=None,
- copy=None,
Return a DLPack capsule.
streamis accepted but ignored — GPU synchronization is the caller’s responsibility (see the dlpack skill).
- __init__(
- dl_tensor,
- manager_ctx,
- deleter_callback=None,
- readonly=True,
- property dtype: DLDataType#
- numpy()#
Zero-copy numpy view (CPU tensors only).
- make_dltensor(
- array,
- *,
- dtype=None,
- shape=None,
- ndim=None,
- strides=None,
- device_type=1,
- device_id=0,
Build a
DLTensorviewing the memory of an array.A numpy array (CPU) is wrapped directly; the array, the shape storage, and the tensor are linked by reference so the C-visible pointers stay valid for as long as the returned tensor is alive.
shape/ndim/dtype/stridesmay be overridden to describe vector (multi-lane) layouts a plain numpy dtype cannot express, matching an explicitly authored multi-laneDLTensordescriptor. A fixed-size ovstage write may also accept the numpy shape directly as a convenience layout (for example,(N, 4, 4)withlanes=1); subsequent raw reads/maps normalize it toshape=(N,),lanes=16.Any non-numpy object exposing the DLPack protocol (warp / torch / cupy / jax, CPU or CUDA) is ingested zero-copy via
DLTensor.from_dlpack()instead, so a GPU device buffer can be written without a host round-trip. Such a producer may be re-described with a vectordtypeonly through a validated fold of complete trailing dimensions intodtype.lanes. The source must be compact row-major with byte-aligned elements, its base type and positive bit width are unchanged, and any explicitshape/ndim/stridesmust match the folded compact view. For example, a Warpvec3fexport shaped(N, 3)can be viewed asshape=(N,)withlanes=3without copying its CPU or CUDA allocation. A lane fold that consumes every source axis is normalized toshape=(1,),ndim=1.The caller owns the data: it must keep the returned tensor (and thus the backing array) alive until the consuming op completes.
- dltensor_to_numpy(tensor)#
Return a zero-copy numpy view of a CPU
DLTensor.The view is flat: its length is
prod(shape) * dtype.lanesbase elements, matching the raw-buffer indexing the C++ tests perform. Vector lanes are folded into the element count rather than the dtype. The data is owned by ovstage and only valid until the owning group/result is released.An invalid dtype (
lanes == 0) is rejected withValueError. A tensor wrapping a numpy array (built bymake_dltensor()) is also checked against the array’s real size, so the returned view can never extend past that backing buffer; tensors from other producers carry no buffer size to check against and are trusted to describe themselves.- Parameters:
tensor (DLTensor)
- numpy_to_dldatatype(np_dtype, lanes=1)#
Build a
DLDataTypefrom a numpy dtype (with optional vector lanes).lanesmust be an integer in[1, 65535]: the value lands in the DLPackuint16lane field, so anything outside that range raisesValueError(TypeErrorfor non-integers) instead of silently wrapping to a bogus lane count (e.g.-1becoming65535).- Parameters:
lanes (int)
- Return type:
ovstage.population#
USD population: composes USD content into the runtime stage (see Population (USD → ovstage)).
ovstage population: populate an ovstage instance from USD.
Thin wrappers over the ovstage_population_* C entry points (the USD ->
ovstage bridge in ovstage_population.h). The application owns the ordinal
lifecycle and passes the current ordinal to the calls that carry one.
The surface follows the ovrtx Python conventions: every mutating entry point
comes as a blocking foo(...) that returns once the work has completed, plus
an asynchronous foo_async(...) that returns an Operation to wait on
explicitly. Per-stage population state is created lazily on first use and
released automatically when the stage is destroyed (no manual detach).
- class Operation#
A handle to an enqueued (asynchronous) population operation.
Mirrors the ovrtx
Operationergonomics:wait()blocks until the op (and the ordinal-keyed ops before it) completes, returning the op’s payload on success — a USD reference handle for an add-reference op,Truefor a void op — orNoneon timeout, and raisingOvstageErroron failure.statusis the enqueue status (OVSTAGE_OK= accepted).- __init__(
- stage,
- status,
- op_id,
- *,
- value=True,
- keepalive=None,
- name='',
- wait(timeout=18446744073709551615)#
Wait for completion. Returns the payload,
Noneon timeout; raises on failure.- Parameters:
timeout (int) – max nanoseconds to wait;
OVSTAGE_TIMEOUT_INFINITE(default) blocks,0polls.- Raises:
TypeError – if
timeoutis not an integer (e.g.None).ValueError – if
timeoutis negative or does not fit in uint64.
- open_usd(
- stage,
- path,
- ordinal=1,
- time_code=nan,
- domains=<PopulationDomain.RENDERING: 1>,
Open a USD file and populate the stage (blocking).
time_codeis in seconds (converted via the stage’stimeCodesPerSecond, like the Ctimeparameter);math.nan(the default) evaluates at USD’s Default time code. Wraps the C entry pointovstage_population_open_usd_from_file.
- open_usd_async(
- stage,
- path,
- ordinal=1,
- time_code=nan,
- domains=<PopulationDomain.RENDERING: 1>,
Open a USD file and populate the stage (asynchronous). See
open_usd().
- open_usd_from_string(
- stage,
- usda,
- ordinal=1,
- time_code=nan,
- domains=<PopulationDomain.RENDERING: 1>,
Open inline USDA content and populate the stage (blocking).
time_codefollows the same contract asopen_usd(): seconds, withmath.nan(the default) evaluating at USD’s Default time code.
- open_usd_from_string_async(
- stage,
- usda,
- ordinal=1,
- time_code=nan,
- domains=<PopulationDomain.RENDERING: 1>,
Open inline USDA content and populate the stage (asynchronous). See
open_usd_from_string().
- add_usd_reference(stage, ref_file_path, target_path)#
Add a USD file as a reference at
target_path(blocking). Returns the handle.The merge is additive in every case;
target_pathselects its shape: the root"/"merges the layer’s top-level prims into the stage, an existing prim path adds the reference onto that prim (leaving its prior content), and a not-yet-existing prim path defines a new prim there. Callapply_usd_changes()afterwards to reflect it into the stage.
- add_usd_reference_async(stage, ref_file_path, target_path)#
Add a USD file as a reference at
target_path(asynchronous).
- add_usd_reference_from_string(stage, ref_str, target_path)#
Add inline USDA content as a reference at
target_path(blocking). Returns the handle.Same additive
target_pathsemantics asadd_usd_reference()(root"/"merge, overlay onto an existing prim, or a new prim), but the layer is provided as inline USDA text instead of a file.
- add_usd_reference_from_string_async(stage, ref_str, target_path)#
Add inline USDA content as a reference at
target_path(asynchronous).
- remove_usd(stage, handle)#
Remove a USD reference previously added by
add_usd_reference*(blocking).- Parameters:
handle (int)
- Return type:
None
- remove_usd_async(stage, handle)#
Remove a USD reference previously added by
add_usd_reference*(asynchronous).
- reset_usd(stage)#
Clear all USD source content from the stage (blocking).
- Return type:
None
- reset_usd_async(stage)#
Clear all USD source content from the stage (asynchronous).
- Return type:
- update_from_usd_time(stage, ordinal, time_code)#
Advance time and propagate time-sampled attribute changes (blocking).
time_codeis in seconds (converted via the stage’stimeCodesPerSecond, like the Ctimeparameter). Wraps the C entry pointovstage_population_apply_usd_time.
- update_from_usd_time_async(stage, ordinal, time_code)#
Advance time and propagate time-sampled changes (asynchronous). See
update_from_usd_time().
- apply_usd_changes(stage, ordinal=1)#
Propagate USD edits accumulated since the last call into the stage (blocking).
- Parameters:
ordinal (int)
- Return type:
None
- apply_usd_changes_async(stage, ordinal=1)#
Propagate USD edits accumulated since the last call into the stage (asynchronous).