module UnibenchInput; use Structures: all except {transpose}; use StdIO: all; use SysErr: all; export {getDataCube, getLabels}; string FibreScanString( File &fd) { /* Skip rest of line */ skip = fscans( fd, 1000); str = fscans( fd, 1000); return( str); } double[*], bool[*] getDataCube( int[.] dimensions) { data, mask, innerDimLabels, indexLabels, numInnerDims = readSparseIntoDenseDouble( "data.out"); printf( "numInnerDims = %d", (:int)numInnerDims); printf( "[ "); for( it=0 ; it sum( toi( val[iv] == a))}); } int[.] perm( int[.] vect, int[.] pv) { res = with { ( . <= iv <= .) : vect[ pv[iv]]; } : genarray( shape(vect), 0); return( res); } int[.] invPerm( int[.] pv) { res = 0*pv; for( i=0; i (i == j) */ new_shp = shape(dimensions) ++ drop( [1], shape( mask)); res = genarray( new_shp, to_stringArray( "")); for( i=0; i shape( unlabelledDims)[[0]]) { unlabelledDims = with { ( [0] <= iv <= [shape( unlabelledDims)[[0]]]) : (resShape[iv] > unlabelledDims[iv] ? resShape[iv] : unlabelledDims[iv]); } : modarray( resShape); } else { unlabelledDims = with { ( [0] <= iv <= [shape( resShape)[[0]]]) : (resShape[iv] > unlabelledDims[iv] ? resShape[iv] : unlabelledDims[iv]); } : modarray( unlabelledDims); } } } fclose( fd); printf("a\n"); for( i = 0 ; i < shape( innerDimLabels)[[0]] ; i++) { if( (shape( unlabelledDims)[[0]] != 0) || ( innerDimBlankSeen[ i])) { innerDimSeen = StringArray::modarray( innerDimSeen, [i] ++ [innerDimCounts[ i]], to_stringArray( "BLANK")); innerDimCounts[ i] = innerDimCounts[ i] + 1; } } oldInnerDimLabels = innerDimLabels; innerDimLabels = genarray( [shape(innerDimLabels)[[0]] + shape(unlabelledDims)[[0]]], to_stringArray( "")); for( k=0 ; k < shape( oldInnerDimLabels)[[0]] ; k++) { innerDimLabels = StringArray::modarray( innerDimLabels, [k], StringArray::sel( [k], oldInnerDimLabels)); } for( l=0 ; l < shape( unlabelledDims)[[0]] ; l++) { innerDimLabels = StringArray::modarray( innerDimLabels, [k+l], to_stringArray( sprintf( "Unamed Dimension %d", l))); } /* TODO: if any results have no dim labels then each given label * needs an extra unknown entry */ innerDimCounts = innerDimCounts ++ unlabelledDims; printf("a\n"); /* debugging start */ /* indicies = getIndicies( shape( innerDimLabels)); printf( "[ "); for( i = 0 ; i < shape( indicies)[0] ; i++) { printf( "%s ", to_string( innerDimLabels[ indicies[[i]]])); } printf( "]\n"); indicies = getIndicies( shape( innerDimCounts)); printf( "[ "); for( i = 0 ; i < shape( indicies)[0] ; i++) { print( innerDimCounts[ indicies[[i]]]); } printf( "]\n"); */ /* debugging end */ /* Pass 2: Insert elements into datacube */ err, fd = fopen( file, "r"); if( fail( err)) { RuntimeError::error( 1, "could not open file \"%s\": %s.", file, strerror( err)); } dataRows = (:int) FibreScanIntArray( fd); shp = FibreScanIntArray( fd); rubbish = FibreScanStringArray( fd); numInnerDims = shape( innerDimLabels)[0]; if( prod( shp ++ innerDimCounts) > 10000000) { RuntimeError::error( 1, "This cube has a size bigger than 10.000.000!" "Please select less dimensions or narrow down the query and try again."); } data = genarray( shp ++ innerDimCounts, 0d); mask = genarray( shp ++ innerDimCounts, false); printf("a\n"); for( x=0 ; x < dataRows ; x++) { printf( "x=%d\n", (:int)x); idx = FibreScanIntArray( fd); if( dim( idx) != 1) { RuntimeError::error( 1, "index for data is not a vector!"); } if( any( idx <0) || any( idx >shp)) { RuntimeError::error( 1, "index for data exceeds the specified shape!"); } result = FibreScanDoubleArray( fd); /* we'll ignore the new mask for now */ newMask = FibreScanDoubleArray( fd); newDimLabels = FibreScanStringArray( fd); numLabels = (:int) FibreScanIntArray( fd); labelArray = genarray( [ numIndexedInnerDims, maxInt( innerDimCounts)], to_stringArray("")); if( numLabels != 0) { for( i=0 ; i 10000000) { RuntimeError::error( 1, "This cube has a size bigger than 10.000.000!" "Please select less dimensions or narrow down the query and try again."); } idx = FibreScanIntArray( fd); if( dim( idx) != 1) { RuntimeError::error( 1, "index for data is not a vector!"); } if( any( idx <0) || any( idx >shp)) { RuntimeError::error( 1, "index for data exceeds the specified shape!"); } first_result = FibreScanStringArray( fd); data = genarray( shp, first_result); mask = genarray( shp, false); mask[idx] = true; for( i=1 ; i < elements ; i++) { idx = FibreScanIntArray( fd); if( dim( idx) != 1) { RuntimeError::error( 1, "index for data is not a vector!"); } if( any( idx <0) || any( idx >shp)) { RuntimeError::error( 1, "index for data exceeds the specified shape!"); } result = FibreScanStringArray( fd); data = StringArray::modarray( data, idx, result); mask[idx] = true; } fclose( fd); return( data, mask); } inline int[.,.] getIndicies( int[.] shp) { iota_shp = Array::iota( shp); return( Array::reshape( [ Array::prod( Array::take( [ Array::dim( Array::iota( shp)) Array::- 1 ], Array::shape( iota_shp))), Array::sel( [0], Array::reverse( Array::shape( shp))) ], iota_shp)); } inline bool in( string needle, stringArray haystack) { res = false; indicies = getIndicies( shape( haystack)); for( i = 0 ; (i < shape( indicies)[0]) && (res == false) ; i++) { if( StringArray::to_string( StringArray::sel( indicies[ i], haystack)) == needle) { res = true; } } return( res); } inline int[.] indexOfUpto( string value, stringArray array, int max) { indicies = getIndicies( shape( array)); res = []; for( i = 0 ; (i < shape( indicies)[0]) && (i < max) ; i++) { if( StringArray::to_string( StringArray::sel( indicies[ i], array)) == value) { res = indicies[ i]; } } return( res); } inline int[.], bool indexOf2( string value, stringArray array) { indicies = getIndicies( shape( array)); res = []; for( i = 0 ; (i < shape( indicies)[0]) ; i++) { if( StringArray::to_string( StringArray::sel( indicies[ i], array)) == value) { res = indicies[ i]; } } return( res, dim(res)!=0); } inline int[.] indexOf( string value, stringArray array) { indicies = getIndicies( shape( array)); res = []; for( i = 0 ; (i < shape( indicies)[0]) ; i++) { if( StringArray::to_string( StringArray::sel( indicies[ i], array)) == value) { res = indicies[ i]; } } return( res); } inline int maxInt( int[.] vect) { res = vect[[0]]; for( i=1; i< shape( vect)[[0]] ; i++) { if( vect[[i]] > res) { res = vect[[i]]; } } return( res); }