Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: courgette/adjustment_method_2.cc

Issue 1543643002: Switch to standard integer types in courgette/. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « courgette/adjustment_method.cc ('k') | courgette/assembly_program.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « courgette/adjustment_method.cc ('k') | courgette/assembly_program.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698