def adj_fuse_touch()

in utils.py [0:0]


def adj_fuse_touch(verts, faces, adj, args):
	verts = verts.data.cpu().numpy()
	hash = {}

	# find vertices which have the same 3D position
	for e, v in enumerate(verts):
		if v.tobytes() in hash:
			hash[v.tobytes()].append(e)
		else:
			hash[v.tobytes()] = [e]

	# load object information for generic touch chart
	sheet = import_obj('../data/initial_sheet.obj')
	sheet_verts = torch.FloatTensor(np.array(sheet.vertices)).cuda()
	sheet_faces = torch.LongTensor(np.array(sheet.faces) - 1).cuda()
	sheet_adj = calc_adj(sheet_faces)

	# central vertex for each touch chart that will communicate with all vision charts
	central_point = 4
	central_points = [central_point + (i * sheet_adj.shape[0]) + adj.shape[0] for i in range(4 * args.num_grasps)]

	# define and fill new adjacency matrix with vision and touch charts
	new_dim = adj.shape[0] + (4 * args.num_grasps * sheet_adj.shape[0])
	new_adj = torch.zeros((new_dim, new_dim)).cuda()
	new_adj[: adj.shape[0], :adj.shape[0]] = adj.clone()
	for i in range(4 * args.num_grasps):
		start = adj.shape[0] + (sheet_adj.shape[0] * i)
		end = adj.shape[0] + (sheet_adj.shape[0] * (i + 1))
		new_adj[start: end, start:end] = sheet_adj.clone()
	adj = new_adj

	# define new faces with vision and touch charts
	all_faces = [faces]
	for i in range(4 * args.num_grasps):
		temp_sheet_faces = sheet_faces.clone() + verts.shape[0]
		temp_sheet_faces += i * sheet_verts.shape[0]
		all_faces.append(temp_sheet_faces)
	faces = torch.cat(all_faces)

	# update adjacency matrix to allow communication between vision and touch charts
	for key in hash.keys():
		cur_verts = hash[key]
		if len(cur_verts) > 1:
			for v1 in cur_verts:
				for v2 in cur_verts: # vertices on the boundary of vision charts can communicate
					adj[v1, v2] = 1
				if args.use_touch:
					for c in central_points: # touch and vision charts can communicate
						adj[v1, c] = 1
						adj[c, v1] = 1

	return adj, faces