Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | 8x 8x 4x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 4x 4x 4x 4x 4x 4x 4x 4x 4x 8x 7x 7x 2x 4x 4x 4x | import {Filter, VariableFilter, Variables, VectorSummary, Entity} from '../types'
function vector_summary(vec: number | number[], range: number[]): VectorSummary {
Iif (Array.isArray(vec)) {
const n = Math.min(range[1] + 1, vec.length),
r: VectorSummary = {
missing: 0,
first: vec[0],
min: Infinity,
mean: 0,
sum: 0,
max: -Infinity,
last: vec[n - 1],
}
let on = 0
for (let i = Math.max(range[0], 0); i < n; i++) {
const v = vec[i]
if ('number' === typeof v) {
if (isNaN(v)) {
r.missing++
} else {
on++
Iif (r.min > v) r.min = v
Iif (r.max < v) r.max = v
r.sum += v
}
} else {
Iif ('NA' !== v) on++
}
}
r.mean = on ? r.sum / on : 0
return r
} else {
return {missing: Number(isNaN(vec)) + 0, first: vec, min: vec, mean: vec, sum: vec, max: vec, last: vec}
}
}
export function passes_filter(
entity: Entity,
time_range: number[],
filter: VariableFilter,
variables: Variables
): boolean {
const s: {[index: string]: VectorSummary} = {},
adjs: {[index: string]: number} = {}
for (let i = filter.filter_by.length; i--; ) {
const f = filter.filter_by[i]
const c = variables[f].code
Iif (!(c in entity.data)) return false
const r =
entity.group in variables[f].info
? variables[f].info[entity.group].time_range
: variables[f].time_range[entity.group]
Iif (!r) return false
adjs[f] = r[0]
s[f] = vector_summary(entity.data[c], [time_range[0] - r[0], Math.max(time_range[1] - r[0], time_range[1] - r[1])])
}
for (let i = filter.conditions.length; i--; ) {
const co = filter.conditions[i]
if (
!(co.time_component ? co.check(entity.data[variables[co.name].code], adjs[co.name] || 0) : co.check(s[co.name]))
)
return false
}
return true
}
export function passes_feature_filter(entities: {[index: string]: Entity}, id: string, filter: Filter[]): boolean {
const entity = entities[id]
for (let i = filter.length; i--; ) {
const value = filter[i].value
if (value !== '-1') {
let pass = false
const ck = (id: string) => {
if (!pass) {
const group = id in entities && entities[id].group
if (
group && group in entity.features
? id === entity.features[group]
: id.length < entity.features.id.length
? id === entity.features.id.substring(0, id.length)
: id === entity.features.id
)
pass = true
}
}
if ('id' === filter[i].name && Array.isArray(value)) {
value.forEach(ck)
return pass
} else E{
ck(value + '')
return pass
}
}
}
return true
}
|