Revert "[perf] Add support for absolute and percentage alerts."

This reverts commit 2a74dcaf2a3eb86206dfd53c8c70727249033935.

Reason for revert: This is the wrong way to accomplish this. New CL incoming.

Original change's description:
> [perf] Add support for absolute and percentage alerts.
> 
> Bug: skia:8521
> Change-Id: Id2f70207b570551434ac7354cb052bc474712412
> Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/264639
> Reviewed-by: Ravi Mistry <rmistry@google.com>
> Commit-Queue: Joe Gregorio <jcgregorio@google.com>

TBR=rmistry@google.com,jcgregorio@google.com

Change-Id: Iad03d63fc347c7eb7887f0a1289fbd62f664b380
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:8521
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/265036
Reviewed-by: Joe Gregorio <jcgregorio@google.com>
Commit-Queue: Joe Gregorio <jcgregorio@google.com>
diff --git a/perf/Makefile b/perf/Makefile
index f5fa4fd..9114306 100644
--- a/perf/Makefile
+++ b/perf/Makefile
@@ -1,7 +1,6 @@
 .PHONY: build
-build:
+build: web ingest_json_validator
 	go install -v ./go/...
-	npx webpack-cli --mode=production
 
 buildk: web
 	CGO_ENABLED=0 GOOS=linux go install -a ./go/skiaperf
