Release Notes
0.5.4
Maintenance
- CI pipeline and deployment workflow improvements.
- README and documentation updates.
0.5.3
New features
pyworkforce.staffing.MultiSkillStaffing— minimum-cost agent-mix optimiser for multi-skill contact-centre staffing. Given per-skill requirements (fromErlangC/ErlangA) and a catalogue of agent skill profiles, solves the integer programme that minimises total weighted headcount. Flexible (multi-skilled) agents count towards every skill they hold, so the solver automatically balances dedicated vs. flexible hiring. Supports an optionalmax_agentsbudget cap and is now exported from thepyworkforceroot namespace.pyworkforce.queuing.ErlangB/MultiErlangB— Erlang B (M/M/c/c) pure-loss queue for trunk and channel sizing. Models systems with no waiting room where blocked calls are shed. Providesblocking_probability,achieved_occupancyandrequired_positions(withmax_blockingandmax_occupancytargets).MultiErlangBsweeps a parameter grid in parallel, mirroringMultiErlangC.pyworkforce.breaks.BreakScheduler— CP-SAT solver that assigns break start times to agent slots within each shift while enforcing break windows (earliest start, latest end), preventing overlapping breaks on the same slot, and guaranteeing that simultaneous breaks never exceed the coverage slack. Accepts multiple break types per shift.ErlangB,MultiErlangB,BreakScheduler, andMultiSkillStaffingare all exported from thepyworkforceroot namespace.
Dependency changes
- Lowered
numpyfloor to>=1.23(code uses only stable basic operations; aligns with thepandas>=2.2minimum and unblocks the conda-forge package). - Lowered
ortoolsfloor to>=9.6(all CP-SAT APIs in use are stable at this version; matches the conda-forgeortools-pythonfeedstock).
0.5.2 — previous release
New features
pyworkforce.queuing.ErlangA— M/M/c+M queue with customer abandonment. All metrics computed exactly from the birth-death stationary distribution.pyworkforce.queuing.MultiErlangA— parameter-grid variant ofErlangA.pyworkforce.shifts— shift coverage builders (shift_coverage_from_hours,shift_coverage_from_spans,shift_coverage_from_periods,validate_shift_coverage,coverage_to_dataframe).pyworkforce.utils.results_to_dataframe— tidy DataFrames fromMulti*results.- All estimators expose
get_params(), a readablerepr()and store their last result assolution_.
Bug fixes
MultiErlangCnow correctly populatesachieved_occupancy_paramsandrequired_positions_params.- Validation helpers accept integers where floats are expected and reject booleans,
NaNand infinities. MinHoursRosterrejects duplicate resource names.
Packaging & tooling
- Migrated to PEP 621
pyproject.toml; upgraded dependency floors. - Added ruff linting, Dependabot config, and a PyPI trusted-publishing workflow.
- Documentation moved to VitePress on GitHub Pages.
For older releases, see the GitHub releases page.