Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР-7 / ЯП №7

.pdf
Скачиваний:
1
Добавлен:
06.06.2026
Размер:
544 Кб
Скачать
☆

LampConfig("lamp_005", GeoCoord(56.53, 85.02), 5500, 55.0, SunSchedule(6.5, 19.5)),

)

readings = (

SensorReading("lamp_001", 22.0, 2.0, False), SensorReading("lamp_002", 22.0, 150.0, False), SensorReading("lamp_003", 22.0, 1.0, True), SensorReading("lamp_004", 14.0, 800.0, False), SensorReading("lamp_005", 22.0, 3.0, False),

)

print("\n1. ИММУТАБЕЛЬНЫЕ ДАННЫЕ:") print(f" Лампы: {len(lamps)} шт. (frozen dataclass)")

print(f" Показания: {len(readings)} шт. (frozen dataclass)") print(f" Попытка изменения вызовет AttributeError")

print("\n2. МОНАДА MAYBE (обработка сбоя датчика):") sensor_broken = Maybe(None)

sensor_ok = Maybe(150.0)

print(f" Сбой датчика: {sensor_broken} -> яркость: {sensor_broken.map(lambda x: calculate_brightness(x, False, 19.5, 22.0, 5000)).get_or_else(50.0)}%")

print(f" Нормальный: {sensor_ok} -> яркость: {sensor_ok.map(lambda x: calculate_brightness(x, False, 19.5, 22.0, 5000)).get_or_else(50.0)}%")

print("\n3. ЛЯМБДА-ФИЛЬТРЫ:")

print(f" Критически темные (< {CRITICAL_DARK} lux): {[r.lamp_id for r in filter(is_critical_post, readings)]}")

print(f" Ночные посты: {[r.lamp_id for r in filter(is_night_time, readings)]}")

print("\n4. ФВП manage_grid + стратегия диммирования:")

def energy_save_strategy(states: List[LampState]) -> List[LampState]: return [replace(s, brightness_percent=s.brightness_percent * 0.8,

power_consumption=s.power_consumption * 0.8) for s in states]

grid_states = manage_grid( lambda r: r.lux < 200, energy_save_strategy, lamps, readings

)

for s in grid_states:

print(f" {s.lamp_id}: {s.brightness_percent:.1f}% | {s.power_consumption:.1f}Вт | emergency={s.is_emergency}")

print("\n5. REDUCE (свёртка метрик):") metrics = reduce_grid_consumption(grid_states) for k, v in metrics.items():

print(f" {k}: {v:.4f}" if isinstance(v, float) else f" {k}: {v}")

print("\n6. РЕКУРСИЯ (каскадное отключение электросети):") line_tree = PowerLineNode("main", (

PowerLineNode("sub_1", (PowerLineNode("line_1"), PowerLineNode("line_2"))),

11

PowerLineNode("sub_2", (PowerLineNode("line_3"), PowerLineNode("line_4", (PowerLineNode("line_5"),)))),

))

def tree_to_str(node, level=0):

lines = [" " * level + f"{node.node_id}: active={node.is_active}"] for c in node.children:

lines.extend(tree_to_str(c, level + 1)) return lines

print(" До:") print("\n".join(tree_to_str(line_tree)))

disabled = cascade_disconnect(line_tree, "line_4") print(" После отключения line_4:") print("\n".join(tree_to_str(disabled)))

print("\n7. ПАРАЛЛЕЛЬНЫЙ MAP/REDUCE (100 ламп, 4 воркера):") big_lamps, big_readings = generate_test_data(100)

parallel_result = parallel_process_lamps(big_lamps, big_readings, num_workers=4) parallel_metrics = reduce_grid_consumption(parallel_result)

print(f" Обработано ламп: {len(parallel_result)}")

print(f" Потребление: {parallel_metrics['total_kwh']:.4f} кВт·ч") print(f" Средняя яркость: {parallel_metrics['avg_brightness']:.2f}%") print(f" Аварийных: {parallel_metrics['emergency_count']}")

print("\n8. КАРРИРОВАНИЕ (праздничные профили):") ny = apply_holiday_profile("New_Year")

print(f" {ny('soft')('lamp_001')}") print(f" {ny('bright')('lamp_002')}")

if __name__ == '__main__': run_demo()

12

Соседние файлы в папке ЛР-7