diff --git a/perf/go/absolute/absolute.go b/perf/go/absolute/absolute.go
deleted file mode 100644
index 636ea8b..0000000
--- a/perf/go/absolute/absolute.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package absolute
-
-import (
-	"go.skia.org/infra/go/sklog"
-	"go.skia.org/infra/go/vec32"
-	"go.skia.org/infra/perf/go/stepfit"
-)
-
-// GetStepFitAtMid takes one []float32 trace and calculates and returns a
-// StepFit.
-//
-// See StepFit for a description of the values being calculated.
-//
-// If percent is true then use delta as a percent difference, otherwise use
-// delta as an absolute difference between to two means.
-func GetStepFitAtMid(trace []float32, delta float32, percent bool) *stepfit.StepFit {
-	stepSize := float32(0)
-
-	i := len(trace) / 2
-	y0 := vec32.Mean(trace[:i])
-	y1 := vec32.Mean(trace[i:])
-
-	if y0 != y1 {
-		if percent {
-			y := vec32.Mean(trace)
-			stepSize = (y0 - y1) / (y)
-		} else {
-			stepSize = (y0 - y1)
-		}
-		sklog.Warningf("stepSize: %f", stepSize)
-	}
-	status := stepfit.UNINTERESTING
-	if stepSize >= delta {
-		status = stepfit.LOW
-	} else if stepSize <= -delta {
-		status = stepfit.HIGH
-	}
-	return &stepfit.StepFit{
-		LeastSquares: 0,
-		StepSize:     stepSize,
-		TurningPoint: i,
-		Regression:   stepSize,
-		Status:       status,
-	}
-}
diff --git a/perf/go/absolute/absolute_test.go b/perf/go/absolute/absolute_test.go
deleted file mode 100644
index 7330df6..0000000
--- a/perf/go/absolute/absolute_test.go
+++ /dev/null
@@ -1,151 +0,0 @@
-package absolute
-
-import (
-	"reflect"
-	"testing"
-
-	"go.skia.org/infra/go/testutils/unittest"
-	"go.skia.org/infra/perf/go/stepfit"
-)
-
-func TestGetStepFitAtMid(t *testing.T) {
-	unittest.SmallTest(t)
-	type args struct {
-		trace   []float32
-		delta   float32
-		percent bool
-	}
-	tests := []struct {
-		name string
-		args args
-		want *stepfit.StepFit
-	}{
-		{
-			name: "No step - absolute",
-			args: args{
-				trace:   []float32{1, 2, 1, 2},
-				delta:   1.0,
-				percent: false,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     0,
-				TurningPoint: 2,
-				Regression:   0,
-				Status:       stepfit.UNINTERESTING,
-			},
-		},
-		{
-			name: "No step - percent",
-			args: args{
-				trace:   []float32{1, 2, 1, 2},
-				delta:   1.0,
-				percent: true,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     0,
-				TurningPoint: 2,
-				Regression:   0,
-				Status:       stepfit.UNINTERESTING,
-			},
-		},
-		{
-			name: "Step - absolute - exact",
-			args: args{
-				trace:   []float32{1, 1, 2, 2},
-				delta:   1.0,
-				percent: false,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     -1.0,
-				TurningPoint: 2,
-				Regression:   -1.0,
-				Status:       stepfit.HIGH,
-			},
-		},
-		{
-			name: "No step - absolute - too small",
-			args: args{
-				trace:   []float32{1, 1, 1.5, 1.5},
-				delta:   1.0,
-				percent: false,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     -0.5,
-				TurningPoint: 2,
-				Regression:   -0.5,
-				Status:       stepfit.UNINTERESTING,
-			},
-		},
-		{
-			name: "Step - absolute - big - odd",
-			args: args{
-				trace:   []float32{1, 1, 4, 4, 4},
-				delta:   1.0,
-				percent: false,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     -3,
-				TurningPoint: 2,
-				Regression:   -3,
-				Status:       stepfit.HIGH,
-			},
-		},
-		{
-			name: "Step - percent - big - odd",
-			args: args{
-				trace:   []float32{1, 1, 4, 4, 4, 4},
-				delta:   0.10,
-				percent: true,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     -2.0 / 3.0,
-				TurningPoint: 3,
-				Regression:   -2.0 / 3.0,
-				Status:       stepfit.HIGH,
-			},
-		},
-		{
-			name: "Empty absolute",
-			args: args{
-				trace:   []float32{},
-				delta:   0.10,
-				percent: false,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     0,
-				TurningPoint: 0,
-				Regression:   0,
-				Status:       stepfit.UNINTERESTING,
-			},
-		},
-		{
-			name: "Empty percent",
-			args: args{
-				trace:   []float32{},
-				delta:   0.10,
-				percent: false,
-			},
-			want: &stepfit.StepFit{
-				LeastSquares: 0,
-				StepSize:     0,
-				TurningPoint: 0,
-				Regression:   0,
-				Status:       stepfit.UNINTERESTING,
-			},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := GetStepFitAtMid(tt.args.trace, tt.args.delta, tt.args.percent); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("GetStepFitAtMid() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
diff --git a/perf/go/regression/async.go b/perf/go/regression/async.go
index 9781ae5..491f983 100644
--- a/perf/go/regression/async.go
+++ b/perf/go/regression/async.go
@@ -69,7 +69,6 @@
 	TZ          string             `json:"tz"`
 	Algo        types.ClusterAlgo  `json:"algo"`
 	Interesting float32            `json:"interesting"`
-	Delta       float32            `json:"delta"` // Used by both absolute and percent Algos.
 	Sparse      bool               `json:"sparse"`
 	Type        ClusterRequestType `json:"type"`
 	N           int32              `json:"n"`
@@ -373,12 +372,7 @@
 		case types.KMEANS_ALGO:
 			summary, err = clustering2.CalculateClusterSummaries(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting)
 		case types.STEPFIT_ALGO:
-			summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting, p.request.Algo)
-		case types.ABSOLUTE_ALGO:
-			summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting, p.request.Algo)
-		case types.PERCENT_ALGO:
-			summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting, p.request.Algo)
-
+			summary, err = StepFit(df, k, config.MIN_STDDEV, p.clusterProgress, p.request.Interesting)
 		default:
 			p.reportError(skerr.Fmt("Invalid type of clustering: %s", p.request.Algo), "Invalid type of clustering.")
 		}
diff --git a/perf/go/regression/stepfit.go b/perf/go/regression/stepfit.go
index f22fbc9..da6bc30 100644
--- a/perf/go/regression/stepfit.go
+++ b/perf/go/regression/stepfit.go
@@ -3,16 +3,14 @@
 import (
 	"go.skia.org/infra/go/sklog"
 	"go.skia.org/infra/go/vec32"
-	"go.skia.org/infra/perf/go/absolute"
 	"go.skia.org/infra/perf/go/clustering2"
 	"go.skia.org/infra/perf/go/config"
 	"go.skia.org/infra/perf/go/dataframe"
 	"go.skia.org/infra/perf/go/stepfit"
-	"go.skia.org/infra/perf/go/types"
 )
 
 // StepFit finds regressions by looking at each trace individually and seeing if that looks like a regression.
