Logo: Department of HealthLogo: Pharmaceutical Benefits SchemeCost Efficient Vial Combination Algorithm
PBS XML Schema Version 3.1.9

Introduction

This algorithm describes a method for determining the lowest cost for a particular dosage of a medicine using a combination of vials of that medicine. More than one combination of vials may result in the lowest cost. A "vial" is equivalent to an AMT Trade Product Unit of Use (TPUU).

NB. The algorithm does not attempt to minimise wastage of the medicine.

Inputs

Infusible drug I

Prescribed dosage D

Maximum amount M

Dispensary type T

Data

The medicine I is available in a number of different packs (TPPs). There will be at least one TPP for a given drug. Each TPP contains one or more vials (TPUUs). There will be only one kind of TPUU in a TPP (i.e. the TPP is a single component pack). The different vials are denoted by V1, V2, ..., Vn. A vial size may be available from more than one manufacturer, so there may be duplicate brands for vial sizes in this list. Each value Vj represents the amount of active ingredient I in the vial, not the volume of the vial. The amount of active ingredient is expressed in the appropriate unit of measure, eg. milligrams (mg). The amount of active ingredient in a single vial is referred to as the vial content. The total aggregate amount of active ingredient in the pack (TPP) is referred to as the pack content. The vial content is determined by dividing the pack content by the pack size (AMT total unit-of-use count).

A combination of vials is represented as a vector: V = [k1 k2 ... kn]. This means that there are k1 vials with vial content V1, k2 vials with vial content V2, and so on.

Each vial has two corresponding vial prices (ex-manufacturer): reimbursement and manufacturer. The pricing formula is applied using only one of these prices. The vial price is derived by dividing the TPP price by the pack size. The ex-manufacturer vial price of each vial (reimbursement or manufacturer) is denoted by p1, p2, ..., pn. This may also be expressed as a vector: P = [p1 p2 ... pn].

Definitions

Function ROUND

The function ROUND(a, n) rounds a value a to n decimal places. Half values round up.

For example, ROUND(10.125, 2) = 10.13.

Function TRUNC

The function TRUNC(a, n) rounds a value a to n decimal places. Fractional values round down.

For example, TRUNC(10.123456789, 8) = 10.12345678.

Function M

The function M(p, T) adds markup to an ex-manufacturer price p. The resulting price is known as the Pharmacy Pack Price. The amount of markup depends on the dispensary type, T. See below for the markup specifications for each dispensary type.

For example, M(1000.00, 'Private Hospital') = 1014.00

Pricing Formula

The Dispensed Price for Dispensed Amount (DPDA) for an infusion is calculated based on the ex-manufacturer vial prices of the vials that are combined in the infusion, along with markups and fees. This is calculated as follows:

DPDA(V) = (ΣkjROUND(M(pj, T), 2)) + feeW + feeI + feeD + feeE

That is, a pharmacy markup is applied to the vial's ex-manufacturer price. This price is the pharmacy vial price. Each pharmacy vial price is multiplied by the number of vials required in the combination. These values are then summed and wholesale, infusion, dispensing and diluent fees are added.

The fees and markups depend on T and are as follows:

* All data values are published monthly in the Schedule of Pharmaceutical Benefits.

** To determine the markup band for the Pharmacy markup, multiply the ex-manufacturer price for vial pj by ceiling(MA / Vj)

Payment type

Description

S90 community pharmacies and S92 dispensing doctors

Participating public hospital pharmacies

S99(4) private hospital pharmacies

M(p, T)

Pharmacy markup

As specified* **

p (0%*)

1.014p (1.4%*)

feeW

Wholesale fee

$24.00*

$0.00*

$24.00*

feeI

Infusion fee

$40.00*

$40.00*

$40.00*

feeD

Dispensing fee

As specified*

$0.00*

As specified*

feeE

Diluent fee

$4.75*

$0.00*

$4.75*

Algorithm

The aim of the algorithm is to find the lowest L = DPDA(V).

Step 1

For every Vj compute its per-unit-of-measure price Rj.

Rj = TRUNC(ROUND(M(Pj, T), 2) / Vj, 8)

Step 2

Let R be a vector listing the unique Rj values in ascending order.

R = [R1 R2 ... Rn] where R1 < R2 < ... < Rn

Also, let S be a two dimensional matrix listing the distinct vial content values of the vials that correspond to each Rj in descending order. Each Sa,b corresponds to one or more vials Vj (i.e. those vials that have the same per-unit-of-measure price and vial content). Fill blank entries in the matrix with the value zero.


