修改生成数据方式和网络训练方式
This commit is contained in:
134
generator.py
134
generator.py
@ -1,3 +1,6 @@
|
||||
import random
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
from base_optimizer.optimizer_common import *
|
||||
@ -8,53 +11,58 @@ class DataMgr:
|
||||
self.min_placement_points = 100
|
||||
self.max_placement_points = 800
|
||||
|
||||
self.max_component_types = 50
|
||||
self.max_component_types = 30
|
||||
self.default_feeder_limit = 1
|
||||
self.nozzle_type_list = ['CN065', 'CN140', 'CN220', 'CN040']
|
||||
|
||||
self.x_range = [50, 100, 150, 200, 300, 400, 500]
|
||||
self.y_range = [50, 100, 150, 200, 300, 400, 500]
|
||||
# self.x_range = [50, 100, 150, 200, 300, 400, 500]
|
||||
# self.y_range = [50, 100, 150, 200, 300, 400, 500]
|
||||
|
||||
self.x_range = [400]
|
||||
self.y_range = [200]
|
||||
|
||||
self.counter = 0
|
||||
self.update = 10
|
||||
self.pre_file = None
|
||||
self.part_col = ["part", "desc", "fdr", "nz", 'camera', 'group', 'feeder-limit', 'points']
|
||||
self.component_data = pd.DataFrame(columns=self.part_col) # the component list update for several rounds
|
||||
|
||||
def generator(self):
|
||||
def generator(self, mode='Train'):
|
||||
boundary = [random.choice(self.x_range), random.choice(self.y_range)]
|
||||
total_points = random.randint(self.min_placement_points, self.max_placement_points)
|
||||
|
||||
# determine the nozzle type of component
|
||||
component_list = defaultdict(str)
|
||||
for cp_idx in range(min(random.randint(1, self.max_component_types), total_points)):
|
||||
component_list['C' + str(cp_idx)] = random.choice(self.nozzle_type_list)
|
||||
if self.counter % 10 == 0 or mode == 'test':
|
||||
self.component_data = self.component_data.loc[[]]
|
||||
total_points = random.randint(self.min_placement_points, self.max_placement_points)
|
||||
total_nozzles = random.randint(1, len(self.nozzle_type_list))
|
||||
selected_nozzle = random.sample(self.nozzle_type_list, total_nozzles)
|
||||
for cp_idx in range(min(random.randint(1, self.max_component_types), total_points)):
|
||||
part, nozzle = 'C' + str(cp_idx), random.choice(selected_nozzle)
|
||||
self.component_data = pd.concat([self.component_data, pd.DataFrame(
|
||||
[part, '', 'SM8', nozzle, '飞行相机1', 'CHIP-Rect', self.default_feeder_limit, 0],
|
||||
index=self.part_col).T], ignore_index=True)
|
||||
|
||||
random_fractions = np.random.rand(len(self.component_data))
|
||||
normalized_fractions = random_fractions / random_fractions.sum()
|
||||
for cp_idx, fraction in enumerate(normalized_fractions):
|
||||
self.component_data.iloc[cp_idx].points = round(fraction * total_points)
|
||||
|
||||
step_col = ["ref", "x", "y", "z", "r", "part", "desc", "fdr", "nz", "hd", "cs", "cy", "sk", "bl", "ar", "pl", "lv"]
|
||||
pcb_data = pd.DataFrame(columns=step_col)
|
||||
idx = 1
|
||||
for _, data in self.component_data.iterrows():
|
||||
for _ in range(data.points):
|
||||
part, nozzle = data.part, data.nz
|
||||
pos_x, pos_y = np.random.uniform(0, boundary[0]), np.random.uniform(0, boundary[1])
|
||||
pcb_data = pd.concat([pcb_data, pd.DataFrame([['R' + str(idx), -pos_x, pos_y,
|
||||
0.000, 0.000, part, '', 'A', '1-0 ' + nozzle, 1, 1, 1, 0,
|
||||
1, 1, 1, 'L0']], columns=pcb_data.columns)], ignore_index=True)
|
||||
idx += 1
|
||||
|
||||
for idx in range(total_points):
|
||||
part = random.choice(list(component_list.keys()))
|
||||
nozzle = component_list[part]
|
||||
|
||||
pos_x, pos_y = np.random.uniform(0, boundary[0]), np.random.uniform(0, boundary[1])
|
||||
pcb_data = pd.concat([pcb_data, pd.DataFrame([['R' + str(idx), -pos_x, pos_y,
|
||||
0.000, 0.000, part, '', 'A', '1-0 ' + nozzle, 1, 1, 1, 0,
|
||||
1, 1, 1, 'L0']], columns=pcb_data.columns)], ignore_index=True)
|
||||
|
||||
part_col = ["part", "desc", "fdr", "nz", 'camera', 'group', 'feeder-limit', 'points']
|
||||
component_data = pd.DataFrame(columns=part_col)
|
||||
|
||||
for _, data in pcb_data.iterrows():
|
||||
part, nozzle = data.part, data.nz.split(' ')[1]
|
||||
if part not in component_data['part'].values:
|
||||
component_data = pd.concat([component_data, pd.DataFrame(
|
||||
[part, '', 'SM8', nozzle, '飞行相机1', 'CHIP-Rect', self.default_feeder_limit, 0], index=part_col).T],
|
||||
ignore_index=True)
|
||||
|
||||
part_index = component_data[component_data['part'] == part].index.tolist()[0]
|
||||
component_data.loc[part_index, 'points'] += 1
|
||||
self.counter += 1
|
||||
return pcb_data, component_data
|
||||
return pcb_data, self.component_data
|
||||
|
||||
def recorder(self, file_path, info: OptInfo, pcb_data, component_data):
|
||||
def recorder(self, file_handle, info: OptInfo, pcb_data, component_data):
|
||||
lineinfo = '{:.6f}'.format(info.placement_time) + '\t' + str(info.cycle_counter) + '\t' + str(
|
||||
info.nozzle_change_counter) + '\t' + str(info.pickup_counter) + '\t' + '{:.3f}'.format(
|
||||
info.pickup_movement) + '\t' + '{:.3f}'.format(info.placement_movement)
|
||||
@ -62,6 +70,11 @@ class DataMgr:
|
||||
lineinfo += '\t' + '{:.3f}'.format(pcb_data['x'].max() - pcb_data['x'].min()) + '\t' + '{:.3f}'.format(
|
||||
pcb_data['y'].max() - pcb_data['y'].min())
|
||||
|
||||
part_xposition, part_yposition = defaultdict(list), defaultdict(list)
|
||||
for _, data in pcb_data.iterrows():
|
||||
part_xposition[data['part']].append(data['x'])
|
||||
part_yposition[data['part']].append(data['y'])
|
||||
|
||||
point_counter, component_counter = 0, 0
|
||||
nozzle_type = set()
|
||||
for _, data in component_data.iterrows():
|
||||
@ -75,11 +88,12 @@ class DataMgr:
|
||||
|
||||
for _, data in component_data.iterrows():
|
||||
lineinfo += '\t' + data.part + '\t' + data.nz + '\t' + str(data.points)
|
||||
lineinfo += '\n'
|
||||
# lineinfo += '\t' + str(
|
||||
# round((np.average(part_xposition[data.part]) + stopper_pos[0] - slotf1_pos[0]) / slot_interval))
|
||||
|
||||
lineinfo += '\n'
|
||||
file_handle.write(lineinfo)
|
||||
|
||||
with open(file_path, 'a') as f:
|
||||
f.write(lineinfo)
|
||||
f.close()
|
||||
|
||||
def saver(self, file_path: str, pcb_data):
|
||||
lineinfo = ''
|
||||
@ -103,12 +117,23 @@ class DataMgr:
|
||||
for idx, nozzle in enumerate(self.nozzle_type_list):
|
||||
cp2nz[nozzle] = idx
|
||||
|
||||
# === general info ===
|
||||
total_points = sum(points for points in cp_points.values())
|
||||
total_component_types, total_nozzle_types = len(cp_points.keys()), len(set(cp_nozzle.values()))
|
||||
data = [total_points, total_component_types, total_nozzle_types]
|
||||
data.extend([width, height])
|
||||
|
||||
# === nozzle info ===
|
||||
data_slice = [0 for _ in range(len(self.nozzle_type_list))]
|
||||
for component, points in cp_points.items():
|
||||
idx = cp2nz[cp_nozzle[component]]
|
||||
data_slice[idx] += points
|
||||
data.extend(data_slice)
|
||||
|
||||
# === component info ===
|
||||
cp_items = [[component, points] for component, points in cp_points.items()]
|
||||
cp_items = sorted(cp_items, key=lambda x: (-x[1], x[0]))
|
||||
for component, points in cp_items:
|
||||
nozzle = cp_nozzle[component]
|
||||
|
||||
data_slice = [0 for _ in range(len(self.nozzle_type_list))]
|
||||
@ -120,15 +145,43 @@ class DataMgr:
|
||||
|
||||
return data
|
||||
|
||||
def decode(self, line_info):
|
||||
boundary = [random.choice(self.x_range), random.choice(self.y_range)]
|
||||
items = line_info.split('\t')
|
||||
total_points, total_component_types = int(items[8]), int(items[9])
|
||||
|
||||
part_col = ["part", "desc", "fdr", "nz", 'camera', 'group', 'feeder-limit', 'points']
|
||||
step_col = ["ref", "x", "y", "z", "r", "part", "desc", "fdr", "nz", "hd", "cs", "cy", "sk", "bl", "ar", "pl",
|
||||
"lv"]
|
||||
|
||||
component_data = pd.DataFrame(columns=part_col)
|
||||
pcb_data = pd.DataFrame(columns=step_col)
|
||||
|
||||
idx = 1
|
||||
for cp_counter in range(total_component_types):
|
||||
# todo: 这里为了调试暂时未修改
|
||||
part, nozzle = items[11 + cp_counter * 3], items[12 + cp_counter * 3]
|
||||
points = int(items[13 + cp_counter * 3])
|
||||
|
||||
component_data = pd.concat([component_data, pd.DataFrame(
|
||||
[part, '', 'SM8', nozzle, '飞行相机1', 'CHIP-Rect', self.default_feeder_limit, points], index=part_col).T],
|
||||
ignore_index=True)
|
||||
|
||||
for _ in range(points):
|
||||
pos_x, pos_y = np.random.uniform(0, boundary[0]), np.random.uniform(0, boundary[1])
|
||||
pcb_data = pd.concat([pcb_data, pd.DataFrame([['R' + str(idx), -pos_x, pos_y, 0.000, 0.000, part, '',
|
||||
'A', '1-0 ' + nozzle, 1, 1, 1, 0, 1, 1, 1, 'L0']],
|
||||
columns=pcb_data.columns)], ignore_index=True)
|
||||
return pcb_data, component_data
|
||||
|
||||
def loader(self, file_path):
|
||||
train_data, time_data = [], []
|
||||
cycle_data, nozzle_change_data, pickup_data, movement_data, point_data = [], [], [], [], []
|
||||
pcb_width, pcb_height = [], []
|
||||
with open(file_path, 'r') as file:
|
||||
line = file.readline()
|
||||
while line:
|
||||
items = line.split('\t')
|
||||
total_points, total_component_types = int(items[8]), int(items[9])
|
||||
total_points, total_component_types = float(items[8]), float(items[9])
|
||||
|
||||
cycle_data.append(float(items[1]))
|
||||
nozzle_change_data.append(float(items[2]))
|
||||
@ -140,7 +193,7 @@ class DataMgr:
|
||||
time_data.append(float(items[0]))
|
||||
|
||||
cp_points, cp_nozzle = defaultdict(int), defaultdict(str)
|
||||
for cp_counter in range(total_component_types):
|
||||
for cp_counter in range(int(total_component_types)):
|
||||
component_type, nozzle_type = items[11 + cp_counter * 3], items[12 + cp_counter * 3]
|
||||
points = int(items[13 + cp_counter * 3])
|
||||
|
||||
@ -152,5 +205,8 @@ class DataMgr:
|
||||
return train_data, time_data, cycle_data, nozzle_change_data, pickup_data, movement_data, point_data
|
||||
|
||||
def get_feature(self):
|
||||
return self.max_component_types * len(self.nozzle_type_list) + 5
|
||||
return (self.max_component_types + 1) * len(self.nozzle_type_list) + 5
|
||||
|
||||
def get_update_round(self):
|
||||
return self.update
|
||||
|
||||
|
Reference in New Issue
Block a user