precedence 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,5 +1,123 @@
1
+ = 0.8
2
+
3
+ * Added multiple durations. An activity has the following durations associated
4
+ activity = Precedence::Activity.new('activity1') do |act|
5
+ act.expected_duration = 2 # This is what would've been act.duration
6
+ act.minimum_duration = 1 # The minimum time the activity could need
7
+ act.maximum_duration = 4 # The maximum time the activity should need
8
+ end
9
+
10
+ From this the following may be determined:
11
+ activity.mean_duration
12
+ activity.standard_deviation
13
+ activity.variance
14
+
15
+ A Beta distribution is assumed to be used for the probability density function
16
+ and if certain assumptions are made the following hold
17
+ - The mean_duration is calculated as:
18
+ (4*expected_duration + minimum_duration + maximum_duration)/6
19
+ - The standard deviations is:
20
+ (maximum_duration - minimum_duration)/6
21
+ - The variance is the standard deviation squared.
22
+
23
+ The activity.duration attribute is still present and it is configurable to
24
+ allow the differing duration types. The duration to be used is set using the
25
+ Activity.duration_type attribute. For instance assuming we have the following
26
+ two activities set up:
27
+ act1 = Precedence::Activity.new('a1') do |activity|
28
+ activity.expected_duration = 2
29
+ activity.minimum_duration = 1
30
+ activity.maximum_duration = 3
31
+ end
32
+ act2 = Precedence::Activity.new('a2') do |activity|
33
+ activity.expected_duration = 3
34
+ activity.minimum_duration = 1
35
+ activity.maximum_duration = 5
36
+ end
37
+ act1.add_post_activities(act2)
38
+ # Duration type is initially set to the expected duration
39
+ act2.earliest_finish # => 5
40
+ # Change duration type to the maximum duration
41
+ act2.duration_type = Activity::MAXIMUM_DURATION
42
+ act2.earliest_finish # => 7
43
+
44
+ The allowed duration types are : EXPECTED_DURATION, MEAN_DURATION,
45
+ MINIMUM_DURATION and MAXIMUM_DURATION
46
+
47
+ * Moved the ActivityHash and ResourceHash into the Precedence::Utilities module.
48
+
49
+ * Added Activity.active_at?(time) which returns true if the activity is active at
50
+ time.
51
+
52
+ * Added Network.activities_at_time(time) which returns an array of activities
53
+ active at that time.
54
+
55
+ * Added Activity.active_during?(range) which returns true if the activity is active
56
+ during the time range given.
57
+
58
+ * Added Network.activities_during_time(range) which returns an array of activities
59
+ active during the range given.
60
+
61
+ * Added Network.each_time_period(tick,&block) which iterates over the duration
62
+ of the project in time steps of the tick parameter, yielding an array of
63
+ activities active at each time to the block.
64
+
65
+ * Removed the StartActivity and FinishActivity of the network from the
66
+ Network.activities hash. They are still avaialable in the hash if needed
67
+ precNetwork.activities['start']
68
+ precNetwork.activities['finish']
69
+ will return the StartActivity/FinishActivity however
70
+ precNetwork.activities.each
71
+ will not include them. I am still thinking of a way to get rid of them altogether.
72
+
73
+ * Added Network.reference_exists? which will return true if the reference is in the network.
74
+
75
+
76
+ = 0.7
77
+ * Added ability to load from and save networks to YAML files.
78
+
79
+ * Split StartFinishActivity into seperate StartActivity and FinishActivity
80
+ classes.
81
+
82
+ * Added StartActivity::REFERENCE and Network::START as well as
83
+ FinishActivity::REFERENCE and Network::FINISH as constants to hold the
84
+ reserved references for the start and finish activities in a network.
85
+
86
+ * Totally changed the way activities are created in both the Activity and
87
+ Network classes.
88
+ Activity.new(reference,duration,description,post_activities,pre_activities)
89
+ is now
90
+ Activity.new(reference) do |activity|
91
+ activity.duration = duration
92
+ activity.description = description
93
+ activity.add_post_activities(post_activities)
94
+ activity.add_pre_activities(pre_activities)
95
+ end
96
+
97
+ The same applies to the Network.new_activity method
98
+ Network.new_activity(reference,duration,description,post_activities,pre_activities)
99
+ has become
100
+ network.new_activity(reference) do |activity|
101
+ activity.duration = duration
102
+ activity.description = description
103
+ activity.add_pre_activities(pre_activities)
104
+ end
105
+ network.connect(reference,post_activities)
106
+ pre_activities.each do |pre_act_ref|
107
+ network.connect(pre_act_ref,reference)
108
+ end
109
+
110
+ In fact the block from his method is passed directly to the Activity.new
111
+ method. While you could use add_post_activities and add_pre_activities in this
112
+ block it is better to use Network.connect when dealing with the Network class.
113
+
114
+ * Added resources to activities. They can be set via the activity.resources hash
115
+
1
116
  = 0.6: Initial Release