S = ⎡ S1,1 S1,2 ... S1,t ⎤
    ⎢  S2,1 0  ... S2,t ⎥
    ...
    ⎣  Sm,1 Sm,2 ... Sm,t ⎦

where Si,1 > Si,2 > ... > Si,t and 1 ≤ im.

Equivalence

The vector W = [l1,1 l1,2 ... lm,t] represents a combination of vials with vial content corresponding to Sa,b. That is, Dl1,1 * S1,1 + l1,2 * S1,2 + ... + lm,t * Sm,t. Since each Sa,b corresponds to one or more vials Vj, the vector W corresponds to one or more vectors V. All of these vectors have the same cost as W.

The modified aim of the algorithm is to find lowest L = DPDA(V) = DPDA(W).

Any of the vials Vj that correspond to each Sa,b in W may be substituted to give the same L. This will be possible when there are two or more brands with the same vial content and the same price.

Step 3

This step may be executed recursively.

Consider R1 and its corresponding row in S, [S1,1 S1,2 ... S1,t]. This step considers whether some combination of these vial contents exactly delivers the required dosage D.


For h := 1 to t repeat:
    If S1,h > D then skip to next vial size
    If D mod S1,h = 0 then W = [(D / S1,h) 0 ... 0] and Ch = DPDA(W). This gives a candidate lowest L.
      

[Note: If the largest sized vial has no wastage then normally it would not be necessary to test the smaller vial sizes. However, this additional step is necessary if the R value has been truncated at 8 decimal places.]


For g := 0 to floor(D / S1,h) repeat:
    D' = D - gS1,h
      

Recursively apply step 3 using dosage D' and vial contents [S1,2 S1,3 ... S1,t]. If the recursive step successfully completes then:


W = [(D / S1,h) <<result of recursive step>>]
Ch,g = DPDA(W)
      

If any of these vial combinations result in no wastage then:


L = min(Ch, Ch,g)
      

and the algorithm terminates.

Step 4

This step may be executed recursively.

Consider R1 and its corresponding row in S, [S1,1 S1,2 ... S1,t]. This step is evaluated when no combination of vial sizes at the lowest per-unit-of-measure-price exactly fits the required dosage D.

Three candidate prices will be calculated: C1, C2 and C3. L = min(C1, C2, C3)

Iterate over the vial content S1,1:


for i := ceiling(D / S1,1) to 0 do:
    If D < i * S1,1 then:

        This number of vials overfills the required dosage

        W1 = [i 0 ... 0]
        C1 = DPDA(Wi)

    Otherwise if S1,2 or R2 exist then:
        D' = D - i * S1,1

        The amount of drug that this number of vials delivers falls short of the required dosage.
Use vials with smaller vial content and/or more expensive vials to make up for the shortfall.


        If S1,2 exists then recursive step:
            repeat step 4 using D' and S1,2 ... S1,t as well as R2 ... Rm.
            W2 = [i <<result of recursive step>>]
            C2 = DPDA(W2)

        Otherwise if R2 exists and D' * R2 < ceiling(D' / S1,1) * S1,1 * R1 then:

        Now consider only vials that are more expensive per-unit-of-measure.
However, if overfilling with a cheaper vial gives a lower price
then the more expensive vials will never result in a cheaper price for the combination.


            Recursive step:
                repeat step 3 and 4 using D' and R2 ... Rm.
            W3 = [i  <<result of recursive step>>]
            C3 = DPDA(W3)
        End of if
    End of otherwise

    Wi = min(C1, C2, C3)
    Li = DPDA(Wi)

End of for loop

L = min(Li)

Examples

Several infusions for Methotrexate are dispensed. Pricing for different maximum amounts are calculated. All calculations are performed for the S94 Private Hospital dispensing rule.

The listing for Methotrexate, 7250N, has the following product listings:

Brand Name

Code

Vial Content

Ex-manufacturer price

Pharmacy price

Pharmacy price per UoM

Hospira Pty Limited

PF

5

$5.37

$5.45

$1.09

Hospira Pty Limited

PF

50

$5.10

$5.17

$0.1034

Hospira Pty Limited

PF

1000

$37.67

$38.20

$0.0382

Hospira Pty Limited

PF

500

$51.00

$51.71

$0.1022

Methotrexate Ebewe

SZ

5000

$188.35

$190.99

$0.03767

Methaccord

EA

1000

$37.67

$38.20

$0.0382

Pfizer Australia Pty Ltd

PF

1000

$37.67

$38.20

$0.0382

Methotrexate Accord

OD

1000

$37.67

$38.20

$0.0382

Methotrexate Accord

OD

50

$5.10

$5.17

$0.1034

The following dosages have been calculated: