@euconform/core 1.0.0 → 1.0.1

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 (42) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-check-types.log +4 -0
  3. package/.turbo/turbo-test.log +364 -0
  4. package/CHANGELOG.md +7 -0
  5. package/README.md +109 -0
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +3282 -0
  9. package/coverage/coverage-final.json +20 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +161 -0
  12. package/coverage/prettify.css +1 -0
  13. package/coverage/prettify.js +2 -0
  14. package/coverage/sort-arrow-sprite.png +0 -0
  15. package/coverage/sorter.js +210 -0
  16. package/coverage/src/fairness-metrics.ts.html +1579 -0
  17. package/coverage/src/index.html +161 -0
  18. package/coverage/src/index.ts.html +535 -0
  19. package/coverage/src/inference/browser-inference.ts.html +859 -0
  20. package/coverage/src/inference/capability-detection.ts.html +2227 -0
  21. package/coverage/src/inference/index.html +176 -0
  22. package/coverage/src/inference/index.ts.html +553 -0
  23. package/coverage/src/inference/inference-factory.ts.html +751 -0
  24. package/coverage/src/inference/ollama-client.ts.html +1627 -0
  25. package/coverage/src/legal-checks/annex-iv-report.ts.html +556 -0
  26. package/coverage/src/legal-checks/bias-metrics.ts.html +1855 -0
  27. package/coverage/src/legal-checks/data-governance.ts.html +529 -0
  28. package/coverage/src/legal-checks/human-oversight-logging.ts.html +490 -0
  29. package/coverage/src/legal-checks/index.html +206 -0
  30. package/coverage/src/legal-checks/index.ts.html +250 -0
  31. package/coverage/src/legal-checks/risk-classifier.ts.html +940 -0
  32. package/coverage/src/legal-checks/robustness-transparency.ts.html +571 -0
  33. package/coverage/src/metrics/crows-pairs-bias.ts.html +820 -0
  34. package/coverage/src/metrics/index.html +146 -0
  35. package/coverage/src/metrics/index.ts.html +151 -0
  36. package/coverage/src/metrics/stereotype-bias.ts.html +886 -0
  37. package/coverage/src/risk-engine.ts.html +1660 -0
  38. package/coverage/src/types.ts.html +547 -0
  39. package/dist/legal-checks/disclaimer.d.ts +2 -0
  40. package/dist/legal-checks/disclaimer.d.ts.map +1 -0
  41. package/dist/legal-checks/disclaimer.js +1 -0
  42. package/package.json +20 -1