2
117
  Basic precedence network functionality:
118
+
3
119
  * Earlist/latest start/finish
120
+
4
121
  * Generating float and determining critical path
122
+
5
123
  * Diagram generation via dot files
data/README CHANGED
@@ -16,14 +16,38 @@ Source can also be downloaded from http://rubyforge.org/projects/precedence.
16
16
 
17
17
  # Set up network
18
18
  net = Precedence::Network.new('Begin','End')
19
- net.new_activity('act-1-1',3,'System specification')
20
- net.new_activity('act-1-2',2,'Review')
21
- net.new_activity('act-1-3',2,'System re-specification')
22
- net.new_activity('act-2-1',3,'Test tool design')
23
- net.new_activity('act-2-2',5,'Test tool implementation')
24
- net.new_activity('act-3-1',3,'System design')
25
- net.new_activity('act-3-2',12,'System implementation')
26
- net.new_activity('act-2-3',10,'System testing')
19
+ net.new_activity('act-1-1') do |act|
20
+ act.duration = 3
21
+ act.description = 'System specification'
22
+ end
23
+ net.new_activity('act-1-2' do |act|
24
+ act.duratiom = 2
25
+ act.description = 'Review'
26
+ end
27
+ net.new_activity('act-1-3') do |act|
28
+ act.duration = 2
29
+ act.description = 'System re-specification'
30
+ end
31
+ net.new_activity('act-2-1') do |act|
32
+ act.duration = 3
33
+ act.description = 'Test tool design'
34
+ end
35
+ net.new_activity('act-2-2') do |act|
36
+ act.duration = 5
37
+ act.description = 'Test tool implementation'
38
+ end
39
+ net.new_activity('act-3-1')
40
+ act.duration = 3
41
+ act.description = 'System design'
42
+ end
43
+ net.new_activity('act-3-2') do |act|
44
+ act.duration = 12
45
+ act.description = 'System implementation'
46
+ end
47
+ net.new_activity('act-2-3') do |act|
48
+ act.duration = 10
49
+ act.description = 'System testing'
50
+ end
27
51
  net.connect('act-1-1','act-1-2')
28
52
  net.connect('act-1-2','act-1-3')
29
53
  net.connect('act-1-3','act-3-1')
@@ -35,7 +59,7 @@ Source can also be downloaded from http://rubyforge.org/projects/precedence.
35
59
  net.fix_connections!
36
60
 
37
61
  # Generate a diagram
38
- File.open('network.dot',File::CREAT|File::TRUNC|File::WRONLY) do|file|
62
+ File.open('network.dot',File::CREAT|File::TRUNC|File::WRONLY) do |file|
39
63
  file.puts(net.to_dot)
40
64
  end
41
65
  system("dot","-Tpng","-onetwork.png","network.dot")
@@ -47,6 +71,14 @@ Source can also be downloaded from http://rubyforge.org/projects/precedence.
47
71
  activity.latest_finish # => 5.0
48
72
  activity.total_float # => 0 - activities on the critical path have no float
49
73
 
74
+ # Save the network to a YAML file
75
+ File.open('network.yaml',File::CREAT|File::TRUNC|File::WRONLY do |file|
76
+ file.puts(net.to_yaml)
77
+ end
78
+
79
+ # Read the network from a YAML file
80
+ newNet = Precedence::Network.from_yaml(File.new('network.yaml',File::RDONLY))
81
+
50
82
  == Documentation
51
83
 
52
84
  The Precedence API online documentation is available at
data/TODO CHANGED
@@ -5,18 +5,23 @@ I plan on adding the following leading up to a 1.0 release
5
5
  == 0.7
6
6
 
7
7
  * Adding resource usage (money, coffee, bulldozers) to each activity.
8
+
8
9
  * Saving and loading precedence networks (probably using YAML).
9
10
 
10
11
  == 0.8
11
12
 
12
- * Adding an 'each_day' method to the network that will return the set of
13
- activities used on that day.
14
- * Calculating daily resource usage and generating some graphs from that.
13
+ * Adding a method to the network that will return the set of
14
+ activities used during each time period of the network.
15
+
16
+ * Calculating resource usage and generating some graphs from that.
15
17
 
16
18
  == 0.9
17
19
 
18
- * Generating Gantt charts
20
+ * network.critical_paths
21
+
22
+ * network.probabability_completed_by(time)
19
23
 
20
24
  == 1.0 and further
21
25
 
22
- * Some probability based reasoning using Beta/Normal distributions.
26
+ * Splitting up some functions into modules so they can be included in a variety
27
+ of objects