36 _summary_surv_rates_len(summary_surv_rates_len), |
36 _summary_surv_rates_len(summary_surv_rates_len), |
37 _summary_surv_rates_max_len(0), |
37 _summary_surv_rates_max_len(0), |
38 _summary_surv_rates(NULL), |
38 _summary_surv_rates(NULL), |
39 _surv_rate(NULL), |
39 _surv_rate(NULL), |
40 _accum_surv_rate_pred(NULL), |
40 _accum_surv_rate_pred(NULL), |
41 _surv_rate_pred(NULL) |
41 _surv_rate_pred(NULL), |
42 { |
42 _stats_arrays_length(0) { |
43 reset(); |
43 reset(); |
44 if (summary_surv_rates_len > 0) { |
44 if (summary_surv_rates_len > 0) { |
45 size_t length = summary_surv_rates_len; |
45 size_t length = summary_surv_rates_len; |
46 _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length); |
46 _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length); |
47 if (_summary_surv_rates == NULL) { |
47 for (size_t i = 0; i < length; ++i) { |
48 vm_exit_out_of_memory(sizeof(NumberSeq*) * length, |
|
49 "Not enough space for surv rate summary"); |
|
50 } |
|
51 for (size_t i = 0; i < length; ++i) |
|
52 _summary_surv_rates[i] = new NumberSeq(); |
48 _summary_surv_rates[i] = new NumberSeq(); |
|
49 } |
53 } |
50 } |
54 |
51 |
55 start_adding_regions(); |
52 start_adding_regions(); |
56 } |
53 } |
57 |
54 |
58 |
55 void SurvRateGroup::reset() { |
59 void SurvRateGroup::reset() |
|
60 { |
|
61 _all_regions_allocated = 0; |
56 _all_regions_allocated = 0; |
62 _setup_seq_num = 0; |
57 _setup_seq_num = 0; |
63 _stats_arrays_length = 0; |
|
64 _accum_surv_rate = 0.0; |
58 _accum_surv_rate = 0.0; |
65 _last_pred = 0.0; |
59 _last_pred = 0.0; |
66 // the following will set up the arrays with length 1 |
60 // the following will set up the arrays with length 1 |
67 _region_num = 1; |
61 _region_num = 1; |
|
62 |
|
63 // The call to stop_adding_regions() will use "new" to refill |
|
64 // the _surv_rate_pred array, so we need to make sure to call |
|
65 // "delete". |
|
66 for (size_t i = 0; i < _stats_arrays_length; ++i) { |
|
67 delete _surv_rate_pred[i]; |
|
68 } |
|
69 _stats_arrays_length = 0; |
|
70 |
68 stop_adding_regions(); |
71 stop_adding_regions(); |
69 guarantee( _stats_arrays_length == 1, "invariant" ); |
72 guarantee( _stats_arrays_length == 1, "invariant" ); |
70 guarantee( _surv_rate_pred[0] != NULL, "invariant" ); |
73 guarantee( _surv_rate_pred[0] != NULL, "invariant" ); |
71 _surv_rate_pred[0]->add(0.4); |
74 _surv_rate_pred[0]->add(0.4); |
72 all_surviving_words_recorded(false); |
75 all_surviving_words_recorded(false); |
73 _region_num = 0; |
76 _region_num = 0; |
74 } |
77 } |
75 |
78 |
76 |
|
77 void |
79 void |
78 SurvRateGroup::start_adding_regions() { |
80 SurvRateGroup::start_adding_regions() { |
79 _setup_seq_num = _stats_arrays_length; |
81 _setup_seq_num = _stats_arrays_length; |
80 _region_num = 0; |
82 _region_num = 0; |
81 _accum_surv_rate = 0.0; |
83 _accum_surv_rate = 0.0; |
82 |
|
83 #if 0 |
|
84 gclog_or_tty->print_cr("[%s] start adding regions, seq num %d, length %d", |
|
85 _name, _setup_seq_num, _region_num); |
|
86 #endif // 0 |
|
87 } |
84 } |
88 |
85 |
89 void |
86 void |
90 SurvRateGroup::stop_adding_regions() { |
87 SurvRateGroup::stop_adding_regions() { |
91 |
|
92 #if 0 |
|
93 gclog_or_tty->print_cr("[%s] stop adding regions, length %d", _name, _region_num); |
|
94 #endif // 0 |
|
95 |
|
96 if (_region_num > _stats_arrays_length) { |
88 if (_region_num > _stats_arrays_length) { |
97 double* old_surv_rate = _surv_rate; |
89 double* old_surv_rate = _surv_rate; |
98 double* old_accum_surv_rate_pred = _accum_surv_rate_pred; |
90 double* old_accum_surv_rate_pred = _accum_surv_rate_pred; |
99 TruncatedSeq** old_surv_rate_pred = _surv_rate_pred; |
91 TruncatedSeq** old_surv_rate_pred = _surv_rate_pred; |
100 |
92 |
101 _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num); |
93 _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num); |
102 if (_surv_rate == NULL) { |
|
103 vm_exit_out_of_memory(sizeof(double) * _region_num, |
|
104 "Not enough space for surv rate array."); |
|
105 } |
|
106 _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num); |
94 _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num); |
107 if (_accum_surv_rate_pred == NULL) { |
|
108 vm_exit_out_of_memory(sizeof(double) * _region_num, |
|
109 "Not enough space for accum surv rate pred array."); |
|
110 } |
|
111 _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num); |
95 _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num); |
112 if (_surv_rate == NULL) { |
96 |
113 vm_exit_out_of_memory(sizeof(TruncatedSeq*) * _region_num, |
97 for (size_t i = 0; i < _stats_arrays_length; ++i) { |
114 "Not enough space for surv rate pred array."); |
|
115 } |
|
116 |
|
117 for (size_t i = 0; i < _stats_arrays_length; ++i) |
|
118 _surv_rate_pred[i] = old_surv_rate_pred[i]; |
98 _surv_rate_pred[i] = old_surv_rate_pred[i]; |
119 |
99 } |
120 #if 0 |
|
121 gclog_or_tty->print_cr("[%s] stop adding regions, new seqs %d to %d", |
|
122 _name, _array_length, _region_num - 1); |
|
123 #endif // 0 |
|
124 |
|
125 for (size_t i = _stats_arrays_length; i < _region_num; ++i) { |
100 for (size_t i = _stats_arrays_length; i < _region_num; ++i) { |
126 _surv_rate_pred[i] = new TruncatedSeq(10); |
101 _surv_rate_pred[i] = new TruncatedSeq(10); |
127 // _surv_rate_pred[i]->add(last_pred); |
|
128 } |
102 } |
129 |
103 |
130 _stats_arrays_length = _region_num; |
104 _stats_arrays_length = _region_num; |
131 |
105 |
132 if (old_surv_rate != NULL) |
106 if (old_surv_rate != NULL) { |
133 FREE_C_HEAP_ARRAY(double, old_surv_rate); |
107 FREE_C_HEAP_ARRAY(double, old_surv_rate); |
134 if (old_accum_surv_rate_pred != NULL) |
108 } |
|
109 if (old_accum_surv_rate_pred != NULL) { |
135 FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred); |
110 FREE_C_HEAP_ARRAY(double, old_accum_surv_rate_pred); |
136 if (old_surv_rate_pred != NULL) |
111 } |
137 FREE_C_HEAP_ARRAY(NumberSeq*, old_surv_rate_pred); |
112 if (old_surv_rate_pred != NULL) { |
138 } |
113 FREE_C_HEAP_ARRAY(TruncatedSeq*, old_surv_rate_pred); |
139 |
114 } |
140 for (size_t i = 0; i < _stats_arrays_length; ++i) |
115 } |
|
116 |
|
117 for (size_t i = 0; i < _stats_arrays_length; ++i) { |
141 _surv_rate[i] = 0.0; |
118 _surv_rate[i] = 0.0; |
|
119 } |
142 } |
120 } |
143 |
121 |
144 double |
122 double |
145 SurvRateGroup::accum_surv_rate(size_t adjustment) { |
123 SurvRateGroup::accum_surv_rate(size_t adjustment) { |
146 // we might relax this one in the future... |
124 // we might relax this one in the future... |