Chromium Code Reviews| Index: golden/go/analysis/analysis.go |
| diff --git a/golden/go/analysis/analysis.go b/golden/go/analysis/analysis.go |
| index ede75ef81bb61ee232d13f56b865c0f9c3294238..7123f2db449be2b09549d2ecfa98a3ee2a1774a0 100644 |
| --- a/golden/go/analysis/analysis.go |
| +++ b/golden/go/analysis/analysis.go |
| @@ -17,10 +17,10 @@ import ( |
| // Stores a Trace with labels and digests in memory. CommitIds, Digests and |
| // Labels are of the same length, identical indices refer to the same digest. |
| type LabeledTrace struct { |
| - Params map[string]string `json:"params"` |
| - CommitIds []int `json:"commitIds"` |
| - Digests []string `json:"digests"` |
| - Labels []types.Label `json:"labels` |
| + Params map[string]string |
| + CommitIds []int |
| + Digests []string |
| + Labels []types.Label |
| } |
| func NewLabeledTrace(params map[string]string, capacity int) *LabeledTrace { |
| @@ -41,12 +41,14 @@ func (lt *LabeledTrace) addLabeledDigests(commitIds []int, digests []string, lab |
| // Aggregates the Traces in tile and provides the commits that the |
| // CommitIds in LabeledTrace refer to. |
| +// LabeledTile and LabeledTrace are used to store the cannonical information |
| +// extracted from the tiles. The (redundant) output data is derived from these. |
| type LabeledTile struct { |
| - Commits []*ptypes.Commit `json:"commits"` |
| + Commits []*ptypes.Commit |
| // Traces are indexed by the primary key (test name). This is somewhat |
| // redundant, but this also output format. |
| - Traces map[string][]*LabeledTrace `json:"traces"` |
| + Traces map[string][]*LabeledTrace |
| } |
| func NewLabeledTile() *LabeledTile { |
| @@ -81,6 +83,29 @@ func (t *LabeledTile) getLabeledTrace(trace ptypes.Trace) (string, *LabeledTrace |
| return pKey, newLT |
| } |
| +// GUITileCounts is an output type for the aggregated label counts. |
| +// The tupples in Counts store: untriaged, positive, negatives |
| +type GUITileCounts struct { |
| + Commits []*ptypes.Commit `json:"commits"` |
| + Counts map[string][][3]int64 `json:"counts"` |
|
jcgregorio
2014/10/17 18:07:52
[3]int64 is a little ambiguous as far as figuring
stephana
2014/10/17 20:01:45
Done.
|
| +} |
| + |
| +// GUITestCounts is an output type for a single test that contains the |
| +// aggregated counts over all traces and invidual trace labels. |
| +type GUITestCounts struct { |
| + Commits []*ptypes.Commit `json:"commits"` |
| + Aggregated [][3]int64 `json:"aggregated"` |
| + Traces []*GUILabeledTrace `json:"traces"` |
| +} |
| + |
| +// GUILabeledTrace is an output type for the labels of a trace. |
| +type GUILabeledTrace struct { |
| + Params map[string]string `json:"params"` |
| + |
| + // Contains (commitId, lable) pairs. |
| + Labels [][2]uint64 `json:"labels"` |
|
jcgregorio
2014/10/17 18:07:52
Why not map[int64]int64 or []struct{ ID int64, Lab
stephana
2014/10/17 20:01:45
Done.
|
| +} |
| + |
| // Analyzer continuously manages the tasks, like pollint for new traces |
| // on disk, etc. |
| type Analyzer struct { |
| @@ -88,9 +113,15 @@ type Analyzer struct { |
| diffStore diff.DiffStore |
| tileStore ptypes.TileStore |
| + // Canonical data structure to hold our information about commits, digests |
| + // and labels. |
| currentTile *LabeledTile |
| - // Lock to protect the expectations and the current labeled tile. |
| + // Output data structures that are derived from currentTile. |
| + currentTileCounts *GUITileCounts |
| + currentTestCounts map[string]*GUITestCounts |
| + |
| + // Lock to protect the expectations and current* variables. |
| mutex sync.Mutex |
| } |
| @@ -110,18 +141,18 @@ func NewAnalyzer(expStore expstorage.ExpectationsStore, tileStore ptypes.TileSto |
| // Returns an entire Tile which is a collection of 'traces' over a series of |
| // of commits. Each trace contains the digests and their labels based on |
| // out knowledge base about digests (expectations). |
| -func (a *Analyzer) GetLabeledTile() *LabeledTile { |
| +func (a *Analyzer) GetTileCounts() (*GUITileCounts, error) { |
| a.mutex.Lock() |
| defer a.mutex.Unlock() |
| - return a.currentTile |
| + return a.currentTileCounts, nil |
| } |
| -func (a *Analyzer) GetLabeledTraces(testName string) []*LabeledTrace { |
| +func (a *Analyzer) GetTestCounts(testName string) (*GUITestCounts, error) { |
| a.mutex.Lock() |
| defer a.mutex.Unlock() |
| - return a.currentTile.Traces[testName] |
| + return a.currentTestCounts[testName], nil |
| } |
| func (a *Analyzer) SetDigestLabels(labeledTestDigests map[string]types.TestClassification, userId string) (map[string][]*LabeledTrace, error) { |
| @@ -160,8 +191,12 @@ func (a *Analyzer) loop(timeBetweenPolls time.Duration) { |
| errorTileLoadingCounter.Inc(1) |
| } else { |
| newLabeledTile := a.processTile(tile) |
| + newTileCounts, newTestCounts := a.getOutputCounts(newLabeledTile) |
| + |
| a.mutex.Lock() |
| a.currentTile = newLabeledTile |
| + a.currentTileCounts = newTileCounts |
| + a.currentTestCounts = newTestCounts |
| a.mutex.Unlock() |
| } |
| runsCounter.Inc(1) |
| @@ -248,3 +283,45 @@ func (a *Analyzer) labelDigests(testName string, digests []string, targetLabels |
| return nil |
| } |
| + |
| +// Derive the output counts from the given labeled tile. |
| +func (a *Analyzer) getOutputCounts(labeledTile *LabeledTile) (*GUITileCounts, map[string]*GUITestCounts) { |
| + // Stores the aggregated counts of a tile for each test. |
| + tileCountsMap := make(map[string][][3]int64, len(labeledTile.Traces)) |
| + |
| + // Stores the aggregated counts for each test and individual trace information. |
| + testCountsMap := make(map[string]*GUITestCounts, len(labeledTile.Traces)) |
| + |
| + for testName, testTraces := range labeledTile.Traces { |
| + acc := make([][3]int64, len(labeledTile.Commits)) |
| + tempTraces := make([]*GUILabeledTrace, 0, len(testTraces)) |
| + |
| + for _, oneTrace := range testTraces { |
| + tempTrace := &GUILabeledTrace{ |
| + Params: oneTrace.Params, |
| + Labels: make([][2]uint64, len(oneTrace.CommitIds)), |
| + } |
| + |
| + for i, ci := range oneTrace.CommitIds { |
| + // Increment the tuple element based on Label constant values. |
| + acc[ci][oneTrace.Labels[i]]++ |
| + tempTrace.Labels[i][0] = uint64(ci) |
| + tempTrace.Labels[i][1] = uint64(oneTrace.Labels[i]) |
| + } |
| + } |
| + |
| + tileCountsMap[testName] = acc |
| + testCountsMap[testName] = &GUITestCounts{ |
| + Commits: labeledTile.Commits, |
| + Aggregated: acc, |
| + Traces: tempTraces, |
| + } |
| + } |
| + |
| + tileCounts := &GUITileCounts{ |
| + Commits: labeledTile.Commits, |
| + Counts: tileCountsMap, |
| + } |
| + |
| + return tileCounts, testCountsMap |
| +} |