annotate src/app/services/feature-extraction/FeatureReducers.ts @ 241:9285f1b80990

Some reducer functions for folding StreamingResponses into a single response.
author Lucas Thompson <dev@lucas.im>
date Wed, 26 Apr 2017 16:13:15 +0100
parents
children 73beb0e970c5
rev   line source
dev@241 1 /**
dev@241 2 * Created by lucast on 26/04/2017.
dev@241 3 */
dev@241 4 import {StreamingResponse} from 'piper/StreamingService';
dev@241 5 import {Feature} from 'piper/Feature';
dev@241 6 import {SampleType} from 'piper';
dev@241 7
dev@241 8 export const arrayReducer = <T>(acc: T[], val: T[]): T[] => {
dev@241 9 acc.push.apply(acc, val);
dev@241 10 return acc;
dev@241 11 };
dev@241 12
dev@241 13 export const typedArrayReducer = (acc: Float32Array,
dev@241 14 val: Float32Array): Float32Array => {
dev@241 15 return Float32Array.of(...acc, ...val);
dev@241 16 };
dev@241 17
dev@241 18 const inPlaceTypedArrayReducer = (acc: Float32Array,
dev@241 19 val: Float32Array,
dev@241 20 i: number): Float32Array => {
dev@241 21 acc.set(val, i);
dev@241 22 return acc;
dev@241 23 };
dev@241 24
dev@241 25 export const streamingResponseReducer = (acc: StreamingResponse,
dev@241 26 val: StreamingResponse,
dev@241 27 i: number): StreamingResponse => {
dev@241 28 acc.processedBlockCount = val.processedBlockCount;
dev@241 29 if (acc.features.data instanceof Array &&
dev@241 30 val.features.data instanceof Array) {
dev@241 31 acc.features.data = arrayReducer<Feature>(
dev@241 32 acc.features.data,
dev@241 33 val.features.data
dev@241 34 );
dev@241 35 } else if (acc.features.data instanceof Float32Array &&
dev@241 36 val.features.data instanceof Float32Array) {
dev@241 37 const isOneSamplePerStep = acc.outputDescriptor.configured.sampleType ===
dev@241 38 SampleType.OneSamplePerStep;
dev@241 39 if (isOneSamplePerStep) {
dev@241 40 // for one sample per step vectors we know there will be totalBlockCount
dev@241 41 // number of samples - so pre-allocate the Float32Array when we know
dev@241 42 // the totalBlockCount (after receiving the first feature)
dev@241 43 if ( i === 1 ) {
dev@241 44 const newBlock = new Float32Array(acc.totalBlockCount);
dev@241 45 newBlock[0] = acc.features.data[0];
dev@241 46 acc.features.data = newBlock;
dev@241 47 }
dev@241 48 acc.features.data = inPlaceTypedArrayReducer(
dev@241 49 acc.features.data,
dev@241 50 val.features.data,
dev@241 51 i
dev@241 52 );
dev@241 53 } else { // if not OneSamplePerStep we have to make a new array each time
dev@241 54 acc.features.data = typedArrayReducer(
dev@241 55 acc.features.data,
dev@241 56 val.features.data
dev@241 57 );
dev@241 58 }
dev@241 59 } else {
dev@241 60 throw new Error('Invalid feature output. Aborting');
dev@241 61 }
dev@241 62 return acc;
dev@241 63 };