Files
AdventOfCode2023/05/05-2-multiprocess-with-gpu.py
2023-12-09 21:34:50 +01:00

118 lines
3.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from multiprocessing import Pool
from time import time
import numpy as np
from numba import njit
start = time()
seeds = np.ndarray([]) # 0
seed_to_soil = [] # 1
soil_to_fertilizer = [] # 2
fertilizer_to_water = [] # 3
water_to_light = [] # 4
light_to_temperature = [] # 5
temperature_to_humidity = [] # 6
humidity_to_location = [] # 7
list_number = 0
# parse input
input_file = open("input", "r")
for line in input_file:
line = line.strip()
if line == "":
continue
if line.startswith('seeds: '):
seeds = [int(x) for x in line.replace('seeds: ', '').split()]
if line == "seed-to-soil map:":
list_number = 1
continue
if line == "soil-to-fertilizer map:":
list_number = 2
continue
if line == "fertilizer-to-water map:":
list_number = 3
continue
if line == "water-to-light map:":
list_number = 4
continue
if line == "light-to-temperature map:":
list_number = 5
continue
if line == "temperature-to-humidity map:":
list_number = 6
continue
if line == "humidity-to-location map:":
list_number = 7
continue
if list_number == 1:
seed_to_soil.append([int(x) for x in line.split()])
elif list_number == 2:
soil_to_fertilizer.append([int(x) for x in line.split()])
elif list_number == 3:
fertilizer_to_water.append([int(x) for x in line.split()])
elif list_number == 4:
water_to_light.append([int(x) for x in line.split()])
elif list_number == 5:
light_to_temperature.append([int(x) for x in line.split()])
elif list_number == 6:
temperature_to_humidity.append([int(x) for x in line.split()])
elif list_number == 7:
humidity_to_location.append([int(x) for x in line.split()])
input_file.close()
seed_to_soil = np.asarray(seed_to_soil)
soil_to_fertilizer = np.asarray(soil_to_fertilizer)
fertilizer_to_water = np.asarray(fertilizer_to_water)
water_to_light = np.asarray(water_to_light)
light_to_temperature = np.asarray(light_to_temperature)
temperature_to_humidity = np.asarray(temperature_to_humidity)
humidity_to_location = np.asarray(humidity_to_location)
@njit
def find_dest(num, map_list):
for m in map_list:
if m[1] <= num < m[1] + m[2]:
return num - m[1] + m[0]
return num
@njit
def find_min(seed, ra):
min_location = - 1
print(f"gestartet: Seed: {seed} Range: {ra}")
for s in range(seed, seed + ra):
soil = find_dest(s, seed_to_soil)
fertilizer = find_dest(soil, soil_to_fertilizer)
water = find_dest(fertilizer, fertilizer_to_water)
light = find_dest(water, water_to_light)
temperature = find_dest(light, light_to_temperature)
humidity = find_dest(temperature, temperature_to_humidity)
location = find_dest(humidity, humidity_to_location)
if min_location == -1:
min_location = location
elif location < min_location:
min_location = location
print(f"beendet.. Seed: {seed} Range: {ra} MinLocation: {min_location}")
return min_location
if __name__ == '__main__':
num_processes = 10
input_data = []
for i in range(0, len(seeds), 2):
input_data.append((seeds[i], seeds[i+1]))
# input_data manuell erstellt:
# input_data = [(seeds[0], seeds[1]), (seeds[2], seeds[3]), (seeds[4], seeds[5]), (seeds[6], seeds[7]),
# (seeds[8], seeds[9]), (seeds[10], seeds[11]), (seeds[12], seeds[13]), (seeds[14], seeds[15]),
# (seeds[16], seeds[17]), (seeds[18], seeds[19])]
with Pool(processes=num_processes) as pool:
results = pool.starmap(find_min, input_data)
print(results)
print(f"kleinste Location: {min(results)}")
print(f"Script beendet! Benötigte Zeit in Sekunden: {int(time()-start)}")