@@ -0,0 +1,820 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/metrics/crows-pairs-bias.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/metrics</a> crows-pairs-bias.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">97.41% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>151/155</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">87.71% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>50/57</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>8/8</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">97.41% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>151/155</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-yes">20x</span>
348
+ <span class="cline-any cline-yes">20x</span>
349
+ <span class="cline-any cline-yes">20x</span>
350
+ <span class="cline-any cline-yes">20x</span>
351
+ <span class="cline-any cline-yes">20x</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-yes">20x</span>
354
+ <span class="cline-any cline-yes">1x</span>
355
+ <span class="cline-any cline-yes">1x</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-yes">19x</span>
358
+ <span class="cline-any cline-yes">17x</span>
359
+ <span class="cline-any cline-yes">17x</span>
360
+ <span class="cline-any cline-yes">17x</span>
361
+ <span class="cline-any cline-yes">17x</span>
362
+ <span class="cline-any cline-yes">17x</span>
363
+ <span class="cline-any cline-yes">17x</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-yes">20x</span>
366
+ <span class="cline-any cline-yes">1x</span>
367
+ <span class="cline-any cline-yes">1x</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-yes">16x</span>
370
+ <span class="cline-any cline-yes">16x</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-yes">16x</span>
373
+ <span class="cline-any cline-yes">16x</span>
374
+ <span class="cline-any cline-yes">16x</span>
375
+ <span class="cline-any cline-yes">16x</span>
376
+ <span class="cline-any cline-yes">16x</span>
377
+ <span class="cline-any cline-yes">16x</span>
378
+ <span class="cline-any cline-yes">16x</span>
379
+ <span class="cline-any cline-yes">16x</span>
380
+ <span class="cline-any cline-yes">16x</span>
381
+ <span class="cline-any cline-yes">16x</span>
382
+ <span class="cline-any cline-yes">16x</span>
383
+ <span class="cline-any cline-yes">16x</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-yes">19x</span>
386
+ <span class="cline-any cline-yes">19x</span>
387
+ <span class="cline-any cline-yes">19x</span>
388
+ <span class="cline-any cline-yes">19x</span>
389
+ <span class="cline-any cline-yes">19x</span>
390
+ <span class="cline-any cline-yes">19x</span>
391
+ <span class="cline-any cline-yes">9x</span>
392
+ <span class="cline-any cline-yes">9x</span>
393
+ <span class="cline-any cline-yes">9x</span>
394
+ <span class="cline-any cline-yes">2x</span>
395
+ <span class="cline-any cline-yes">2x</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-yes">17x</span>
398
+ <span class="cline-any cline-yes">17x</span>
399
+ <span class="cline-any cline-yes">17x</span>
400
+ <span class="cline-any cline-yes">17x</span>
401
+ <span class="cline-any cline-yes">17x</span>
402
+ <span class="cline-any cline-yes">17x</span>
403
+ <span class="cline-any cline-yes">17x</span>
404
+ <span class="cline-any cline-yes">17x</span>
405
+ <span class="cline-any cline-yes">17x</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-yes">17x</span>
408
+ <span class="cline-any cline-yes">94x</span>
409
+ <span class="cline-any cline-yes">94x</span>
410
+ <span class="cline-any cline-yes">94x</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-yes">94x</span>
413
+ <span class="cline-any cline-yes">94x</span>
414
+ <span class="cline-any cline-yes">94x</span>
415
+ <span class="cline-any cline-yes">94x</span>
416
+ <span class="cline-any cline-yes">94x</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-yes">94x</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-yes">87x</span>
421
+ <span class="cline-any cline-yes">87x</span>
422
+ <span class="cline-any cline-yes">87x</span>
423
+ <span class="cline-any cline-yes">94x</span>
424
+ <span class="cline-any cline-yes">7x</span>
425
+ <span class="cline-any cline-yes">7x</span>
426
+ <span class="cline-any cline-yes">94x</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-yes">17x</span>
429
+ <span class="cline-any cline-yes">17x</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-yes">94x</span>
432
+ <span class="cline-any cline-yes">94x</span>
433
+ <span class="cline-any cline-yes">94x</span>
434
+ <span class="cline-any cline-yes">94x</span>
435
+ <span class="cline-any cline-yes">94x</span>
436
+ <span class="cline-any cline-yes">94x</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-yes">94x</span>
439
+ <span class="cline-any cline-yes">94x</span>
440
+ <span class="cline-any cline-yes">94x</span>
441
+ <span class="cline-any cline-yes">94x</span>
442
+ <span class="cline-any cline-yes">94x</span>
443
+ <span class="cline-any cline-yes">94x</span>
444
+ <span class="cline-any cline-yes">69x</span>
445
+ <span class="cline-any cline-yes">64x</span>
446
+ <span class="cline-any cline-yes">64x</span>
447
+ <span class="cline-any cline-yes">64x</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-yes">94x</span>
450
+ <span class="cline-any cline-yes">25x</span>
451
+ <span class="cline-any cline-yes">25x</span>
452
+ <span class="cline-any cline-yes">23x</span>
453
+ <span class="cline-any cline-yes">23x</span>
454
+ <span class="cline-any cline-yes">23x</span>
455
+ <span class="cline-any cline-yes">23x</span>
456
+ <span class="cline-any cline-yes">23x</span>
457
+ <span class="cline-any cline-yes">23x</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-no">&nbsp;</span>
460
+ <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-neutral">&nbsp;</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-yes">2x</span>
471
+ <span class="cline-any cline-yes">2x</span>
472
+ <span class="cline-any cline-yes">2x</span>
473
+ <span class="cline-any cline-yes">2x</span>
474
+ <span class="cline-any cline-yes">2x</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-yes">2x</span>
477
+ <span class="cline-any cline-yes">4x</span>
478
+ <span class="cline-any cline-yes">4x</span>
479
+ <span class="cline-any cline-yes">3x</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-yes">3x</span>
483
+ <span class="cline-any cline-yes">3x</span>
484
+ <span class="cline-any cline-yes">4x</span>
485
+ <span class="cline-any cline-yes">1x</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">4x</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-yes">2x</span>
490
+ <span class="cline-any cline-yes">2x</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-neutral">&nbsp;</span>
495
+ <span class="cline-any cline-neutral">&nbsp;</span>
496
+ <span class="cline-any cline-neutral">&nbsp;</span>
497
+ <span class="cline-any cline-neutral">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-yes">2x</span>
501
+ <span class="cline-any cline-yes">2x</span>
502
+ <span class="cline-any cline-yes">2x</span>
503
+ <span class="cline-any cline-yes">2x</span>
504
+ <span class="cline-any cline-yes">2x</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-yes">2x</span>
507
+ <span class="cline-any cline-yes">4x</span>
508
+ <span class="cline-any cline-yes">4x</span>
509
+ <span class="cline-any cline-yes">3x</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-yes">3x</span>
513
+ <span class="cline-any cline-yes">3x</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-yes">3x</span>
517
+ <span class="cline-any cline-yes">3x</span>
518
+ <span class="cline-any cline-yes">4x</span>
519
+ <span class="cline-any cline-yes">1x</span>
520
+ <span class="cline-any cline-yes">1x</span>
521
+ <span class="cline-any cline-yes">4x</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-yes">2x</span>
524
+ <span class="cline-any cline-yes">2x</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-yes">1x</span>
531
+ <span class="cline-any cline-yes">5x</span>
532
+ <span class="cline-any cline-yes">1x</span>
533
+ <span class="cline-any cline-yes">1x</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-yes">4x</span>
536
+ <span class="cline-any cline-yes">6x</span>
537
+ <span class="cline-any cline-yes">6x</span>
538
+ <span class="cline-any cline-no">&nbsp;</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-yes">6x</span>
543
+ <span class="cline-any cline-yes">6x</span>
544
+ <span class="cline-any cline-yes">2x</span>
545
+ <span class="cline-any cline-yes">2x</span>
546
+ <span class="cline-any cline-neutral">&nbsp;</span>
547
+ <span class="cline-any cline-neutral">&nbsp;</span>
548
+ <span class="cline-any cline-yes">6x</span>
549
+ <span class="cline-any cline-yes">6x</span>
550
+ <span class="cline-any cline-yes">1x</span>
551
+ <span class="cline-any cline-yes">1x</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-yes">3x</span>
554
+ <span class="cline-any cline-yes">4x</span>
555
+ <span class="cline-any cline-yes">4x</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
557
+ * CrowS-Pairs Bias Calculation Engine
558
+ * Implements the CrowS-Pairs methodology (Nangia et al., 2020) for measuring stereotypical bias
559
+ * Uses log-probabilities as the gold standard with latency fallback when needed
560
+ */
561
+ &nbsp;
562
+ import { BrowserInference } from "../inference/browser-inference";
563
+ import { OllamaClient } from "../inference/ollama-client";
564
+ import type {
565
+ BiasCalculationMethod,
566
+ BiasTestConfig,
567
+ CrowsPairsBiasResult,
568
+ CrowsPairsEntry,
569
+ } from "../types";
570
+ &nbsp;
571
+ /**
572
+ * Interface for the raw entry format in the JSON dataset
573
+ */
574
+ interface RawCrowsPairsEntry {
575
+ id: number;
576
+ stereotype?: string;
577
+ antiStereotype?: string;
578
+ sent_more?: string;
579
+ sent_less?: string;
580
+ bias_type?: string;
581
+ biasType?: string;
582
+ }
583
+ &nbsp;
584
+ /**
585
+ * Calculate CrowS-Pairs bias score using the specified inference client
586
+ * Implements the methodology: mean(logprob_stereo - logprob_anti)
587
+ *
588
+ * @param config - Configuration including dataset, model, and engine
589
+ * @param inferenceClient - Either BrowserInference or OllamaClient instance
590
+ * @returns Promise&lt;CrowsPairsBiasResult&gt; with bias score and metadata
591
+ */
592
+ export async function calculateCrowsPairsBias(
593
+ config: BiasTestConfig,
594
+ inferenceClient: BrowserInference | OllamaClient
595
+ ): Promise&lt;CrowsPairsBiasResult&gt; {
596
+ const { dataset, model, engine } = config;
597
+ &nbsp;
598
+ if (dataset.length === 0) {
599
+ throw new Error("Dataset cannot be empty");
600
+ }
601
+ &nbsp;
602
+ const method = await determineCalculationMethod(engine, inferenceClient);
603
+ const { biasScores, stereotypicalCount, finalMethod } = await processDataset(
604
+ dataset,
605
+ engine,
606
+ inferenceClient,
607
+ method
608
+ );
609
+ &nbsp;
610
+ if (biasScores.length === 0) {
611
+ throw new Error("No valid bias scores calculated from dataset");
612
+ }
613
+ &nbsp;
614
+ const overallBiasScore = biasScores.reduce((sum, score) =&gt; sum + score, 0) / biasScores.length;
615
+ const stereotypicalPreference = (stereotypicalCount / biasScores.length) * 100;
616
+ &nbsp;
617
+ return {
618
+ score: Number(overallBiasScore.toFixed(6)),
619
+ method: finalMethod,
620
+ pairsAnalyzed: biasScores.length,
621
+ stereotypicalPreference: Number(stereotypicalPreference.toFixed(2)),
622
+ metadata: {
623
+ engine,
624
+ model,
625
+ timestamp: new Date().toISOString(),
626
+ },
627
+ };
628
+ }
629
+ &nbsp;
630
+ async function determineCalculationMethod(
631
+ engine: string,
632
+ inferenceClient: BrowserInference | OllamaClient
633
+ ): Promise&lt;BiasCalculationMethod&gt; {
634
+ if (engine === "browser") return "logprobs_exact";
635
+ if (engine === "ollama" &amp;&amp; inferenceClient instanceof OllamaClient) {
636
+ const supportsLogProbs = await inferenceClient.detectLogProbSupport();
637
+ return supportsLogProbs ? "logprobs_exact" : "logprobs_fallback_latency";
638
+ }
639
+ throw new Error(`Unsupported engine: ${engine}`);
640
+ }
641
+ &nbsp;
642
+ async function processDataset(
643
+ dataset: unknown[],
644
+ engine: string,
645
+ inferenceClient: BrowserInference | OllamaClient,
646
+ initialMethod: BiasCalculationMethod
647
+ ) {
648
+ const biasScores: number[] = [];
649
+ let stereotypicalCount = 0;
650
+ let finalMethod = initialMethod;
651
+ &nbsp;
652
+ for (const entry of dataset) {
653
+ try {
654
+ const pair = extractSentences(entry as RawCrowsPairsEntry);
655
+ if (!pair) <span class="branch-0 cbranch-no" title="branch not covered" >continue;</span>
656
+ &nbsp;
657
+ const { logprobStereo, logprobAnti, actualMethod } = await getLogProbsForPair(
658
+ pair,
659
+ engine,
660
+ inferenceClient
661
+ );
662
+ &nbsp;
663
+ if (actualMethod) finalMethod = actualMethod;
664
+ &nbsp;
665
+ const pairBias = logprobStereo - logprobAnti;
666
+ biasScores.push(pairBias);
667
+ if (pairBias &gt; 0) stereotypicalCount++;
668
+ } catch (error) {
669
+ console.warn("Failed to process entry:", error);
670
+ }
671
+ }
672
+ &nbsp;
673
+ return { biasScores, stereotypicalCount, finalMethod };
674
+ }
675
+ &nbsp;
676
+ function extractSentences(entry: RawCrowsPairsEntry): { stereo: string; anti: string } | null {
677
+ const stereo = entry.<span class="branch-0 cbranch-no" title="branch not covered" >sent_more || entry.stereotype;</span>
678
+ const anti = entry.<span class="branch-0 cbranch-no" title="branch not covered" >sent_less || entry.antiStereotype;</span>
679
+ if (!stereo || !anti) <span class="branch-0 cbranch-no" title="branch not covered" >return null;</span>
680
+ return { stereo, anti };
681
+ }
682
+ &nbsp;
683
+ async function getLogProbsForPair(
684
+ pair: { stereo: string; anti: string },
685
+ engine: string,
686
+ inferenceClient: BrowserInference | OllamaClient
687
+ ) {
688
+ if (engine === "browser" &amp;&amp; inferenceClient instanceof BrowserInference) {
689
+ const logprobStereo = await inferenceClient.getLogProb(pair.stereo);
690
+ const logprobAnti = await inferenceClient.getLogProb(pair.anti);
691
+ return { logprobStereo, logprobAnti };
692
+ }
693
+ &nbsp;
694
+ if (engine === "ollama" &amp;&amp; inferenceClient instanceof OllamaClient) {
695
+ const stereoResult = await inferenceClient.getLogProbWithFallback(pair.stereo);
696
+ const antiResult = await inferenceClient.getLogProbWithFallback(pair.anti);
697
+ return {
698
+ logprobStereo: stereoResult.logprob,
699
+ logprobAnti: antiResult.logprob,
700
+ actualMethod: stereoResult.method,
701
+ };
702
+ <span class="branch-0 cbranch-no" title="branch not covered" > }</span>
703
+ &nbsp;
704
+ <span class="cstat-no" title="statement not covered" > throw new Error("Invalid inference client for engine");</span>
705
+ <span class="cstat-no" title="statement not covered" >}</span>
706
+ &nbsp;
707
+ /**
708
+ * Calculate bias using log-probability method (exact implementation)
709
+ * This is the gold standard method when log-probabilities are available
710
+ *
711
+ * @param dataset - CrowS-Pairs dataset entries
712
+ * @param getLogProb - Function to get log-probability for a sentence
713
+ * @returns Promise&lt;number[]&gt; array of bias scores for each pair
714
+ */
715
+ export async function calculateLogProbBias(
716
+ dataset: CrowsPairsEntry[],
717
+ getLogProb: (sentence: string) =&gt; Promise&lt;number&gt;
718
+ ): Promise&lt;number[]&gt; {
719
+ const biasScores: number[] = [];
720
+ &nbsp;
721
+ for (const entry of dataset) {
722
+ try {
723
+ const logprobStereo = await getLogProb(entry.sent_more);
724
+ const logprobAnti = await getLogProb(entry.sent_less);
725
+ &nbsp;
726
+ // CrowS-Pairs methodology: logprob_stereo - logprob_anti
727
+ const bias = logprobStereo - logprobAnti;
728
+ biasScores.push(bias);
729
+ } catch (error) {
730
+ console.warn(`Failed to calculate log-prob bias for entry ${entry.id}:`, error);
731
+ }
732
+ }
733
+ &nbsp;
734
+ return biasScores;
735
+ }
736
+ &nbsp;
737
+ /**
738
+ * Calculate bias using latency fallback method
739
+ * Uses inference timing as a proxy for model confidence/probability
740
+ *
741
+ * @param dataset - CrowS-Pairs dataset entries
742
+ * @param getLatency - Function to get inference latency for a sentence
743
+ * @returns Promise&lt;number[]&gt; array of bias scores for each pair
744
+ */
745
+ export async function calculateLatencyBias(
746
+ dataset: CrowsPairsEntry[],
747
+ getLatency: (sentence: string) =&gt; Promise&lt;number&gt;
748
+ ): Promise&lt;number[]&gt; {
749
+ const biasScores: number[] = [];
750
+ &nbsp;
751
+ for (const entry of dataset) {
752
+ try {
753
+ const latencyStereo = await getLatency(entry.sent_more);
754
+ const latencyAnti = await getLatency(entry.sent_less);
755
+ &nbsp;
756
+ // Convert latency to pseudo log-probability (faster = higher probability)
757
+ const pseudoLogprobStereo = -Math.log(latencyStereo + 0.00001);
758
+ const pseudoLogprobAnti = -Math.log(latencyAnti + 0.00001);
759
+ &nbsp;
760
+ // Apply same formula as log-probability method
761
+ const bias = pseudoLogprobStereo - pseudoLogprobAnti;
762
+ biasScores.push(bias);
763
+ } catch (error) {
764
+ console.warn(`Failed to calculate latency bias for entry ${entry.id}:`, error);
765
+ }
766
+ }
767
+ &nbsp;
768
+ return biasScores;
769
+ }
770
+ &nbsp;
771
+ /**
772
+ * Validate CrowS-Pairs dataset format
773
+ * Ensures all required fields are present and valid
774
+ */
775
+ export function validateCrowsPairsDataset(dataset: unknown[]): dataset is CrowsPairsEntry[] {
776
+ if (!Array.isArray(dataset)) {
777
+ return false;
778
+ }
779
+ &nbsp;
780
+ return dataset.every((entry) =&gt; {
781
+ const e = entry as RawCrowsPairsEntry;
782
+ if (typeof e !== "object" || e === null || typeof e.id !== "number") <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
783
+ <span class="cstat-no" title="statement not covered" > return false;</span>
784
+ <span class="cstat-no" title="statement not covered" > }</span>
785
+ &nbsp;
786
+ // Check sent_more/stereotype: must be non-empty string
787
+ const sentMore = e.<span class="branch-0 cbranch-no" title="branch not covered" >sent_more ?? e.stereotype;</span>
788
+ if (typeof sentMore !== "string" || sentMore.trim() === "") {
789
+ return false;
790
+ }
791
+ &nbsp;
792
+ // Check sent_less/antiStereotype: must be non-empty string
793
+ const sentLess = e.sent_less ?? e.antiStereotype;
794
+ if (typeof sentLess !== "string" || sentLess.trim() === "") {
795
+ return false;
796
+ }
797
+ &nbsp;
798
+ return true;
799
+ });
800
+ }
801
+ &nbsp;</pre></td></tr></table></pre>
802
+
803
+ <div class='push'></div><!-- for sticky footer -->
804
+ </div><!-- /wrapper -->
805
+ <div class='footer quiet pad2 space-top1 center small'>
806
+ Code coverage generated by
807
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
808
+ at 2026-01-07T00:09:13.255Z
809
+ </div>
810
+ <script src="../../prettify.js"></script>
811
+ <script>
812
+ window.onload = function () {
813
+ prettyPrint();
814
+ };
815
+ </script>
816
+ <script src="../../sorter.js"></script>
817
+ <script src="../../block-navigation.js"></script>
818
+ </body>
819
+ </html>
820
+