#include #include #include #include #include #include class FCNode { public: FCNode(const std::string& name, const uint32_t& weight, const double& coverage) : name(name), weight(weight), coverage(coverage), parent(NULL) {} void add_children(const std::vector>& nodes) { for ( const std::shared_ptr& node : nodes ) { node->parent = this; children.emplace_back(node); update_coverage(); } } double get_coverage() { return coverage; } void set_coverage(const double& aCoverage) { if ( coverage != aCoverage ) { coverage = aCoverage; if ( parent ) { parent->update_coverage(); } } } void display() { display(0); } private: void update_coverage() { double sum_weighted_coverage = 0.0; uint32_t sum_weight = 0; for ( const std::shared_ptr& node : children ) { sum_weighted_coverage += node->weight * node->coverage; sum_weight += node->weight; } set_coverage(sum_weighted_coverage / sum_weight); } void display(uint32_t level) { const std::string initial = std::string(4 * level, ' ') + name; const std::string padding = std::string(NAME_FIELD_WIDTH - initial.length(), ' '); std::cout << initial + padding + "|"; std::cout << " " << std::setw(3) << weight << " |"; std::cout << " " << std::fixed << std::setprecision(6) << coverage << " |" << std::endl; for ( const std::shared_ptr& child : children ) { child->display(level + 1); } } std::string name; uint32_t weight; double coverage; FCNode* parent; std::vector> children{ }; static constexpr uint32_t NAME_FIELD_WIDTH = 32; }; int main() { FCNode cleaning("Cleaning", 1, 0.0); std::vector> houses = { std::make_shared("House_1", 40, 0.0), std::make_shared("House_2", 60, 0.0) }; cleaning.add_children(houses); std::vector> house_1 = { std::make_shared("Bedrooms", 1, 0.25), std::make_shared("Bathrooms", 1, 0.0), std::make_shared("Attic", 1, 0.75), std::make_shared("Kitchen", 1, 0.1), std::make_shared("Living_rooms", 1, 0.0), std::make_shared("Basement", 1, 0.0), std::make_shared("Garage", 1, 0.0), std::make_shared("Garden",1, 0.8) }; houses[0]->add_children(house_1); std::vector> bathrooms_house_1 = { std::make_shared("Bathroom_1", 1, 0.5), std::make_shared("Bathroom_2", 1, 0.0), std::make_shared("Outside_lavatory", 1, 1.0) }; house_1[1]->add_children(bathrooms_house_1); std::vector> living_rooms_house_1 = { std::make_shared("lounge", 1, 0.0), std::make_shared("Dining_room", 1, 0.0), std::make_shared("Conservatory", 1, 0.0), std::make_shared("Playroom", 1, 1.0) }; house_1[4]->add_children(living_rooms_house_1); std::vector> house_2 = { std::make_shared("Upstairs", 1, 0.15), std::make_shared("Ground_floor", 1, 0.316667), std::make_shared("Basement", 1, 0.916667) }; houses[1]->add_children(house_2); std::vector> upstairs = { std::make_shared("Bedrooms", 1, 0.0), std::make_shared("Bathroom", 1, 0.0), std::make_shared("Toilet", 1, 0.0), std::make_shared("Attics", 1, 0.6) }; house_2[0]->add_children(upstairs); std::vector> ground_floor = { std::make_shared("Kitchen", 1, 0.0), std::make_shared("Living_rooms", 1, 0.0), std::make_shared("Wet_room_&_toilet", 1, 0.0), std::make_shared("Garage", 1, 0.0), std::make_shared("Garden", 1, 0.9), std::make_shared("Hot_tub_suite", 1, 1.0) }; house_2[1]->add_children(ground_floor); std::vector> basement = { std::make_shared("Cellars", 1, 1.0), std::make_shared("Wine_cellar", 1, 1.0), std::make_shared("Cinema", 1, 0.75) }; house_2[2]->add_children(basement); std::vector> bedrooms = { std::make_shared("Suite_1", 1, 0.0), std::make_shared("Suite_2", 1, 0.0), std::make_shared("Bedroom_3",1, 0.0), std::make_shared("Bedroom_4",1, 0.0) }; upstairs[0]->add_children(bedrooms); std::vector> living_rooms_house_2 = { std::make_shared("lounge", 1, 0.0), std::make_shared("Dining_room", 1, 0.0), std::make_shared("Conservatory", 1, 0.0), std::make_shared("Playroom", 1, 0.0) }; ground_floor[1]->add_children(living_rooms_house_2); const double overall_coverage = cleaning.get_coverage(); std::cout << "OVERALL COVERAGE = " << std::fixed << std::setprecision(6) << overall_coverage << std::endl << std::endl; std::cout << "NAME HIERARCHY | WEIGHT | COVERAGE |" << std::endl; std::cout << "--------------------------------|--------|----------|" << std::endl; cleaning.display(); std::cout << std::endl; basement[2]->set_coverage(1.0); // Change House_2 Cinema node coverage to 1.0 const double updated_coverage = cleaning.get_coverage(); const double difference = updated_coverage - overall_coverage; std::cout << "If the coverage of the House_2 Cinema node were increased " << std::endl; std::cout << "from 0.75 to 1.0 the overall coverage would increase by "; std::cout << std::fixed << std::setprecision(6) << difference << " to " << updated_coverage << std::endl; basement[2]->set_coverage(0.75); // Restore to House_2 Cinema node coverage to its original value }