@decidables/detectable-elements 0.0.3

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/LICENSE.md +1112 -0
  3. package/README.md +1218 -0
  4. package/lib/detectableElements.esm.js +18385 -0
  5. package/lib/detectableElements.esm.js.map +1 -0
  6. package/lib/detectableElements.esm.min.js +13 -0
  7. package/lib/detectableElements.esm.min.js.map +1 -0
  8. package/lib/detectableElements.umd.js +18413 -0
  9. package/lib/detectableElements.umd.js.map +1 -0
  10. package/lib/detectableElements.umd.min.js +13 -0
  11. package/lib/detectableElements.umd.min.js.map +1 -0
  12. package/package.json +58 -0
  13. package/src/components/detectable-control.js +272 -0
  14. package/src/components/detectable-response.js +414 -0
  15. package/src/components/detectable-table.js +602 -0
  16. package/src/components/index.js +7 -0
  17. package/src/components/rdk-task.js +586 -0
  18. package/src/components/roc-space.js +1220 -0
  19. package/src/components/sdt-model.js +1835 -0
  20. package/src/detectable-element.js +121 -0
  21. package/src/equations/dc2far.js +182 -0
  22. package/src/equations/dc2hr.js +191 -0
  23. package/src/equations/facr2far.js +120 -0
  24. package/src/equations/hm2hr.js +121 -0
  25. package/src/equations/hmfacr2acc.js +161 -0
  26. package/src/equations/hrfar2c.js +179 -0
  27. package/src/equations/hrfar2d.js +162 -0
  28. package/src/equations/index.js +8 -0
  29. package/src/equations/sdt-equation.js +141 -0
  30. package/src/examples/double-interactive.js +171 -0
  31. package/src/examples/human.js +184 -0
  32. package/src/examples/index.js +6 -0
  33. package/src/examples/interactive.js +131 -0
  34. package/src/examples/model.js +203 -0
  35. package/src/examples/sdt-example.js +76 -0
  36. package/src/examples/unequal.js +43 -0
  37. package/src/index.js +6 -0
