pert calculator plugin
This commit is contained in:
parent
f558a460c2
commit
e7b520a2ac
55
plugins/pert/README.md
Normal file
55
plugins/pert/README.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
### PERT Calculator
|
||||||
|
|
||||||
|
A simple utility to estimate tasks using PERT (Program evaluation and review technique)
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
<pre>
|
||||||
|
A command line PERT calculator for quick estimates.
|
||||||
|
|
||||||
|
Comma separated task list in the form "1,2,12 4,5,9 2,3,6", where whitespace separates tasks.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
pert [optimistic,realistic,pessimistic]
|
||||||
|
|
||||||
|
Example:
|
||||||
|
pert 1,3,4
|
||||||
|
pert 10,15,20 5,7,10
|
||||||
|
pert "1,2,3" "15,17,20"
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
Command:
|
||||||
|
|
||||||
|
`$ pert 5,7,10 2,3,4 10,12,14`
|
||||||
|
|
||||||
|
Output:
|
||||||
|
<pre>
|
||||||
|
Tasks
|
||||||
|
|
||||||
|
+--------------------------------------------------------------------------------------+
|
||||||
|
| # | optimistic | realistic | pessimistic | duration | risk | variance |
|
||||||
|
+--------------------------------------------------------------------------------------+
|
||||||
|
| 1. task | 5 | 7 | 10 | 7.16 | 0.83 | 0.68 |
|
||||||
|
| 2. task | 2 | 3 | 4 | 3.00 | 0.33 | 0.10 |
|
||||||
|
| 3. task | 10 | 12 | 14 | 12.00 | 0.66 | 0.43 |
|
||||||
|
+--------------------------------------------------------------------------------------+
|
||||||
|
| summary | - | - | - | 22.16 | 1.82 | 1.21 |
|
||||||
|
+--------------------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
Three point estimates
|
||||||
|
|
||||||
|
+----------------------------------------+
|
||||||
|
| confidence | | |
|
||||||
|
+----------------------------------------+
|
||||||
|
| 1 Sigma - 68% | 20.34 | 23.98 |
|
||||||
|
| 2 Sigma - 95% | 18.52 | 25.80 |
|
||||||
|
| 3 Sigma - 99% | 16.70 | 27.62 |
|
||||||
|
+----------------------------------------+
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
### License
|
||||||
|
[MIT](https://github.com/arzzen/pert/blob/master/LICENSE)
|
||||||
|
|
||||||
|
### Maintainer
|
||||||
|
[Lukas Mestan](https://github.com/arzzen/)
|
145
plugins/pert/pert.plugin.zsh
Normal file
145
plugins/pert/pert.plugin.zsh
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
#
|
||||||
|
# A simple utility to estimate tasks using PERT
|
||||||
|
# (Program evaluation and review technique)
|
||||||
|
#
|
||||||
|
|
||||||
|
alias pert="pert.sh"
|
||||||
|
|
||||||
|
# helper cli calculator
|
||||||
|
_calc() {
|
||||||
|
echo "scale=2; $@" | bc -l | sed 's/^\./0./'
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# divider row
|
||||||
|
_divider() {
|
||||||
|
divider=------------------------------
|
||||||
|
divider=" +"$divider$divider$divider"+"
|
||||||
|
printf "%$_width.${_width}s+\n" "$divider"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# show help for command list
|
||||||
|
_help() {
|
||||||
|
print -P ""
|
||||||
|
print -P "A command line PERT calculator for quick estimates."
|
||||||
|
print -P ""
|
||||||
|
print -P "Comma separated task list in the form \"1,2,12 4,5,9 2,3,6\","
|
||||||
|
print -P "where whitespace separates tasks."
|
||||||
|
print -P ""
|
||||||
|
print -P "Usage:"
|
||||||
|
print -P ""
|
||||||
|
print -P " pert [optimistic,realistic,pessimistic]"
|
||||||
|
print -P ""
|
||||||
|
print -P "Example:"
|
||||||
|
print -P ""
|
||||||
|
print -P " pert 1,3,4"
|
||||||
|
print -P " pert 10,15,20 5,7,10"
|
||||||
|
print -P " pert \"1,2,3\" \"15,17,20\""
|
||||||
|
print -P ""
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# header row
|
||||||
|
_table_header() {
|
||||||
|
print -P ""
|
||||||
|
print -P "Tasks"
|
||||||
|
print -P ""
|
||||||
|
_width=88
|
||||||
|
_divider
|
||||||
|
printf "$format" "#" "optimistic" "realistic" "pessimistic" "duration" "risk" "variance"
|
||||||
|
_divider
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# footer summary row
|
||||||
|
_table_footer_sum() {
|
||||||
|
printf "$format" "summary" "-" "-" "-" $total_estimate $total_standard_deviation $total_variance
|
||||||
|
_divider
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# footer 3point row
|
||||||
|
_table_footer_tpe() {
|
||||||
|
print -P ""
|
||||||
|
print -P "Three point estimates"
|
||||||
|
print -P ""
|
||||||
|
|
||||||
|
_width=42
|
||||||
|
tpeformat=" | %-13s |%11s |%10s |\n"
|
||||||
|
|
||||||
|
_divider
|
||||||
|
printf "$tpeformat" "confidence"
|
||||||
|
_divider
|
||||||
|
printf "$tpeformat" "1 Sigma - 68%" $(_calc "$total_estimate - $total_standard_deviation") $(_calc "$total_estimate + $total_standard_deviation")
|
||||||
|
printf "$tpeformat" "2 Sigma - 95%" $(_calc "$total_estimate - 2 * $total_standard_deviation") $(_calc "$total_estimate + 2 * $total_standard_deviation")
|
||||||
|
printf "$tpeformat" "3 Sigma - 99%" $(_calc "$total_estimate - 3 * $total_standard_deviation") $(_calc "$total_estimate + 3 * $total_standard_deviation")
|
||||||
|
_divider
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# main function
|
||||||
|
pert() {
|
||||||
|
|
||||||
|
# help text
|
||||||
|
if [ -z "$1" ] || [[ "$1" =~ [-]*(help|h) ]]; then
|
||||||
|
_help
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
format=" | %-12s |%11s |%10s |%12s |%9s |%9s |%9s |\n"
|
||||||
|
|
||||||
|
# header
|
||||||
|
_table_header
|
||||||
|
|
||||||
|
counter=0
|
||||||
|
total_estimate=0
|
||||||
|
total_standard_deviation=0
|
||||||
|
total_variance=0
|
||||||
|
for var in "$@"; do
|
||||||
|
# counter iterator
|
||||||
|
counter=$[$counter +1]
|
||||||
|
|
||||||
|
# optimistic value
|
||||||
|
o=${var[(ws:,:)1]}
|
||||||
|
|
||||||
|
# realistic value
|
||||||
|
r=${var[(ws:,:)2]}
|
||||||
|
|
||||||
|
# pessimistic value
|
||||||
|
p=${var[(ws:,:)3]}
|
||||||
|
|
||||||
|
# check values
|
||||||
|
if [ -z "$o" ] || [ -z "$r" ] || [ -z "$p" ]; then
|
||||||
|
printf "$format" "$counter. bad input" $o $r $p
|
||||||
|
else
|
||||||
|
# pert estimate
|
||||||
|
pert_estimate=$(_calc "($o+4*$r+$p)/6")
|
||||||
|
total_estimate=$(_calc "$total_estimate + $pert_estimate")
|
||||||
|
|
||||||
|
# standard deviation
|
||||||
|
standard_deviation=$(_calc "($p-$o)/6")
|
||||||
|
total_standard_deviation=$(_calc "$total_standard_deviation + $standard_deviation")
|
||||||
|
|
||||||
|
# variance
|
||||||
|
variance=$(_calc "$standard_deviation * $standard_deviation")
|
||||||
|
total_variance=$(_calc "$total_variance + $variance")
|
||||||
|
|
||||||
|
# table row
|
||||||
|
printf "$format" "$counter. task" $o $r $p $pert_estimate $standard_deviation $variance
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
_divider
|
||||||
|
|
||||||
|
# footer
|
||||||
|
if [[ $total_estimate > 0 ]]; then
|
||||||
|
_table_footer_sum
|
||||||
|
_table_footer_tpe
|
||||||
|
fi
|
||||||
|
|
||||||
|
print -P ""
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
unset _width
|
Loading…
Reference in New Issue
Block a user