Resources Module
Resource management components for modeling limited resources, servers, and queues.
Server
Multi-server processing stations with automatic queue management.
- class simcraft.Server[source]
Bases:
Generic[T]Multi-server processing station.
A Server models a processing station with one or more parallel servers (capacity), a waiting queue, and configurable service time distributions.
- Parameters:
Examples
>>> def service_time(): ... return sim.rng.exponential(5.0) ... >>> server = Server(sim, capacity=2, service_time=service_time) >>> server.enqueue(customer) >>> server.on_departure(lambda c: print(f"{c.id} departed"))
- property stats: ServerStats
Get server statistics.
- property state: ServerState
Get current server state.
- enqueue(entity)[source]
Add an entity to the server.
The entity will be served immediately if capacity is available, otherwise it will wait in the queue.
- Parameters:
entity (T) – Entity to process
- Returns:
True if entity was accepted, False if queue is full
- Return type:
- preempt(entity)[source]
Preempt service for highest-priority entity.
- Parameters:
entity (T) – Entity requesting preemption
- Returns:
The preempted entity, or None if no preemption occurred
- Return type:
Optional[T]
- on_arrival(callback)[source]
Set callback for entity arrivals.
- Parameters:
callback (Callable[[T], None])
- Return type:
None
- on_service_start(callback)[source]
Set callback for service start.
- Parameters:
callback (Callable[[T], None])
- Return type:
None
- on_departure(callback)[source]
Set callback for entity departures.
- Parameters:
callback (Callable[[T], None])
- Return type:
None
- class simcraft.resources.server.ServerStats[source]
Bases:
objectStatistics for server performance.
- record_state_change(time, new_state)[source]
Record a state change.
- Parameters:
time (float)
new_state (ServerState)
- Return type:
None
- __init__(arrivals=0, departures=0, balked=0, busy_time=0.0, idle_time=0.0, blocked_time=0.0, down_time=0.0, total_service_time=0.0, _last_state_change=0.0, _current_state=ServerState.IDLE, _busy_count=0)
- class simcraft.resources.server.ServerState[source]
Bases:
EnumServer operational states.
- IDLE = 1
- BUSY = 2
- BLOCKED = 3
- DOWN = 4
- class simcraft.resources.server.MultiStageServer[source]
Bases:
Generic[T]Multi-stage processing server.
Entities flow through a sequence of processing stages, each with its own service time and optional queue.
- Parameters:
sim (Simulation) – Parent simulation
stage_configs (List[Dict]) – Configuration for each stage with keys: - capacity: int - service_time: float or Callable - queue_capacity: int (optional)
name (str) – Optional name
Examples
>>> stages = [ ... {"capacity": 1, "service_time": 5.0}, ... {"capacity": 2, "service_time": 3.0}, ... ] >>> server = MultiStageServer(sim, stages) >>> server.enqueue(job)
- __init__(sim, stage_configs, name='')[source]
Initialize multi-stage server.
- Parameters:
sim (Simulation)
stage_configs (List[Dict[str, Any]])
name (str)
- Return type:
None
- enqueue(entity)[source]
Add entity to first stage.
- Parameters:
entity (T) – Entity to process
- Returns:
True if accepted
- Return type:
Queue
FIFO and priority queues with statistics collection.
- class simcraft.Queue[source]
Bases:
Generic[T]FIFO queue with statistics collection.
A basic first-in-first-out queue that tracks entry times and collects performance statistics.
- Parameters:
sim (Simulation) – Parent simulation for time tracking
capacity (int) – Maximum queue capacity (0 = unlimited)
name (str) – Optional name for the queue
Examples
>>> queue = Queue(sim, capacity=10, name="WaitingRoom") >>> queue.enqueue(customer) >>> if not queue.is_empty: ... next_customer = queue.dequeue() >>> print(queue.stats.average_wait)
- __init__(sim, capacity=0, name='')[source]
Initialize queue.
- Parameters:
sim (Simulation)
capacity (int)
name (str)
- Return type:
None
- property stats: QueueStats
Get queue statistics.
- enqueue(item)[source]
Add item to the queue.
- Parameters:
item (T) – Item to add
- Returns:
True if item was added, False if queue is full
- Return type:
- dequeue()[source]
Remove and return the first item.
- Returns:
First item or None if queue is empty
- Return type:
Optional[T]
- peek()[source]
Return the first item without removing it.
- Returns:
First item or None if queue is empty
- Return type:
Optional[T]
- remove(item)[source]
Remove a specific item from the queue.
- Parameters:
item (T) – Item to remove
- Returns:
True if item was found and removed
- Return type:
- clear()[source]
Remove all items from the queue.
- Returns:
List of removed items
- Return type:
List[T]
- on_enqueue(callback)[source]
Set callback for enqueue events.
- Parameters:
callback (Callable[[T], None])
- Return type:
None
- class simcraft.resources.queue.QueueStats[source]
Bases:
objectStatistics for queue performance.
- record_entry(time)[source]
Record an entry to the queue.
- Parameters:
time (float)
- Return type:
None
- class simcraft.resources.queue.PriorityQueue[source]
Bases:
Generic[T]Priority queue with statistics collection.
Items are dequeued in order of priority (lower value = higher priority).
- Parameters:
sim (Simulation) – Parent simulation for time tracking
priority_fn (Optional[Callable[[T], float]]) – Function to extract priority from items (default uses 0)
capacity (int) – Maximum queue capacity (0 = unlimited)
name (str) – Optional name for the queue
Examples
>>> queue = PriorityQueue(sim, priority_fn=lambda x: x.priority) >>> queue.enqueue(high_priority_job) >>> queue.enqueue(low_priority_job) >>> next_job = queue.dequeue() # Returns high_priority_job
- __init__(sim, priority_fn=None, capacity=0, name='')[source]
Initialize priority queue.
- Parameters:
sim (Simulation)
priority_fn (Optional[Callable[[T], float]])
capacity (int)
name (str)
- Return type:
None
- property stats: QueueStats
Get queue statistics.
- dequeue()[source]
Remove and return the highest priority item.
- Returns:
Highest priority item or None if empty
- Return type:
Optional[T]
- peek()[source]
Return the highest priority item without removing it.
- Returns:
Highest priority item or None if empty
- Return type:
Optional[T]
Resource
Seizable resources with acquire/release semantics.
- class simcraft.Resource[source]
Bases:
objectLimited resource with acquire/release semantics.
A Resource represents a limited item (or pool of items) that entities can acquire and later release. Supports priority-based waiting and timeouts.
- Parameters:
sim (Simulation) – Parent simulation
capacity (int) – Number of resource units
name (str) – Optional resource name
Examples
>>> operator = Resource(sim, capacity=1, name="Operator") >>> >>> # Immediate acquisition >>> if operator.acquire(job): ... # Use resource ... operator.release(job) >>> >>> # Request with callback >>> def on_acquired(resource, job): ... sim.schedule(release_op, delay=5.0, args=(job,)) >>> operator.request(job, callback=on_acquired)
- __init__(sim, capacity=1, name='')[source]
Initialize resource.
- Parameters:
sim (Simulation)
capacity (int)
name (str)
- Return type:
None
- property stats: ResourceStats
Get resource statistics.
- release(holder)[source]
Release resource units.
- Parameters:
holder (T) – Entity currently holding the resource
- Returns:
True if release succeeded, False if entity wasn’t holding
- Return type:
- request(requester, quantity=1, priority=0, timeout=None, callback=None)[source]
Request resource units (may wait if not available).
- Parameters:
- Returns:
True if immediately acquired, False if waiting
- Return type:
- class simcraft.resources.resource.ResourceStats[source]
Bases:
objectStatistics for resource usage.
- __init__(acquisitions=0, releases=0, timeouts=0, total_busy_time=0.0, total_idle_time=0.0, total_wait_time=0.0, _area_allocated=0.0, _last_change_time=0.0, _current_allocated=0, _capacity=1)
- class simcraft.resources.resource.ResourceState[source]
Bases:
EnumResource states.
- AVAILABLE = 1
- ALLOCATED = 2
- DOWN = 3
- class simcraft.resources.resource.PreemptiveResource[source]
Bases:
ResourceResource with preemption support.
Lower priority holders can be preempted by higher priority requests.
- Parameters:
sim (Simulation) – Parent simulation
capacity (int) – Number of resource units
name (str) – Optional resource name
Examples
>>> machine = PreemptiveResource(sim, capacity=1) >>> machine.acquire(low_priority_job, priority=1) >>> machine.acquire(high_priority_job, priority=10) # Preempts
- __init__(sim, capacity=1, name='')[source]
Initialize preemptive resource.
- Parameters:
sim (Simulation)
capacity (int)
name (str)
- Return type:
None
- acquire(requester, quantity=1, priority=0)[source]
Acquire resource units, possibly preempting lower priority holders.
Resource Pool
Pools of distinguishable resources.
- class simcraft.ResourcePool[source]
Bases:
Generic[R]Pool of individual, distinguishable resources.
Unlike a simple capacity-based Resource, ResourcePool manages individual resource objects that can be selected based on various policies (first available, round-robin, least utilized, or custom selection function).
- Parameters:
sim (Simulation) – Parent simulation
name (str) – Pool name
selection_policy (PoolSelectionPolicy) – Policy for selecting resources
Examples
>>> class AGV: ... def __init__(self, id: str, location: tuple): ... self.id = id ... self.location = location ... >>> pool = ResourcePool(sim, name="AGVPool") >>> pool.add_resource(AGV("AGV1", (0, 0)), id="AGV1") >>> pool.add_resource(AGV("AGV2", (10, 0)), id="AGV2") >>> >>> # Custom selection: nearest AGV >>> def nearest_to(target): ... def selector(available): ... return min(available, key=lambda r: distance(r.location, target)) ... return selector >>> >>> agv = pool.acquire(job, selector=nearest_to((5, 5)))
- __init__(sim, name='', selection_policy=PoolSelectionPolicy.FIRST_AVAILABLE)[source]
Initialize resource pool.
- Parameters:
sim (Simulation)
name (str)
selection_policy (PoolSelectionPolicy)
- Return type:
None
- remove_resource(id)[source]
Remove a resource from the pool.
- Parameters:
id (str) – Resource identifier
- Returns:
The removed resource, or None if not found
- Return type:
Optional[R]
- get_resource(id)[source]
Get a resource by ID.
- Parameters:
id (str) – Resource identifier
- Returns:
The resource, or None if not found
- Return type:
Optional[R]
- acquire(requester, selector=None)[source]
Acquire a resource from the pool.
- Parameters:
requester (Any) – Entity requesting the resource
selector (Optional[Callable]) – Custom function to select from available resources
- Returns:
Selected resource, or None if none available
- Return type:
Optional[R]
- request(requester, callback, selector=None)[source]
Request a resource (wait if not available).
- Parameters:
requester (Any) – Entity requesting the resource
callback (Callable) – Function to call when resource is acquired
selector (Optional[Callable]) – Custom selection function
- Returns:
True if immediately acquired, False if waiting
- Return type:
- release(resource)[source]
Release a resource back to the pool.
- Parameters:
resource (R) – Resource to release
- Returns:
True if successfully released
- Return type:
- set_selection_policy(policy, custom_selector=None)[source]
Set resource selection policy.
- Parameters:
policy (PoolSelectionPolicy) – Selection policy
custom_selector (Optional[Callable]) – Custom selector for CUSTOM policy
- Return type:
None
- get_available()[source]
Get list of available resources.
- Returns:
Available resources
- Return type:
List[R]
- get_allocated()[source]
Get list of allocated resources.
- Returns:
Allocated resources
- Return type:
List[R]
- class simcraft.resources.pool.PooledResource[source]
Bases:
Generic[R]Wrapper for a resource in a pool.
- resource
The actual resource object
- Type:
R
- resource: R