API
ProjectManagement.PertBeta
— TypePertBeta(a, b, c) <: ContinuousUnivariateDistribution
a
: the minimum value of the supportb
: the modec
: the maximum value of the support
ProjectManagement.Project
— TypeProject(task_durations, links)
task_durations::NamedTuple
: a namedtuple where the keys are the names of the tasks, and the values indicate the timing.- The timing values can be a
Real
value (like 5.0) to represent a fixed duration; or anything sampleable to represent a duration only probabilistically known. i.e. any objectdur
that hasrand(rng, dur)::Real
defined on it. e.g. any collection or distribution object. Particularly relevent isPertBeta(min, mode, max)
which is the standard used for PERT estimation.
- The timing values can be a
links::Vector{Pair{Symbol, Symbol}}
: a collection of pairs for all the depencencies of tasks. e.g.[:a => :b, :a=>:c, :c=>:d]
. A convienent way to write this is often using broadcasting and matrix notation for vcat:[:a .=> [:b, :c]; :c => :d]
.
The task names start
and finish
are special, in that they represent the begining and ending milestones of the project. They must be in the task_durations
with duration 0
, and they respectively must be the root and only leaf of the graph decribed by the links
.
ProjectManagement.critical_path
— Methodcritical_path([f=mean], proj::Project)
Computes the critical path though the project. This is the path who's duration determines the completion time of the project.
You may pass in a function f
to transform the duration when computing the cost. By default it uses mean
, but for example you can assume everything is worst case using path_durations(maximum, proj)
; or you could compute the path length in terms of number of tasks using path_durations(x->1, proj)
.
See also path_durations
.
ProjectManagement.density
— Functiondensity(proj::Project, nsamples=100_000, rng=Random.default_rng())
Displayed a probability density function for how long it will take to complete the project. nsamples
controls how many samples are used to estimate the distribution, increasing this makes it take longer, but be more accurate. rng
controls the random number generator to use, you shouldn't normally need to touch this.
Gadfly.jl is used for the displaying. A RecipesBase.jl recipe is also provided and so this can be used with StatsPlots.jl similarly: as StatsPlots.density(proj)
.
ProjectManagement.path_durations
— Methodpath_durations([f=mean], proj::Project)
Compute the duration of every path of tasks with in the project. They are returned as a vector of pairs: path => cost
, sorted by cost (descending). Thus the first is the critical path, and the last is the least critical path.
You may pass in a function f
to transform the duration when computing the cost. By default it uses mean
, but for example you can assume everything is worst case using path_durations(maximum, proj)
; or you could compute the path length in terms of number of tasks using path_durations(x->1, proj)
.
See also critical_path
.
ProjectManagement.validate_links
— Methodvalidate_links(proj)
Checks that: - the links in proj
form a directed acyclic graph - that every end-point in the links
is on task_durations
- that every task in task_durations
occurs in links
ProjectManagement.visualize_chart
— Methodvisualize_chart(proj::Project; fontsize=2)
Visualizes the project as a PERT Chart. Each task is places to the right of the tasks that much be completed first.