diff --git a/projectnetwork.go b/projectnetwork.go index 1ae1f1d..e15e58d 100644 --- a/projectnetwork.go +++ b/projectnetwork.go @@ -27,18 +27,22 @@ import ( "gonum.org/v1/gonum/graph/topo" ) +// projectNetwork is a directed graph of activity nodes type projectNetwork struct { *simple.DirectedGraph } +// newProjectNetwork is a constructor for a projectNetwork func newProjectNetwork() *projectNetwork { return &projectNetwork{DirectedGraph: simple.NewDirectedGraph()} } +// NewNode returns an activity node func (g *projectNetwork) NewNode() graph.Node { return &activity{Node: g.DirectedGraph.NewNode()} } +// calculateTimes computes the times for each activity in g func (g *projectNetwork) calculateTimes() error { sorted, err := topo.Sort(g) if err != nil { @@ -56,12 +60,15 @@ func (g *projectNetwork) calculateTimes() error { return nil } +// forwardPass computes the early times for each activity func (g *projectNetwork) forwardPass(toposort []*activity) { for _, a := range toposort { g.setEarlyTimes(a) } } +// backwardPass computes the late times and slack for each activity using the +// early times func (g *projectNetwork) backwardPass(toposort []*activity) { n := len(toposort) @@ -75,6 +82,7 @@ func (g *projectNetwork) backwardPass(toposort []*activity) { } } +// setEarlyTimes sets the early times for an activity func (g *projectNetwork) setEarlyTimes(a *activity) { es := 0.0 predecessors := g.To(a.ID()) @@ -86,6 +94,7 @@ func (g *projectNetwork) setEarlyTimes(a *activity) { a.earlyFinish = a.earlyStart + a.duration } +// setLateTimes sets the late times for an activity func (g *projectNetwork) setLateTimes(a *activity) { lf := math.Inf(1) successors := g.From(a.ID()) @@ -98,6 +107,7 @@ func (g *projectNetwork) setLateTimes(a *activity) { a.slack = a.lateFinish - a.earlyFinish } +// an activity represents a task in the project network type activity struct { graph.Node dotID string @@ -109,6 +119,7 @@ type activity struct { slack float64 } +// Attributes returns all the activity attributes to include in the DOT file func (a *activity) Attributes() []encoding.Attribute { return []encoding.Attribute{ {"DUR", strconv.FormatFloat(a.duration, 'f', 2, 64)}, @@ -120,6 +131,7 @@ func (a *activity) Attributes() []encoding.Attribute { } } +// SetAttribute permits reading the duration from the DOT file func (a *activity) SetAttribute(attr encoding.Attribute) error { var err error switch attr.Key { @@ -131,10 +143,12 @@ func (a *activity) SetAttribute(attr encoding.Attribute) error { return err } +// DOTID returns the DOTID of the activity func (a *activity) DOTID() string { return a.dotID } +// SetDOTID sets the DOT ID of the activity func (a *activity) SetDOTID(id string) { a.dotID = id }