Features::Features() { assert(_all.empty()); if (parameter::use_item_features()) { const FeaturePtrs& l = (FeaturePtrs&)ItemFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } if (parameter::use_length_features()) { const FeaturePtrs& l = (FeaturePtrs&)LengthFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } if (parameter::use_quant_features()) { const FeaturePtrs& l = (FeaturePtrs&)QuantFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } if (parameter::use_exists_features()) { const FeaturePtrs& l = (FeaturePtrs&)ExistsFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } if (parameter::use_exists_terminal_features()) { const FeaturePtrs& l = (FeaturePtrs&)ExistsTerminalFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } if (parameter::use_item_child_features()) { const FeaturePtrs& l = (FeaturePtrs&)ItemChildFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } if (parameter::use_range_features()) { const FeaturePtrs& l = (FeaturePtrs&)RangeFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } if (parameter::use_terminal_item_features()) { const FeaturePtrs& l = (FeaturePtrs&)TerminalItemFeatures::instance()->all(); _all.insert(_all.end(), l.begin(), l.end()); } for (FeaturePtrs::const_iterator f = _all.begin(); f != _all.end(); f++) { _id_to_ptr[(*f)->id()] = *f; } _id_to_ptr.lock(); // Lock against subsequent writes. assert(_all.size() == _id_to_ptr.size()); this->create_string_map(); Debug::log(2) << "Features::Features() built " << _all.size() << " features\n"; EMPTY_FEATURE_ID.create(); assert(!EMPTY_FEATURE_ID.empty()); }