ЛР-7 / ЯП №7
.pdfLampConfig("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