@@ -0,0 +1,121 @@
1
+
2
+ import {html} from 'lit';
3
+
4
+ import '@decidables/decidables-elements/spinner';
5
+ import SDTMath from '@decidables/detectable-math';
6
+
7
+ import SDTEquation from './sdt-equation';
8
+
9
+ /*
10
+ SDTEquationHM2Hr element
11
+ <sdt-equation-hm2hr>
12
+
13
+ Attributes:
14
+ Hits; Misses; Hit Rate;
15
+ */
16
+ export default class SDTEquationHM2Hr extends SDTEquation {
17
+ static get properties() {
18
+ return {
19
+ h: {
20
+ attribute: 'hits',
21
+ type: Number,
22
+ reflect: true,
23
+ },
24
+ m: {
25
+ attribute: 'misses',
26
+ type: Number,
27
+ reflect: true,
28
+ },
29
+ hr: {
30
+ attribute: false,
31
+ type: Number,
32
+ reflect: false,
33
+ },
34
+ };
35
+ }
36
+
37
+ constructor() {
38
+ super();
39
+ this.h = 0;
40
+ this.m = 0;
41
+ this.alignState();
42
+ }
43
+
44
+ alignState() {
45
+ this.hr = SDTMath.hM2Hr(this.h, this.m);
46
+ }
47
+
48
+ sendEvent() {
49
+ this.dispatchEvent(new CustomEvent('sdt-equation-hm2hr-change', {
50
+ detail: {
51
+ h: this.h,
52
+ m: this.m,
53
+ hr: this.hr,
54
+ },
55
+ bubbles: true,
56
+ }));
57
+ }
58
+
59
+ hInput(event) {
60
+ this.h = parseInt(event.target.value, 10);
61
+ this.alignState();
62
+ this.sendEvent();
63
+ }
64
+
65
+ mInput(event) {
66
+ this.m = parseInt(event.target.value, 10);
67
+ this.alignState();
68
+ this.sendEvent();
69
+ }
70
+
71
+ render() {
72
+ this.alignState();
73
+ let h;
74
+ let m;
75
+ let hr;
76
+ if (this.numeric) {
77
+ h = html`
78
+ <decidables-spinner class="h" ?disabled=${!this.interactive} min="0" .value="${this.h}" @input=${this.hInput.bind(this)}>
79
+ <var>Hits</var>
80
+ </decidables-spinner>
81
+ `;
82
+ m = html`
83
+ <decidables-spinner class="m" ?disabled=${!this.interactive} min="0" .value="${this.m}" @input=${this.mInput.bind(this)}>
84
+ <var>Misses</var>
85
+ </decidables-spinner>
86
+ `;
87
+ hr = html`
88
+ <decidables-spinner class="hr" disabled min="0" max="1" step=".001" .value="${+this.hr.toFixed(3)}">
89
+ <var>Hit Rate</var>
90
+ </decidables-spinner>
91
+ `;
92
+ } else {
93
+ h = html`<var class="h">Hits</var>`;
94
+ m = html`<var class="m">Misses</var>`;
95
+ hr = html`<var class="hr">Hit Rate</var>`;
96
+ }
97
+ return html`
98
+ <div class="holder">
99
+ <table class="equation">
100
+ <tbody>
101
+ <tr>
102
+ <td rowspan="2">
103
+ ${hr}<span class="equals">=</span>
104
+ </td>
105
+ <td class="underline">
106
+ ${h}
107
+ </td>
108
+ </tr>
109
+ <tr>
110
+ <td>
111
+ ${h}<span class="plus">+</span>${m}
112
+ </td>
113
+ </tr>
114
+ </tbody>
115
+ </table>
116
+ </div>
117
+ `;
118
+ }
119
+ }
120
+
121
+ customElements.define('sdt-equation-hm2hr', SDTEquationHM2Hr);
@@ -0,0 +1,161 @@
1
+
2
+ import {html} from 'lit';
3
+
4
+ import '@decidables/decidables-elements/spinner';
5
+ import SDTMath from '@decidables/detectable-math';
6
+
7
+ import SDTEquation from './sdt-equation';
8
+
9
+ /*
10
+ SDTEquationHMFaCr2Acc element
11
+ <sdt-equation-hmfacr2acc>
12
+
13
+ Attributes:
14
+ Hits; Misses; False Alarms; Correct Rejections; Accuracy;
15
+ */
16
+ export default class SDTEquationHMFaCr2Acc extends SDTEquation {
17
+ static get properties() {
18
+ return {
19
+ h: {
20
+ attribute: 'hits',
21
+ type: Number,
22
+ reflect: true,
23
+ },
24
+ m: {
25
+ attribute: 'misses',
26
+ type: Number,
27
+ reflect: true,
28
+ },
29
+ fa: {
30
+ attribute: 'false-alarms',
31
+ type: Number,
32
+ reflect: true,
33
+ },
34
+ cr: {
35
+ attribute: 'correct-rejections',
36
+ type: Number,
37
+ reflect: true,
38
+ },
39
+ acc: {
40
+ attribute: false,
41
+ type: Number,
42
+ reflect: false,
43
+ },
44
+ };
45
+ }
46
+
47
+ constructor() {
48
+ super();
49
+ this.h = 0;
50
+ this.m = 0;
51
+ this.fa = 0;
52
+ this.cr = 0;
53
+ this.alignState();
54
+ }
55
+
56
+ alignState() {
57
+ this.acc = SDTMath.hMFaCr2Acc(this.h, this.m, this.fa, this.cr);
58
+ }
59
+
60
+ sendEvent() {
61
+ this.dispatchEvent(new CustomEvent('sdt-equation-hmfacr2acc-change', {
62
+ detail: {
63
+ h: this.h,
64
+ m: this.m,
65
+ fa: this.fa,
66
+ cr: this.cr,
67
+ acc: this.acc,
68
+ },
69
+ bubbles: true,
70
+ }));
71
+ }
72
+
73
+ hInput(event) {
74
+ this.h = parseInt(event.target.value, 10);
75
+ this.alignState();
76
+ this.sendEvent();
77
+ }
78
+
79
+ mInput(event) {
80
+ this.m = parseInt(event.target.value, 10);
81
+ this.alignState();
82
+ this.sendEvent();
83
+ }
84
+
85
+ faInput(event) {
86
+ this.fa = parseInt(event.target.value, 10);
87
+ this.alignState();
88
+ this.sendEvent();
89
+ }
90
+
91
+ crInput(event) {
92
+ this.cr = parseInt(event.target.value, 10);
93
+ this.alignState();
94
+ this.sendEvent();
95
+ }
96
+
97
+ render() {
98
+ this.alignState();
99
+ let h;
100
+ let m;
101
+ let fa;
102
+ let cr;
103
+ let acc;
104
+
105
+ if (this.numeric) {
106
+ h = html`
107
+ <decidables-spinner class="h" ?disabled=${!this.interactive} min="0" .value="${this.h}" @input=${this.hInput.bind(this)}>
108
+ <var>Hits</var>
109
+ </decidables-spinner>
110
+ `;
111
+ m = html`
112
+ <decidables-spinner class="m" ?disabled=${!this.interactive} min="0" .value="${this.m}" @input=${this.mInput.bind(this)}>
113
+ <var>Misses</var>
114
+ </decidables-spinner>
115
+ `;
116
+ fa = html`
117
+ <decidables-spinner class="fa" ?disabled=${!this.interactive} min="0" .value="${this.fa}" @input=${this.faInput.bind(this)}>
118
+ <var>False Alarms</var>
119
+ </decidables-spinner>
120
+ `;
121
+ cr = html`
122
+ <decidables-spinner class="cr" ?disabled=${!this.interactive} min="0" .value="${this.cr}" @input=${this.crInput.bind(this)}>
123
+ <var>Correct Rejections</var>
124
+ </decidables-spinner>
125
+ `;
126
+ acc = html`
127
+ <decidables-spinner class="acc" disabled min="0" max="1" step=".001" .value="${+this.acc.toFixed(3)}">
128
+ <var>Accuracy</var>
129
+ </decidables-spinner>
130
+ `;
131
+ } else {
132
+ h = html`<var class="h">Hits</var>`;
133
+ m = html`<var class="m">Misses</var>`;
134
+ fa = html`<var class="fa">False Alarms</var>`;
135
+ cr = html`<var class="cr">Correct Rejections</var>`;
136
+ acc = html`<var class="acc">Accuracy</var>`;
137
+ }
138
+ return html`
139
+ <div class="holder">
140
+ <table class="equation">
141
+ <tbody>
142
+ <tr>
143
+ <td rowspan="2">
144
+ ${acc}<span class="equals">=</span>
145
+ </td>
146
+ <td class="underline">
147
+ ${h}<span class="plus">+</span>${cr}
148
+ </td>
149
+ </tr>
150
+ <tr>
151
+ <td>
152
+ ${h}<span class="plus">+</span>${m}<span class="plus">+</span>${fa}<span class="plus">+</span>${cr}
153
+ </td>
154
+ </tr>
155
+ </tbody>
156
+ </table>
157
+ </div>`;
158
+ }
159
+ }
160
+
161
+ customElements.define('sdt-equation-hmfacr2acc', SDTEquationHMFaCr2Acc);
@@ -0,0 +1,179 @@
1
+
2
+ import {html} from 'lit';
3
+
4
+ import '@decidables/decidables-elements/spinner';
5
+ import SDTMath from '@decidables/detectable-math';
6
+
7
+ import SDTEquation from './sdt-equation';
8
+
9
+ /*
10
+ SDTEquationHrFar2C element
11
+ <sdt-equation-hrfar2c>
12
+
13
+ Attributes:
14
+ Hit Rate; False Alarm Rate; d';
15
+ */
16
+ export default class SDTEquationHrFar2C extends SDTEquation {
17
+ static get properties() {
18
+ return {
19
+ unequal: {
20
+ attribute: 'unequal',
21
+ type: Boolean,
22
+ reflect: true,
23
+ },
24
+ hr: {
25
+ attribute: 'hit-rate',
26
+ type: Number,
27
+ reflect: true,
28
+ },
29
+ far: {
30
+ attribute: 'false-alarm-rate',
31
+ type: Number,
32
+ reflect: true,
33
+ },
34
+ s: {
35
+ attribute: 's',
36
+ type: Number,
37
+ reflect: true,
38
+ },
39
+
40
+ c: {
41
+ attribute: false,
42
+ type: Number,
43
+ reflect: false,
44
+ },
45
+ };
46
+ }
47
+
48
+ constructor() {
49
+ super();
50
+ this.unequal = false;
51
+ this.hr = 0;
52
+ this.far = 0;
53
+ this.s = 1;
54
+ this.alignState();
55
+ }
56
+
57
+ alignState() {
58
+ this.c = SDTMath.hrFar2C(this.hr, this.far, this.s);
59
+ }
60
+
61
+ sendEvent() {
62
+ this.dispatchEvent(new CustomEvent('sdt-equation-hrfar2c-change', {
63
+ detail: {
64
+ hr: this.hr,
65
+ far: this.far,
66
+ s: this.s,
67
+ c: this.c,
68
+ },
69
+ bubbles: true,
70
+ }));
71
+ }
72
+
73
+ hrInput(event) {
74
+ this.hr = parseFloat(event.target.value);
75
+ this.alignState();
76
+ this.sendEvent();
77
+ }
78
+
79
+ farInput(event) {
80
+ this.far = parseFloat(event.target.value);
81
+ this.alignState();
82
+ this.sendEvent();
83
+ }
84
+
85
+ sInput(event) {
86
+ this.s = parseFloat(event.target.value);
87
+ this.alignState();
88
+ this.sendEvent();
89
+ }
90
+
91
+ render() {
92
+ this.alignState();
93
+ let hr;
94
+ let far;
95
+ let s;
96
+ let c;
97
+ if (this.numeric) {
98
+ hr = html`
99
+ <decidables-spinner class="hr bottom" ?disabled=${!this.interactive} min="0" max="1" step=".001" .value="${this.hr}" @input=${this.hrInput.bind(this)}>
100
+ <var>Hit Rate</var>
101
+ </decidables-spinner>
102
+ `;
103
+ far = html`
104
+ <decidables-spinner class="far bottom" ?disabled=${!this.interactive} min="0" max="1" step=".001" .value="${this.far}" @input=${this.farInput.bind(this)}>
105
+ <var>False Alarm Rate</var>
106
+ </decidables-spinner>
107
+ `;
108
+ s = html`
109
+ <decidables-spinner class="s bottom" ?disabled=${!this.interactive} min="0" step=".001" .value="${this.s}" @input=${this.sInput.bind(this)}>
110
+ <var class="math-var">σ</var>
111
+ </decidables-spinner>
112
+ `;
113
+ c = html`
114
+ <decidables-spinner class="c bottom" disabled step=".001" .value="${+this.c.toFixed(3)}">
115
+ <var class="math-var">c</var>
116
+ </decidables-spinner>
117
+ `;
118
+ } else {
119
+ hr = html`<var class="hr">Hit Rate</var>`;
120
+ far = html`<var class="far">False Alarm Rate</var>`;
121
+ s = html`<var class="math-var s">σ</var>`;
122
+ c = html`<var class="math-var c">c</var>`;
123
+ }
124
+ let equation;
125
+ if (this.unequal) {
126
+ equation = html`
127
+ <tr>
128
+ <td rowspan="2">
129
+ ${c}<span class="equals">=</span><span class="bracket tight">(</span>
130
+ </td>
131
+ <td class="underline bottom">
132
+ <span>1</span><span class="plus tight">+</span><span>${s}<sup class="exp">2</sup></span>
133
+ </td>
134
+ <td rowspan="2">
135
+ <span class="bracket tight">)<sup class="exp">−½</sup></span><span class="bracket tight">(</span>
136
+ </td>
137
+ <td class="underline bottom">
138
+ <span class="minus tight">−</span>${s}
139
+ </td>
140
+ <td rowspan="2">
141
+ <span class="bracket tight">)</span><span class="bracket">[</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${hr}<span class="paren tight">)</span><span class="plus">+</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${far}<span class="paren tight">)</span><span class="bracket">]</span>
142
+ </td>
143
+ </tr>
144
+ <tr>
145
+ <td>
146
+ <span>2</span>
147
+ </td>
148
+ <td>
149
+ <span><span>1</span><span class="plus">+</span>${s}</span>
150
+ </td>
151
+ </tr>`;
152
+ } else {
153
+ equation = html`
154
+ <tr>
155
+ <td rowspan="2">
156
+ ${c}<span class="equals">=</span>
157
+ </td>
158
+ <td class="underline">
159
+ <span class="minus tight">−</span><span class="bracket tight">[</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${hr}<span class="paren tight">)</span><span class="plus">+</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${far}<span class="paren tight">)</span><span class="bracket tight">]</span>
160
+ </td>
161
+ </tr>
162
+ <tr>
163
+ <td>
164
+ <span>2</span>
165
+ </td>
166
+ </tr>`;
167
+ }
168
+ return html`
169
+ <div class="holder">
170
+ <table class="equation">
171
+ <tbody>
172
+ ${equation}
173
+ </tbody>
174
+ </table>
175
+ </div>`;
176
+ }
177
+ }
178
+
179
+ customElements.define('sdt-equation-hrfar2c', SDTEquationHrFar2C);
@@ -0,0 +1,162 @@
1
+
2
+ import {html} from 'lit';
3
+
4
+ import '@decidables/decidables-elements/spinner';
5
+ import SDTMath from '@decidables/detectable-math';
6
+
7
+ import SDTEquation from './sdt-equation';
8
+
9
+ /*
10
+ SDTEquationHrFar2D element
11
+ <sdt-equation-hrfar2d>
12
+
13
+ Attributes:
14
+ Hit Rate; False Alarm Rate; d';
15
+ */
16
+ export default class SDTEquationHrFar2D extends SDTEquation {
17
+ static get properties() {
18
+ return {
19
+ unequal: {
20
+ attribute: 'unequal',
21
+ type: Boolean,
22
+ reflect: true,
23
+ },
24
+ hr: {
25
+ attribute: 'hit-rate',
26
+ type: Number,
27
+ reflect: true,
28
+ },
29
+ far: {
30
+ attribute: 'false-alarm-rate',
31
+ type: Number,
32
+ reflect: true,
33
+ },
34
+ s: {
35
+ attribute: 's',
36
+ type: Number,
37
+ reflect: true,
38
+ },
39
+
40
+ d: {
41
+ attribute: false,
42
+ type: Number,
43
+ reflect: false,
44
+ },
45
+ };
46
+ }
47
+
48
+ constructor() {
49
+ super();
50
+ this.unequal = false;
51
+ this.hr = 0;
52
+ this.far = 0;
53
+ this.s = 1;
54
+ this.alignState();
55
+ }
56
+
57
+ alignState() {
58
+ this.d = SDTMath.hrFar2D(this.hr, this.far, this.s);
59
+ }
60
+
61
+ sendEvent() {
62
+ this.dispatchEvent(new CustomEvent('sdt-equation-hrfar2d-change', {
63
+ detail: {
64
+ hr: this.hr,
65
+ far: this.far,
66
+ s: this.s,
67
+ d: this.d,
68
+ },
69
+ bubbles: true,
70
+ }));
71
+ }
72
+
73
+ hrInput(event) {
74
+ this.hr = parseFloat(event.target.value);
75
+ this.alignState();
76
+ this.sendEvent();
77
+ }
78
+
79
+ farInput(event) {
80
+ this.far = parseFloat(event.target.value);
81
+ this.alignState();
82
+ this.sendEvent();
83
+ }
84
+
85
+ sInput(event) {
86
+ this.s = parseFloat(event.target.value);
87
+ this.alignState();
88
+ this.sendEvent();
89
+ }
90
+
91
+ render() {
92
+ this.alignState();
93
+ let hr;
94
+ let far;
95
+ let s;
96
+ let d;
97
+ if (this.numeric) {
98
+ hr = html`
99
+ <decidables-spinner class="hr bottom" ?disabled=${!this.interactive} min="0" max="1" step=".001" .value="${this.hr}" @input=${this.hrInput.bind(this)}>
100
+ <var>Hit Rate</var>
101
+ </decidables-spinner>
102
+ `;
103
+ far = html`
104
+ <decidables-spinner class="far bottom" ?disabled=${!this.interactive} min="0" max="1" step=".001" .value="${this.far}" @input=${this.farInput.bind(this)}>
105
+ <var>False Alarm Rate</var>
106
+ </decidables-spinner>
107
+ `;
108
+ s = html`
109
+ <decidables-spinner class="s bottom" ?disabled=${!this.interactive} min="0" step=".001" .value="${this.s}" @input=${this.sInput.bind(this)}>
110
+ <var class="math-var">σ</var>
111
+ </decidables-spinner>
112
+ `;
113
+ d = html`
114
+ <decidables-spinner class="d bottom" disabled step=".001" .value="${+this.d.toFixed(3)}">
115
+ <var class="math-var">d′</var>
116
+ </decidables-spinner>
117
+ `;
118
+ } else {
119
+ hr = html`<var class="hr">Hit Rate</var>`;
120
+ far = html`<var class="far">False Alarm Rate</var>`;
121
+ s = html`<var class="math-var s">σ</var>`;
122
+ d = html`<var class="math-var d">d′</var>`;
123
+ }
124
+ let equation;
125
+ if (this.unequal) {
126
+ equation = html`
127
+ <tr>
128
+ <td rowspan="2">
129
+ ${d}<span class="equals">=</span><span class="bracket tight">(</span>
130
+ </td>
131
+ <td class="underline bottom">
132
+ <span>1</span><span class="plus tight">+</span><span>${s}<sup class="exp">2</sup></span>
133
+ </td>
134
+ <td rowspan="2">
135
+ <span class="bracket tight">)<sup class="exp">−½</sup></span><span class="bracket">[</span>${s}<span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${hr}<span class="paren tight">)</span><span class="minus">−</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${far}<span class="paren tight">)</span><span class="bracket">]</span>
136
+ </td>
137
+ </tr>
138
+ <tr>
139
+ <td>
140
+ <span>2</span>
141
+ </td>
142
+ </tr>`;
143
+ } else {
144
+ equation = html`
145
+ <tr>
146
+ <td>
147
+ ${d}<span class="equals">=</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${hr}<span class="paren tight">)</span><span class="minus">−</span><span class="tight"><var class="math-greek phi tight">Φ</var><sup class="exp">−1</sup></span><span class="paren tight">(</span>${far}<span class="paren tight">)</span>
148
+ </td>
149
+ </tr>`;
150
+ }
151
+ return html`
152
+ <div class="holder">
153
+ <table class="equation">
154
+ <tbody>
155
+ ${equation}
156
+ </tbody>
157
+ </table>
158
+ </div>`;
159
+ }
160
+ }
161
+
162
+ customElements.define('sdt-equation-hrfar2d', SDTEquationHrFar2D);
@@ -0,0 +1,8 @@
1
+
2
+ export {default as SDTEquationDC2Far} from './dc2far';
3
+ export {default as SDTEquationDC2Hr} from './dc2hr';
4
+ export {default as SDTEquationFaCr2Far} from './facr2far';
5
+ export {default as SDTEquationHM2Hr} from './hm2hr';
6
+ export {default as SDTEquationHMFaCr2Acc} from './hmfacr2acc';
7
+ export {default as SDTEquationHrFar2C} from './hrfar2c';
8
+ export {default as SDTEquationHrFar2D} from './hrfar2d';