Home | History | Annotate | Download | only in resources
      1 // Copyright 2017 The TensorFlow Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 // =============================================================================
     15 #ifndef TENSORFLOW_CONTRIB_BOOSTED_TREES_RESOURCES_QUANTILE_STREAM_RESOURCE_H_
     16 #define TENSORFLOW_CONTRIB_BOOSTED_TREES_RESOURCES_QUANTILE_STREAM_RESOURCE_H_
     17 
     18 #include "tensorflow/contrib/boosted_trees/lib/quantiles/weighted_quantiles_stream.h"
     19 #include "tensorflow/contrib/boosted_trees/proto/quantiles.pb.h"  // NOLINT
     20 #include "tensorflow/contrib/boosted_trees/resources/stamped_resource.h"
     21 #include "tensorflow/core/framework/resource_mgr.h"
     22 #include "tensorflow/core/platform/macros.h"
     23 #include "tensorflow/core/platform/mutex.h"
     24 
     25 namespace tensorflow {
     26 namespace boosted_trees {
     27 
     28 using QuantileStream =
     29     boosted_trees::quantiles::WeightedQuantilesStream<float, float>;
     30 
     31 // Resource for accumulating summaries for multiple columns.
     32 class QuantileStreamResource : public StampedResource {
     33  public:
     34   QuantileStreamResource(const float epsilon, const int32 num_quantiles,
     35                          const int64 max_elements, bool generate_quantiles,
     36                          int64 stamp_token)
     37       : stream_(epsilon, max_elements),
     38         are_buckets_ready_(false),
     39         epsilon_(epsilon),
     40         num_quantiles_(num_quantiles),
     41         max_elements_(max_elements),
     42         generate_quantiles_(generate_quantiles) {
     43     set_stamp(stamp_token);
     44   }
     45 
     46   string DebugString() const override { return "QuantileStreamResource"; }
     47 
     48   tensorflow::mutex* mutex() { return &mu_; }
     49 
     50   QuantileStream* stream(int64 stamp) {
     51     CHECK(is_stamp_valid(stamp));
     52     return &stream_;
     53   }
     54 
     55   const std::vector<float>& boundaries(int64 stamp) {
     56     CHECK(is_stamp_valid(stamp));
     57     return boundaries_;
     58   }
     59 
     60   void set_boundaries(int64 stamp, const std::vector<float>& boundaries) {
     61     CHECK(is_stamp_valid(stamp));
     62     are_buckets_ready_ = true;
     63     boundaries_ = boundaries;
     64   }
     65 
     66   float epsilon() const { return epsilon_; }
     67   int32 num_quantiles() const { return num_quantiles_; }
     68 
     69   void Reset(int64 stamp) {
     70     set_stamp(stamp);
     71     stream_ = QuantileStream(epsilon_, max_elements_);
     72   }
     73 
     74   bool are_buckets_ready() const { return are_buckets_ready_; }
     75   void set_buckets_ready(bool are_buckets_ready) {
     76     are_buckets_ready_ = are_buckets_ready;
     77   }
     78 
     79   bool generate_quantiles() const { return generate_quantiles_; }
     80   void set_generate_quantiles(bool generate_quantiles) {
     81     generate_quantiles_ = generate_quantiles;
     82   }
     83 
     84  private:
     85   ~QuantileStreamResource() override {}
     86 
     87   // Mutex for the whole resource.
     88   tensorflow::mutex mu_;
     89 
     90   // Quantile stream.
     91   QuantileStream stream_;
     92 
     93   // Stores the boundaries from the previous iteration. Empty during the first
     94   // iteration.
     95   std::vector<float> boundaries_;
     96 
     97   // Whether boundaries are created. Initially boundaries are empty until
     98   // set_boundaries are called.
     99   bool are_buckets_ready_;
    100 
    101   const float epsilon_;
    102   const int32 num_quantiles_;
    103   // An upper-bound for the number of elements.
    104   int64 max_elements_;
    105 
    106   // Generate quantiles instead of approximate boundaries.
    107   // If true, exactly `num_quantiles` will be produced in the final summary.
    108   bool generate_quantiles_;
    109 
    110   TF_DISALLOW_COPY_AND_ASSIGN(QuantileStreamResource);
    111 };
    112 
    113 }  // namespace boosted_trees
    114 }  // namespace tensorflow
    115 
    116 #endif  // TENSORFLOW_CONTRIB_BOOSTED_TREES_RESOURCES_QUANTILE_STREAM_RESOURCE_H_
    117