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 };
|