• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 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 #include "tensorflow/contrib/tensor_forest/hybrid/core/ops/utils.h"
16 
17 #include <math.h>
18 #include <vector>
19 
20 #include "tensorflow/core/lib/random/philox_random.h"
21 #include "tensorflow/core/lib/random/simple_philox.h"
22 
23 namespace tensorflow {
24 namespace tensorforest {
25 
26 using tensorflow::Tensor;
27 
LeftProbability(const Tensor & point,const Tensor & weight,float bias,int num_features)28 float LeftProbability(const Tensor& point, const Tensor& weight, float bias,
29                       int num_features) {
30   const auto p = point.unaligned_flat<float>();
31   const auto w = weight.unaligned_flat<float>();
32   float dot_product = 0.0;
33   for (int i = 0; i < num_features; i++) {
34     dot_product += w(i) * p(i);
35   }
36 
37   // TODO(thomaswc): At some point we should consider
38   // //learning/logistic/logodds-to-prob.h
39   return 1.0 / (1.0 + exp(-dot_product + bias));
40 }
41 
LeftProbabilityK(const Tensor & point,std::vector<int32> feature_set,const Tensor & weight,float bias,int num_features,int k)42 float LeftProbabilityK(const Tensor& point, std::vector<int32> feature_set,
43                        const Tensor& weight, float bias, int num_features,
44                        int k) {
45   const auto p = point.unaligned_flat<float>();
46   const auto w = weight.unaligned_flat<float>();
47 
48   float dot_product = 0.0;
49 
50   for (int32 i = 0; i < k; i++) {
51     CHECK_LT(feature_set[i], num_features);
52     dot_product += p(feature_set[i]) * w(i);
53   }
54 
55   // TODO(thomaswc): At some point we should consider
56   // //learning/logistic/logodds-to-prob.h
57   return 1.0 / (1.0 + exp(-dot_product + bias));
58 }
59 
GetFeatureSet(int32 tree_num,int32 node_num,int32 random_seed,int32 num_features,int32 num_features_to_pick,std::vector<int32> * features)60 void GetFeatureSet(int32 tree_num, int32 node_num, int32 random_seed,
61                    int32 num_features, int32 num_features_to_pick,
62                    std::vector<int32>* features) {
63   features->clear();
64   uint64 seed = node_num ^ (tree_num << 16) ^ random_seed;
65   random::PhiloxRandom rng(seed);
66   for (int i = 0; i < num_features_to_pick; ++i) {
67     // PhiloxRandom returns an array of int32's
68     const random::PhiloxRandom::ResultType rand = rng();
69     const int32 feature = (rand[0] + rand[1]) % num_features;
70     features->push_back(feature);
71   }
72 }
73 
74 }  // namespace tensorforest
75 }  // namespace tensorflow
76