## Dispatcher


Allocate ambulances and permits to waiting patients.


Usage

``` python
Dispatcher(
    env,
    ambulance,
    permit=None,
)
```


Patients are ordered first by clinical priority and then by the order in which they joined the dispatch queue. When restricted send is active, C2-C4 patients require both an ambulance and a permit. C1 patients require only an ambulance.

We have created this dispatcher class to enable us to only allocate if both an ambulance AND a permit are available at the same time, instead of assigning one and then the other.


## Methods

| Name | Description |
|----|----|
| [__init__()](#__init__) | Initialise the dispatcher. |
| [get_next_dispatchable_request()](#get_next_dispatchable_request) | Return highest-priority patient whose resources are available. |
| [notify()](#notify) | Notify the dispatcher that the model state has changed. |
| [request_resources()](#request_resources) | Add a patient to the dispatch queue. |
| [return_resources()](#return_resources) | Return resources after an ambulance response. |
| [run()](#run) | Allocate resources to the highest-priority eligible patient. |

------------------------------------------------------------------------


#### \_\_init\_\_()


Initialise the dispatcher.


Usage

``` python
__init__(env, ambulance, permit=None)
```


##### Parameters


`env: simpy.Environment`  
SimPy environment.

`ambulance: VidigiPriorityStore`  
Pool of available ambulance resources.

`permit: VidigiPriorityStore | None = None`  
Pool of permits allowing ambulances to attend C2-C4 incidents. If None, restricted send is not active.


------------------------------------------------------------------------


#### get_next_dispatchable_request()


Return highest-priority patient whose resources are available.


Usage

``` python
get_next_dispatchable_request()
```


##### Returns


`DispatchRequest | None`  
Highest-priority request for which all required resources are available, or None if no waiting patient can currently be sent.


------------------------------------------------------------------------


#### notify()


Notify the dispatcher that the model state has changed.


Usage

``` python
notify()
```


------------------------------------------------------------------------


#### request_resources()


Add a patient to the dispatch queue.


Usage

``` python
request_resources(patient)
```


##### Parameters


`patient: Patient`  
Patient requiring an ambulance response.


##### Returns


`simpy.events.Event`  
Event that succeeds with an `(ambulance, permit)` tuple once the required resources have been allocated. The permit is None when no permit is required.


------------------------------------------------------------------------


#### return_resources()


Return resources after an ambulance response.


Usage

``` python
return_resources(ambulance, permit, patient_id)
```


##### Parameters


`ambulance: VidigiResource`  
Ambulance to return to the resource pool.

`permit: VidigiResource | None`  
Restricted send permit to return, or None if no permit was used.

`patient_id: id`  
Identified of the patient whose response has finished.


------------------------------------------------------------------------


#### run()


Allocate resources to the highest-priority eligible patient.


Usage

``` python
run()
```
