OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "courgette/adjustment_method.h" | 5 #include "courgette/adjustment_method.h" |
6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include <algorithm> | 10 #include <algorithm> |
8 #include <limits> | 11 #include <limits> |
9 #include <list> | 12 #include <list> |
10 #include <map> | 13 #include <map> |
11 #include <set> | 14 #include <set> |
12 #include <string> | 15 #include <string> |
13 #include <vector> | 16 #include <vector> |
14 | 17 |
15 #include "base/basictypes.h" | |
16 #include "base/format_macros.h" | 18 #include "base/format_macros.h" |
17 #include "base/logging.h" | 19 #include "base/logging.h" |
| 20 #include "base/macros.h" |
18 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
19 #include "base/time/time.h" | 22 #include "base/time/time.h" |
20 #include "courgette/assembly_program.h" | 23 #include "courgette/assembly_program.h" |
21 #include "courgette/courgette.h" | 24 #include "courgette/courgette.h" |
22 #include "courgette/encoded_program.h" | 25 #include "courgette/encoded_program.h" |
23 | 26 |
24 /* | 27 /* |
25 | 28 |
26 Shingle weighting matching. | 29 Shingle weighting matching. |
27 | 30 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 : label_(NULL), is_model_(false), debug_index_(0), refs_(0), | 172 : label_(NULL), is_model_(false), debug_index_(0), refs_(0), |
170 assignment_(NULL), candidates_(NULL) | 173 assignment_(NULL), candidates_(NULL) |
171 {} | 174 {} |
172 | 175 |
173 ~LabelInfo(); | 176 ~LabelInfo(); |
174 | 177 |
175 AssignmentCandidates* candidates(); | 178 AssignmentCandidates* candidates(); |
176 | 179 |
177 Label* label_; // The label that this info a surrogate for. | 180 Label* label_; // The label that this info a surrogate for. |
178 | 181 |
179 uint32 is_model_ : 1; // Is the label in the model? | 182 uint32_t is_model_ : 1; // Is the label in the model? |
180 uint32 debug_index_ : 31; // A small number for naming the label in debug | 183 uint32_t debug_index_ : 31; // A small number for naming the label in debug |
181 // output. The pair (is_model_, debug_index_) is | 184 // output. The pair (is_model_, debug_index_) is |
182 // unique. | 185 // unique. |
183 | 186 |
184 int refs_; // Number of times this Label is referenced. | 187 int refs_; // Number of times this Label is referenced. |
185 | 188 |
186 LabelInfo* assignment_; // Label from other program corresponding to this. | 189 LabelInfo* assignment_; // Label from other program corresponding to this. |
187 | 190 |
188 std::vector<uint32> positions_; // Offsets into the trace of references. | 191 std::vector<uint32_t> positions_; // Offsets into the trace of references. |
189 | 192 |
190 private: | 193 private: |
191 AssignmentCandidates* candidates_; | 194 AssignmentCandidates* candidates_; |
192 | 195 |
193 void operator=(const LabelInfo*); // Disallow assignment only. | 196 void operator=(const LabelInfo*); // Disallow assignment only. |
194 // Public compiler generated copy constructor is needed to constuct | 197 // Public compiler generated copy constructor is needed to constuct |
195 // std::pair<Label*, LabelInfo> so that fresh LabelInfos can be allocated | 198 // std::pair<Label*, LabelInfo> so that fresh LabelInfos can be allocated |
196 // inside a std::map. | 199 // inside a std::map. |
197 }; | 200 }; |
198 | 201 |
199 typedef std::vector<LabelInfo*> Trace; | 202 typedef std::vector<LabelInfo*> Trace; |
200 | 203 |
201 std::string ToString(const LabelInfo* info) { | 204 std::string ToString(const LabelInfo* info) { |
202 std::string s; | 205 std::string s; |
203 base::StringAppendF(&s, "%c%d", "pm"[info->is_model_], info->debug_index_); | 206 base::StringAppendF(&s, "%c%d", "pm"[info->is_model_], info->debug_index_); |
204 if (info->label_->index_ != Label::kNoIndex) | 207 if (info->label_->index_ != Label::kNoIndex) |
205 base::StringAppendF(&s, " (%d)", info->label_->index_); | 208 base::StringAppendF(&s, " (%d)", info->label_->index_); |
206 | 209 |
207 base::StringAppendF(&s, " #%u", info->refs_); | 210 base::StringAppendF(&s, " #%u", info->refs_); |
208 return s; | 211 return s; |
209 } | 212 } |
210 | 213 |
211 // LabelInfoMaker maps labels to their surrogate LabelInfo objects. | 214 // LabelInfoMaker maps labels to their surrogate LabelInfo objects. |
212 class LabelInfoMaker { | 215 class LabelInfoMaker { |
213 public: | 216 public: |
214 LabelInfoMaker() : debug_label_index_gen_(0) {} | 217 LabelInfoMaker() : debug_label_index_gen_(0) {} |
215 | 218 |
216 LabelInfo* MakeLabelInfo(Label* label, bool is_model, uint32 position) { | 219 LabelInfo* MakeLabelInfo(Label* label, bool is_model, uint32_t position) { |
217 LabelInfo& slot = label_infos_[label]; | 220 LabelInfo& slot = label_infos_[label]; |
218 if (slot.label_ == NULL) { | 221 if (slot.label_ == NULL) { |
219 slot.label_ = label; | 222 slot.label_ = label; |
220 slot.is_model_ = is_model; | 223 slot.is_model_ = is_model; |
221 slot.debug_index_ = ++debug_label_index_gen_; | 224 slot.debug_index_ = ++debug_label_index_gen_; |
222 } | 225 } |
223 slot.positions_.push_back(position); | 226 slot.positions_.push_back(position); |
224 ++slot.refs_; | 227 ++slot.refs_; |
225 return &slot; | 228 return &slot; |
226 } | 229 } |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 | 360 |
358 LabelInfo::~LabelInfo() { | 361 LabelInfo::~LabelInfo() { |
359 delete candidates_; | 362 delete candidates_; |
360 } | 363 } |
361 | 364 |
362 // A Shingle is a short fixed-length string of LabelInfos that actually occurs | 365 // A Shingle is a short fixed-length string of LabelInfos that actually occurs |
363 // in a Trace. A Shingle may occur many times. We repesent the Shingle by the | 366 // in a Trace. A Shingle may occur many times. We repesent the Shingle by the |
364 // position of one of the occurrences in the Trace. | 367 // position of one of the occurrences in the Trace. |
365 class Shingle { | 368 class Shingle { |
366 public: | 369 public: |
367 static const uint8 kWidth = 5; | 370 static const uint8_t kWidth = 5; |
368 | 371 |
369 struct InterningLess { | 372 struct InterningLess { |
370 bool operator()(const Shingle& a, const Shingle& b) const; | 373 bool operator()(const Shingle& a, const Shingle& b) const; |
371 }; | 374 }; |
372 | 375 |
373 typedef std::set<Shingle, InterningLess> OwningSet; | 376 typedef std::set<Shingle, InterningLess> OwningSet; |
374 | 377 |
375 static Shingle* Find(const Trace& trace, size_t position, | 378 static Shingle* Find(const Trace& trace, size_t position, |
376 OwningSet* owning_set) { | 379 OwningSet* owning_set) { |
377 std::pair<OwningSet::iterator, bool> pair = | 380 std::pair<OwningSet::iterator, bool> pair = |
378 owning_set->insert(Shingle(trace, position)); | 381 owning_set->insert(Shingle(trace, position)); |
379 // pair.first iterator 'points' to the newly inserted Shingle or the | 382 // pair.first iterator 'points' to the newly inserted Shingle or the |
380 // previouly inserted one that looks the same according to the comparator. | 383 // previouly inserted one that looks the same according to the comparator. |
381 | 384 |
382 // const_cast required because key is const. We modify the Shingle | 385 // const_cast required because key is const. We modify the Shingle |
383 // extensively but not in a way that affects InterningLess. | 386 // extensively but not in a way that affects InterningLess. |
384 Shingle* shingle = const_cast<Shingle*>(&*pair.first); | 387 Shingle* shingle = const_cast<Shingle*>(&*pair.first); |
385 shingle->add_position(position); | 388 shingle->add_position(position); |
386 return shingle; | 389 return shingle; |
387 } | 390 } |
388 | 391 |
389 LabelInfo* at(size_t i) const { return trace_[exemplar_position_ + i]; } | 392 LabelInfo* at(size_t i) const { return trace_[exemplar_position_ + i]; } |
390 void add_position(size_t position) { | 393 void add_position(size_t position) { |
391 positions_.push_back(static_cast<uint32>(position)); | 394 positions_.push_back(static_cast<uint32_t>(position)); |
392 } | 395 } |
393 int position_count() const { return static_cast<int>(positions_.size()); } | 396 int position_count() const { return static_cast<int>(positions_.size()); } |
394 | 397 |
395 bool InModel() const { return at(0)->is_model_; } | 398 bool InModel() const { return at(0)->is_model_; } |
396 | 399 |
397 ShinglePattern* pattern() const { return pattern_; } | 400 ShinglePattern* pattern() const { return pattern_; } |
398 void set_pattern(ShinglePattern* pattern) { pattern_ = pattern; } | 401 void set_pattern(ShinglePattern* pattern) { pattern_ = pattern; } |
399 | 402 |
400 struct PointerLess { | 403 struct PointerLess { |
401 bool operator()(const Shingle* a, const Shingle* b) const { | 404 bool operator()(const Shingle* a, const Shingle* b) const { |
402 // Arbitrary but repeatable (memory-address) independent ordering: | 405 // Arbitrary but repeatable (memory-address) independent ordering: |
403 return a->exemplar_position_ < b->exemplar_position_; | 406 return a->exemplar_position_ < b->exemplar_position_; |
404 // return InterningLess()(*a, *b); | 407 // return InterningLess()(*a, *b); |
405 } | 408 } |
406 }; | 409 }; |
407 | 410 |
408 private: | 411 private: |
409 Shingle(const Trace& trace, size_t exemplar_position) | 412 Shingle(const Trace& trace, size_t exemplar_position) |
410 : trace_(trace), | 413 : trace_(trace), |
411 exemplar_position_(exemplar_position), | 414 exemplar_position_(exemplar_position), |
412 pattern_(NULL) { | 415 pattern_(NULL) { |
413 } | 416 } |
414 | 417 |
415 const Trace& trace_; // The shingle lives inside trace_. | 418 const Trace& trace_; // The shingle lives inside trace_. |
416 size_t exemplar_position_; // At this position (and other positions). | 419 size_t exemplar_position_; // At this position (and other positions). |
417 std::vector<uint32> positions_; // Includes exemplar_position_. | 420 std::vector<uint32_t> positions_; // Includes exemplar_position_. |
418 | 421 |
419 ShinglePattern* pattern_; // Pattern changes as LabelInfos are assigned. | 422 ShinglePattern* pattern_; // Pattern changes as LabelInfos are assigned. |
420 | 423 |
421 friend std::string ToString(const Shingle* instance); | 424 friend std::string ToString(const Shingle* instance); |
422 | 425 |
423 // We can't disallow the copy constructor because we use std::set<Shingle> and | 426 // We can't disallow the copy constructor because we use std::set<Shingle> and |
424 // VS2005's implementation of std::set<T>::set() requires T to have a copy | 427 // VS2005's implementation of std::set<T>::set() requires T to have a copy |
425 // constructor. | 428 // constructor. |
426 // DISALLOW_COPY_AND_ASSIGN(Shingle); | 429 // DISALLOW_COPY_AND_ASSIGN(Shingle); |
427 void operator=(const Shingle&); // Disallow assignment only. | 430 void operator=(const Shingle&); // Disallow assignment only. |
428 }; | 431 }; |
429 | 432 |
430 std::string ToString(const Shingle* instance) { | 433 std::string ToString(const Shingle* instance) { |
431 std::string s; | 434 std::string s; |
432 const char* sep = "<"; | 435 const char* sep = "<"; |
433 for (uint8 i = 0; i < Shingle::kWidth; ++i) { | 436 for (uint8_t i = 0; i < Shingle::kWidth; ++i) { |
434 // base::StringAppendF(&s, "%s%x ", sep, instance.at(i)->label_->rva_); | 437 // base::StringAppendF(&s, "%s%x ", sep, instance.at(i)->label_->rva_); |
435 s += sep; | 438 s += sep; |
436 s += ToString(instance->at(i)); | 439 s += ToString(instance->at(i)); |
437 sep = ", "; | 440 sep = ", "; |
438 } | 441 } |
439 base::StringAppendF(&s, ">(%" PRIuS ")@{%d}", | 442 base::StringAppendF(&s, ">(%" PRIuS ")@{%d}", |
440 instance->exemplar_position_, | 443 instance->exemplar_position_, |
441 instance->position_count()); | 444 instance->position_count()); |
442 return s; | 445 return s; |
443 } | 446 } |
444 | 447 |
445 | 448 |
446 bool Shingle::InterningLess::operator()( | 449 bool Shingle::InterningLess::operator()( |
447 const Shingle& a, | 450 const Shingle& a, |
448 const Shingle& b) const { | 451 const Shingle& b) const { |
449 for (uint8 i = 0; i < kWidth; ++i) { | 452 for (uint8_t i = 0; i < kWidth; ++i) { |
450 LabelInfo* info_a = a.at(i); | 453 LabelInfo* info_a = a.at(i); |
451 LabelInfo* info_b = b.at(i); | 454 LabelInfo* info_b = b.at(i); |
452 if (info_a->label_->rva_ < info_b->label_->rva_) | 455 if (info_a->label_->rva_ < info_b->label_->rva_) |
453 return true; | 456 return true; |
454 if (info_a->label_->rva_ > info_b->label_->rva_) | 457 if (info_a->label_->rva_ > info_b->label_->rva_) |
455 return false; | 458 return false; |
456 if (info_a->is_model_ < info_b->is_model_) | 459 if (info_a->is_model_ < info_b->is_model_) |
457 return true; | 460 return true; |
458 if (info_a->is_model_ > info_b->is_model_) | 461 if (info_a->is_model_ > info_b->is_model_) |
459 return false; | 462 return false; |
(...skipping 11 matching lines...) Expand all Loading... |
471 kVariable = 8 // kind & kVariable == 1 => variable. | 474 kVariable = 8 // kind & kVariable == 1 => variable. |
472 }; | 475 }; |
473 // sequence[position + (kinds_[i] & kOffsetMask)] gives LabelInfo for position | 476 // sequence[position + (kinds_[i] & kOffsetMask)] gives LabelInfo for position |
474 // i of shingle. Below, second 'A' is duplicate of position 1, second '102' | 477 // i of shingle. Below, second 'A' is duplicate of position 1, second '102' |
475 // is duplicate of position 0. | 478 // is duplicate of position 0. |
476 // | 479 // |
477 // <102, A, 103, A , 102> | 480 // <102, A, 103, A , 102> |
478 // --> <kFixed+0, kVariable+1, kFixed+2, kVariable+1, kFixed+0> | 481 // --> <kFixed+0, kVariable+1, kFixed+2, kVariable+1, kFixed+0> |
479 struct Index { | 482 struct Index { |
480 explicit Index(const Shingle* instance); | 483 explicit Index(const Shingle* instance); |
481 uint8 kinds_[Shingle::kWidth]; | 484 uint8_t kinds_[Shingle::kWidth]; |
482 uint8 variables_; | 485 uint8_t variables_; |
483 uint8 unique_variables_; | 486 uint8_t unique_variables_; |
484 uint8 first_variable_index_; | 487 uint8_t first_variable_index_; |
485 uint32 hash_; | 488 uint32_t hash_; |
486 int assigned_indexes_[Shingle::kWidth]; | 489 int assigned_indexes_[Shingle::kWidth]; |
487 }; | 490 }; |
488 | 491 |
489 // ShinglePattern keeps histograms of member Shingle instances, ordered by | 492 // ShinglePattern keeps histograms of member Shingle instances, ordered by |
490 // decreasing number of occurrences. We don't have a pair (occurrence count, | 493 // decreasing number of occurrences. We don't have a pair (occurrence count, |
491 // Shingle instance), so we use a FreqView adapter to make the instance | 494 // Shingle instance), so we use a FreqView adapter to make the instance |
492 // pointer look like the pair. | 495 // pointer look like the pair. |
493 class FreqView { | 496 class FreqView { |
494 public: | 497 public: |
495 explicit FreqView(const Shingle* instance) : instance_(instance) {} | 498 explicit FreqView(const Shingle* instance) : instance_(instance) {} |
(...skipping 23 matching lines...) Expand all Loading... |
519 int program_coverage_; | 522 int program_coverage_; |
520 }; | 523 }; |
521 | 524 |
522 std::string ToString(const ShinglePattern::Index* index) { | 525 std::string ToString(const ShinglePattern::Index* index) { |
523 std::string s; | 526 std::string s; |
524 if (index == NULL) { | 527 if (index == NULL) { |
525 s = "<null>"; | 528 s = "<null>"; |
526 } else { | 529 } else { |
527 base::StringAppendF(&s, "<%d: ", index->variables_); | 530 base::StringAppendF(&s, "<%d: ", index->variables_); |
528 const char* sep = ""; | 531 const char* sep = ""; |
529 for (uint8 i = 0; i < Shingle::kWidth; ++i) { | 532 for (uint8_t i = 0; i < Shingle::kWidth; ++i) { |
530 s += sep; | 533 s += sep; |
531 sep = ", "; | 534 sep = ", "; |
532 uint32 kind = index->kinds_[i]; | 535 uint32_t kind = index->kinds_[i]; |
533 int offset = kind & ShinglePattern::kOffsetMask; | 536 int offset = kind & ShinglePattern::kOffsetMask; |
534 if (kind & ShinglePattern::kVariable) | 537 if (kind & ShinglePattern::kVariable) |
535 base::StringAppendF(&s, "V%d", offset); | 538 base::StringAppendF(&s, "V%d", offset); |
536 else | 539 else |
537 base::StringAppendF(&s, "%d", index->assigned_indexes_[offset]); | 540 base::StringAppendF(&s, "%d", index->assigned_indexes_[offset]); |
538 } | 541 } |
539 base::StringAppendF(&s, " %x", index->hash_); | 542 base::StringAppendF(&s, " %x", index->hash_); |
540 s += ">"; | 543 s += ">"; |
541 } | 544 } |
542 return s; | 545 return s; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 s += HistogramToStringFull(pattern->program_histogram_, " ", max); | 618 s += HistogramToStringFull(pattern->program_histogram_, " ", max); |
616 return s; | 619 return s; |
617 } | 620 } |
618 | 621 |
619 struct ShinglePatternIndexLess { | 622 struct ShinglePatternIndexLess { |
620 bool operator()(const ShinglePattern::Index& a, | 623 bool operator()(const ShinglePattern::Index& a, |
621 const ShinglePattern::Index& b) const { | 624 const ShinglePattern::Index& b) const { |
622 if (a.hash_ < b.hash_) return true; | 625 if (a.hash_ < b.hash_) return true; |
623 if (a.hash_ > b.hash_) return false; | 626 if (a.hash_ > b.hash_) return false; |
624 | 627 |
625 for (uint8 i = 0; i < Shingle::kWidth; ++i) { | 628 for (uint8_t i = 0; i < Shingle::kWidth; ++i) { |
626 if (a.kinds_[i] < b.kinds_[i]) return true; | 629 if (a.kinds_[i] < b.kinds_[i]) return true; |
627 if (a.kinds_[i] > b.kinds_[i]) return false; | 630 if (a.kinds_[i] > b.kinds_[i]) return false; |
628 if ((a.kinds_[i] & ShinglePattern::kVariable) == 0) { | 631 if ((a.kinds_[i] & ShinglePattern::kVariable) == 0) { |
629 if (a.assigned_indexes_[i] < b.assigned_indexes_[i]) | 632 if (a.assigned_indexes_[i] < b.assigned_indexes_[i]) |
630 return true; | 633 return true; |
631 if (a.assigned_indexes_[i] > b.assigned_indexes_[i]) | 634 if (a.assigned_indexes_[i] > b.assigned_indexes_[i]) |
632 return false; | 635 return false; |
633 } | 636 } |
634 } | 637 } |
635 return false; | 638 return false; |
636 } | 639 } |
637 }; | 640 }; |
638 | 641 |
639 static uint32 hash_combine(uint32 h, uint32 v) { | 642 static uint32_t hash_combine(uint32_t h, uint32_t v) { |
640 h += v; | 643 h += v; |
641 return (h * (37 + 0x0000d100)) ^ (h >> 13); | 644 return (h * (37 + 0x0000d100)) ^ (h >> 13); |
642 } | 645 } |
643 | 646 |
644 ShinglePattern::Index::Index(const Shingle* instance) { | 647 ShinglePattern::Index::Index(const Shingle* instance) { |
645 uint32 hash = 0; | 648 uint32_t hash = 0; |
646 variables_ = 0; | 649 variables_ = 0; |
647 unique_variables_ = 0; | 650 unique_variables_ = 0; |
648 first_variable_index_ = 255; | 651 first_variable_index_ = 255; |
649 | 652 |
650 for (uint8 i = 0; i < Shingle::kWidth; ++i) { | 653 for (uint8_t i = 0; i < Shingle::kWidth; ++i) { |
651 LabelInfo* info = instance->at(i); | 654 LabelInfo* info = instance->at(i); |
652 uint8 kind = 0; | 655 uint8_t kind = 0; |
653 int code = -1; | 656 int code = -1; |
654 uint8 j = 0; | 657 uint8_t j = 0; |
655 for ( ; j < i; ++j) { | 658 for ( ; j < i; ++j) { |
656 if (info == instance->at(j)) { // Duplicate LabelInfo | 659 if (info == instance->at(j)) { // Duplicate LabelInfo |
657 kind = kinds_[j]; | 660 kind = kinds_[j]; |
658 break; | 661 break; |
659 } | 662 } |
660 } | 663 } |
661 if (j == i) { // Not found above. | 664 if (j == i) { // Not found above. |
662 if (info->assignment_) { | 665 if (info->assignment_) { |
663 code = info->label_->index_; | 666 code = info->label_->index_; |
664 assigned_indexes_[i] = code; | 667 assigned_indexes_[i] = code; |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 for (Shingle::OwningSet::iterator p = shingle_instances_.begin(); | 938 for (Shingle::OwningSet::iterator p = shingle_instances_.begin(); |
936 p != shingle_instances_.end(); | 939 p != shingle_instances_.end(); |
937 ++p) { | 940 ++p) { |
938 // GCC's set<T>::iterator::operator *() returns a const object. | 941 // GCC's set<T>::iterator::operator *() returns a const object. |
939 Reclassify(const_cast<Shingle*>(&*p)); | 942 Reclassify(const_cast<Shingle*>(&*p)); |
940 } | 943 } |
941 } | 944 } |
942 | 945 |
943 // For the positions in |info|, find the shingles that overlap that position. | 946 // For the positions in |info|, find the shingles that overlap that position. |
944 void AddAffectedPositions(LabelInfo* info, ShingleSet* affected_shingles) { | 947 void AddAffectedPositions(LabelInfo* info, ShingleSet* affected_shingles) { |
945 const uint8 kWidth = Shingle::kWidth; | 948 const uint8_t kWidth = Shingle::kWidth; |
946 for (size_t i = 0; i < info->positions_.size(); ++i) { | 949 for (size_t i = 0; i < info->positions_.size(); ++i) { |
947 size_t position = info->positions_[i]; | 950 size_t position = info->positions_[i]; |
948 // Find bounds to the subrange of |trace_| we are in. | 951 // Find bounds to the subrange of |trace_| we are in. |
949 size_t start = position < model_end_ ? 0 : model_end_; | 952 size_t start = position < model_end_ ? 0 : model_end_; |
950 size_t end = position < model_end_ ? model_end_ : trace_.size(); | 953 size_t end = position < model_end_ ? model_end_ : trace_.size(); |
951 | 954 |
952 // Clip [position-kWidth+1, position+1) | 955 // Clip [position-kWidth+1, position+1) |
953 size_t low = | 956 size_t low = |
954 position > start + kWidth - 1 ? position - kWidth + 1 : start; | 957 position > start + kWidth - 1 ? position - kWidth + 1 : start; |
955 size_t high = position + kWidth < end ? position + 1 : end - kWidth + 1; | 958 size_t high = position + kWidth < end ? position + 1 : end - kWidth + 1; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1052 program_iter != pattern->program_histogram_.end(); | 1055 program_iter != pattern->program_histogram_.end(); |
1053 ++program_iter) { | 1056 ++program_iter) { |
1054 if (++n_program_samples > kUnwieldy) break; | 1057 if (++n_program_samples > kUnwieldy) break; |
1055 const ShinglePattern::FreqView& program_freq = *program_iter; | 1058 const ShinglePattern::FreqView& program_freq = *program_iter; |
1056 int p1 = program_freq.count(); | 1059 int p1 = program_freq.count(); |
1057 const Shingle* program_instance = program_freq.instance(); | 1060 const Shingle* program_instance = program_freq.instance(); |
1058 | 1061 |
1059 // int score = p1; // ? weigh all equally?? | 1062 // int score = p1; // ? weigh all equally?? |
1060 int score = std::min(p1, m1); | 1063 int score = std::min(p1, m1); |
1061 | 1064 |
1062 for (uint8 i = 0; i < Shingle::kWidth; ++i) { | 1065 for (uint8_t i = 0; i < Shingle::kWidth; ++i) { |
1063 LabelInfo* program_info = program_instance->at(i); | 1066 LabelInfo* program_info = program_instance->at(i); |
1064 LabelInfo* model_info = model_instance->at(i); | 1067 LabelInfo* model_info = model_instance->at(i); |
1065 if ((model_info->assignment_ == NULL) != | 1068 if ((model_info->assignment_ == NULL) != |
1066 (program_info->assignment_ == NULL)) { | 1069 (program_info->assignment_ == NULL)) { |
1067 VLOG(2) << "ERROR " << i | 1070 VLOG(2) << "ERROR " << i |
1068 << "\n\t" << ToString(pattern, 10) | 1071 << "\n\t" << ToString(pattern, 10) |
1069 << "\n\t" << ToString(program_instance) | 1072 << "\n\t" << ToString(program_instance) |
1070 << "\n\t" << ToString(model_instance); | 1073 << "\n\t" << ToString(model_instance); |
1071 } | 1074 } |
1072 if (!program_info->assignment_ && !model_info->assignment_) { | 1075 if (!program_info->assignment_ && !model_info->assignment_) { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 | 1271 |
1269 void Solve(const Trace& model, size_t model_end) { | 1272 void Solve(const Trace& model, size_t model_end) { |
1270 base::Time start_time = base::Time::Now(); | 1273 base::Time start_time = base::Time::Now(); |
1271 AssignmentProblem a(model, model_end); | 1274 AssignmentProblem a(model, model_end); |
1272 a.Solve(); | 1275 a.Solve(); |
1273 VLOG(1) << " Adjuster::Solve " | 1276 VLOG(1) << " Adjuster::Solve " |
1274 << (base::Time::Now() - start_time).InSecondsF(); | 1277 << (base::Time::Now() - start_time).InSecondsF(); |
1275 } | 1278 } |
1276 | 1279 |
1277 void ReferenceLabel(Trace* trace, Label* label, bool is_model) { | 1280 void ReferenceLabel(Trace* trace, Label* label, bool is_model) { |
1278 trace->push_back( | 1281 trace->push_back(label_info_maker_.MakeLabelInfo( |
1279 label_info_maker_.MakeLabelInfo(label, is_model, | 1282 label, is_model, static_cast<uint32_t>(trace->size()))); |
1280 static_cast<uint32>(trace->size()))); | |
1281 } | 1283 } |
1282 | 1284 |
1283 AssemblyProgram* prog_; // Program to be adjusted, owned by caller. | 1285 AssemblyProgram* prog_; // Program to be adjusted, owned by caller. |
1284 const AssemblyProgram* model_; // Program to be mimicked, owned by caller. | 1286 const AssemblyProgram* model_; // Program to be mimicked, owned by caller. |
1285 | 1287 |
1286 LabelInfoMaker label_info_maker_; | 1288 LabelInfoMaker label_info_maker_; |
1287 | 1289 |
1288 private: | 1290 private: |
1289 DISALLOW_COPY_AND_ASSIGN(Adjuster); | 1291 DISALLOW_COPY_AND_ASSIGN(Adjuster); |
1290 }; | 1292 }; |
1291 | 1293 |
1292 //////////////////////////////////////////////////////////////////////////////// | 1294 //////////////////////////////////////////////////////////////////////////////// |
1293 | 1295 |
1294 } // namespace adjustment_method_2 | 1296 } // namespace adjustment_method_2 |
1295 | 1297 |
1296 AdjustmentMethod* AdjustmentMethod::MakeShingleAdjustmentMethod() { | 1298 AdjustmentMethod* AdjustmentMethod::MakeShingleAdjustmentMethod() { |
1297 return new adjustment_method_2::Adjuster(); | 1299 return new adjustment_method_2::Adjuster(); |
1298 } | 1300 } |
1299 | 1301 |
1300 } // namespace courgette | 1302 } // namespace courgette |
OLD | NEW |