-func StepFit(df *dataframe.DataFrame, k int, stddevThreshold float32, progress clustering2.Progress, interesting float32, algo types.ClusterAlgo) (*clustering2.ClusterSummaries, error) {
+func StepFit(df *dataframe.DataFrame, k int, stddevThreshold float32, progress clustering2.Progress, interesting float32) (*clustering2.ClusterSummaries, error) {
 	low := clustering2.NewClusterSummary()
 	high := clustering2.NewClusterSummary()
 	// Normalize each trace and then run through stepfit. If interesting then
@@ -23,14 +21,9 @@
 		if count%10000 == 0 {
 			sklog.Infof("stepfit count: %d", count)
 		}
-		var sf *stepfit.StepFit
-		if algo == types.STEPFIT_ALGO {
-			t := vec32.Dup(trace)
-			vec32.Norm(t, stddevThreshold)
-			sf = stepfit.GetStepFitAtMid(t, interesting)
-		} else {
-			sf = absolute.GetStepFitAtMid(trace, interesting, algo == types.PERCENT_ALGO)
-		}
+		t := vec32.Dup(trace)
+		vec32.Norm(t, stddevThreshold)
+		sf := stepfit.GetStepFitAtMid(t, interesting)
 
 		isLow := sf.Status == stepfit.LOW
 		isHigh := sf.Status == stepfit.HIGH
diff --git a/perf/go/regression/stepfit_test.go b/perf/go/regression/stepfit_test.go
index 846b446..c69a81c 100644
--- a/perf/go/regression/stepfit_test.go
+++ b/perf/go/regression/stepfit_test.go
@@ -63,7 +63,7 @@
 		df.ParamSet.AddParamsFromKey(key)
 	}
 
-	sum, err := StepFit(df, 4, 0.01, nil, 50, types.STEPFIT_ALGO)
+	sum, err := StepFit(df, 4, 0.01, nil, 50)
 	assert.NoError(t, err)
 	assert.NotNil(t, sum)
 	assert.Equal(t, 1, len(sum.Clusters))
diff --git a/perf/go/types/types.go b/perf/go/types/types.go
index f4338e6..76a121c 100644
--- a/perf/go/types/types.go
+++ b/perf/go/types/types.go
@@ -26,15 +26,12 @@
 //
 // Update algo-select-sk if this enum is changed.
 const (
-	KMEANS_ALGO   ClusterAlgo = "kmeans"   // Cluster traces using k-means clustering on their shapes.
-	STEPFIT_ALGO  ClusterAlgo = "stepfit"  // Look at each trace individually and determine if it steps up or down.
-	ABSOLUTE_ALGO ClusterAlgo = "absolute" // Look at each trace individually and determine if it steps up or down by some value.
-	PERCENT_ALGO  ClusterAlgo = "percent"  // Look at each trace individually and determine if it steps up or down by a certain percentage.
-
+	KMEANS_ALGO  ClusterAlgo = "kmeans"  // Cluster traces using k-means clustering on their shapes.
+	STEPFIT_ALGO ClusterAlgo = "stepfit" // Look at each trace individually and determing if it steps up or down.
 )
 
 var (
-	AllClusterAlgos = []ClusterAlgo{KMEANS_ALGO, STEPFIT_ALGO, ABSOLUTE_ALGO, PERCENT_ALGO}
+	AllClusterAlgos = []ClusterAlgo{KMEANS_ALGO, STEPFIT_ALGO}
 )
 
 func ToClusterAlgo(s string) (ClusterAlgo, error) {
diff --git a/perf/modules/alert-config-sk/alert-config-sk-demo.js b/perf/modules/alert-config-sk/alert-config-sk-demo.js
index 2c7b10a..1c51332 100644
--- a/perf/modules/alert-config-sk/alert-config-sk-demo.js
+++ b/perf/modules/alert-config-sk/alert-config-sk-demo.js
@@ -1,5 +1 @@
-window.sk = window.sk || {}
-window.sk.perf = window.sk.perf || {}
-window.sk.perf.key_order = [];
-
 import './index.js'
diff --git a/perf/modules/alert-config-sk/alert-config-sk.js b/perf/modules/alert-config-sk/alert-config-sk.js
index 18e1e37..dcd4b43 100644
--- a/perf/modules/alert-config-sk/alert-config-sk.js
+++ b/perf/modules/alert-config-sk/alert-config-sk.js
@@ -28,49 +28,49 @@
 const template = (ele) => html`
   <h3>Display Name</h3>
   <label for=display-name>Display Name</label>
-  <input id=display-name type=text .value=${ele._config.display_name} @change=${(e) => ele._config.display_name = e.target.value}>
+  <input id=display-name type=text .value=${ele._config.display_name} @change=${(e) => ele._config.display_name=e.target.value}>
   <h3>Category</h3>
   <label for=category>Alerts will be grouped by category.</label>
-  <input id=category type=text .value=${ele._config.category} @input=${(e) => ele._config.category = e.target.value}>
+  <input id=category type=text .value=${ele._config.category} @input=${(e) => ele._config.category=e.target.value}>
   <h3>Which traces should be monitored</h3>
-  <query-chooser-sk id=querychooser .paramset=${ele.paramset} .key_order=${ele.key_order} current_query=${ele._config.query} count_url='/_/count/' @query-change=${(e) => ele._config.query = e.detail.q}></query-chooser-sk>
+  <query-chooser-sk id=querychooser .paramset=${ele.paramset} .key_order=${ele.key_order} current_query=${ele._config.query} count_url='/_/count/' @query-change=${(e) => ele._config.query=e.detail.q}></query-chooser-sk>
   <h3>What triggers an alert</h3>
   <h4>Algorithm</h4>
-  <algo-select-sk algo=${ele._config.algo} @algo-change=${(e) => ele._config.algo = e.detail.algo}></algo-select-sk>
+  <algo-select-sk algo=${ele._config.algo} @algo-change=${(e) => ele._config.algo=e.detail.algo}></algo-select-sk>
   <h4>K</h4>
   <label for=k>The number of clusters. Only used in kmeans. 0 = use a server chosen value. (For Tail algorithm, K is the jump percentage.)</label>
-  <input id=k type=number min=0 .value=${ele._config.k} @input=${(e) => ele._config.k = +e.target.value}>
+  <input id=k type=number min=0 .value=${ele._config.k} @input=${(e) => ele._config.k=+e.target.value}>
   <h4>Radius</h4>
   <label for=radius>Number of commits on either side to consider. 0 = use a server chosen value. (For Tail algorithm, we only consider 2*Radius commits on the left side.)</label>
-  <input id=radius type=number min=0 .value=${ele._config.radius} @input=${(e) => ele._config.radius = +e.target.value}>
+  <input id=radius type=number min=0 .value=${ele._config.radius} @input=${(e) => ele._config.radius=+e.target.value}>
   <h4>Step Direction</h4>
-  <select-sk @selection-changed=${(e) => ele._config.direction = e.target.children[e.detail.selection].getAttribute('value')}>
+  <select-sk @selection-changed=${(e) => ele._config.direction=e.target.children[e.detail.selection].getAttribute('value')}>
     <!-- TODO(jcgregorio) Go back to using select-sk.selection once we've excised all Polymer. -->
     <div value=BOTH ?selected=${ele._config.direction === 'BOTH'} >Either step up or step down trigger an alert.</div>
     <div value=UP ?selected=${ele._config.direction === 'UP'}>Step up triggers an alert.</div>
     <div value=DOWN ?selected=${ele._config.direction === 'DOWN'}>Step down triggers an alert.</div>
   </select-sk>
   <h4>Threshold</h4>
-  <label for=threshold>Interesting Threshold for clusters to be interesting. This value is based on the Algorithm chosen. It is a Regression factor for K-Means and Stepfit, an absolute value for Absolute, and a percentage value (0.0 -> 1.0) for Percent.</label>
-  <input id=threshold .value=${ele._config.interesting} @input=${(e) => ele._config.interesting = +e.target.value}>
+  <label for=threshold>Interesting Threshold for clusters to be interesting. (Tail algorithm use this 1/Threshold as the min/max quantile.)</label>
+  <input id=threshold type=number min=1 max=500 .value=${ele._config.interesting} @input=${(e) => ele._config.interesting=+e.target.value}>
   <h4>Minimum</h4>
   <label for=min>Minimum number of interesting traces to trigger an alert.</label>
-  <input id=min type=number .value=${ele._config.minimum_num} @input=${(e) => ele._config.minimum_num = +e.target.value}>
+  <input id=min type=number .value=${ele._config.minimum_num} @input=${(e) => ele._config.minimum_num=+e.target.value}>
   <h4>Sparse</h4>
   <checkbox-sk ?checked=${ele._config.sparse} @input=${(e) => ele._config.sparse = e.target.checked} label='Data is sparse, so only include commits that have data.'></checkbox-sk>
   <h3>Where are alerts sent</h3>
   <label for=sent>Alert Destination: Comma separated list of email addresses.</label>
-  <input id=sent .value=${ele._config.alert} @input=${(e) => ele._config.alert = e.target.value}>
+  <input id=sent .value=${ele._config.alert} @input=${(e) => ele._config.alert=e.target.value}>
   <button @click=${ele._testAlert}>Test</button>
   <spinner-sk id=alertSpinner></spinner-sk>
   <h3>Where are bugs filed</h3>
   <label for=template>Bug URI Template: {cluster_url}, {commit_url}, and {message}.</label>
-  <input id=template .value=${ele._config.bug_uri_template} @input=${(e) => ele._config.bug_uri_template = e.target.value}>
+  <input id=template .value=${ele._config.bug_uri_template} @input=${(e) => ele._config.bug_uri_template=e.target.value}>
   <button @click=${ele._testBugTemplate}>Test</button>
   <spinner-sk id=bugSpinner></spinner-sk>
   <h3>Who owns this alert</h3>
   <label for=owner>Email address of owner.</label>
-  <input id=owner .value=${ele._config.owner} @input=${(e) => ele._config.owner = e.target.value}>
+  <input id=owner .value=${ele._config.owner} @input=${(e) => ele._config.owner=e.target.value}>
   <h3>Group By</h3>
   <label for=groupby>Group clusters by these parameters. (Multiselect)</label>
   <multi-select-sk
@@ -80,7 +80,7 @@
     ${_groupByChoices(ele)}
   </multi-select-sk>
   <h3>Status</h3>
-  <select-sk @selection-changed=${(e) => ele._config.state = e.target.children[e.detail.selection].getAttribute('value')}>
+  <select-sk @selection-changed=${(e) => ele._config.state=e.target.children[e.detail.selection].getAttribute('value')}>
     <div value=ACTIVE ?selected=${ele._config.state === 'ACTIVE'} title='Clusters that match this will generate alerts.'>Active</div>
     <div value=DELETED ?selected=${ele._config.state === 'DELETED'} title='Currently inactive.'>Deleted</div>
   </select-sk>
@@ -103,16 +103,14 @@
       owner: '',
       step_up_only: false,
       direction: 'BOTH',
-      radius: 10,
+      radius:  10,
       k: 50,
       group_by: '',
       sparse: false,
       minimum_num: 0,
       category: 'Experimental'
     };
-    if (sk) {
-      this._key_order = sk.perf.key_order;
-    }
+    this._key_order = sk.perf.key_order;
   }
 
   connectedCallback() {
@@ -132,7 +130,7 @@
     fetch('/_/alert/bug/try', {
       method: 'POST',
       body: JSON.stringify(body),
-      headers: {
+      headers:{
         'Content-Type': 'application/json'
       }
     }).then(jsonOrThrow).then((json) => {
@@ -155,7 +153,7 @@
     fetch('/_/alert/notify/try', {
       method: 'POST',
       body: JSON.stringify(body),
-      headers: {
+      headers:{
         'Content-Type': 'application/json'
       }
     }).then(jsonOrThrow).then((json) => {
diff --git a/perf/modules/algo-select-sk/algo-select-sk.js b/perf/modules/algo-select-sk/algo-select-sk.js
index dafade9..46cca52 100644
--- a/perf/modules/algo-select-sk/algo-select-sk.js
+++ b/perf/modules/algo-select-sk/algo-select-sk.js
@@ -32,8 +32,6 @@
   <select-sk @selection-changed=${ele._selectionChanged}>
     <div value=kmeans ?selected=${ele.algo === 'kmeans'} title="Use k-means clustering on the trace shapes.">K-Means</div>
     <div value=stepfit ?selected=${ele.algo === 'stepfit'} title="Only look for traces that step up or down at the selected commit.">StepFit</div>
-    <div value=absolute ?selected=${ele.algo === 'absolute'} title="Only look for traces that step up or down by a specific value.">Absolute</div>
-    <div value=percent ?selected=${ele.algo === 'percent'} title="Only look for traces that step up or down by some percentage.">Percent</div>
   </select-sk>
   `;