/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ // author Kevin Lang, Oath Research #ifndef GOT_FM85_H #include "common.h" #include "u32Table.h" // Note: except for brief transitional moments, these sketches always obey // the following strict mapping between the flavor of a sketch and the // number of coupons that it has collected. enum flavorType { EMPTY, // 0 == C < 1 SPARSE, // 1 <= C < 3K/32 HYBRID, // 3K/32 <= C < K/2 PINNED, // K/2 <= C < 27K/8 [NB: 27/8 = 3 + 3/8] SLIDING // 27K/8 <= C }; /*******************************************************/ typedef struct fm85_sketch_type { // The following variables occur in all sketch types. Short lgK; Boolean isCompressed; Boolean mergeFlag; // Is the sketch the result of merging? Long numCoupons; // The number of coupons collected so far. // The following variables occur in the updateable semi-compressed type. U8 * slidingWindow; Short windowOffset; // Derivable from numCoupons, but made explicit for speed. u32Table * surprisingValueTable; // The following variables occur in the non-updateable fully-compressed type. U32 * compressedWindow; // A bitstream. Long cwLength; // The number of 32-bit words in this bitstream. (Not needed in Java). Long numCompressedSurprisingValues; U32 * compressedSurprisingValues; // A bitstream. Long csvLength; // The number of 32-bit words in this bitstream. (Not needed in Java). // Note that (as an optimization) the two bitstreams could be concatenated. Short firstInterestingColumn; // This is part of a speed optimization. double kxp; double hipEstAccum; double hipErrAccum; } FM85; extern void* (*fm85alloc)(size_t); extern void (*fm85free)(void*); /*******************************************************/ // These routines are exported. void fm85Init (void); // Call this before anything else. void fm85InitAD (void* (*alloc)(size_t), void (*dealloc)(void*)); // or this to use custom allocator and deallocator void fm85Clean (void); // Call this at the end to clean up (optional) FM85 * fm85Make (Short lgK); FM85 * fm85Copy (FM85 * self); void fm85Free (FM85 * sketch); void fm85Update (FM85 * sketch, U64 hash0, U64 hash1); double getHIPEstimate (FM85 * sketch); // getIconEstimate() is defined in a separate file. /*******************************************************/ // The following is used during testing, and is basically package private. U32 rowColFromTwoHashes (U64 hash0, U64 hash1, Short lgK); /*******************************************************/ // These routines are internal. void fm85RowColUpdate (FM85 * sketch, U32 rowCol); enum flavorType determineFlavor (Short lgK, Long c); enum flavorType determineSketchFlavor (FM85 * self); Short determineCorrectOffset (Short lgK, Long c); U64 * bitMatrixOfSketch (FM85 * self); // these are only used internally // void promoteEmptyToSparse (FM85 * self); // void promoteSparseToWindowed (FM85 * self); // void modifyOffset (FM85 * self, Short newOffset); // void updateSparse (FM85 * self, U32 rowCol); // void updateWindowed (FM85 * self, U32 rowCol); /*******************************************************/ #define GOT_FM85_H #endif