def navigate2_m(state, agent, source, sink, rand=False):
	possible_decomp = []
	source_y, source_x = state.loc[source]
	sink_y, sink_x = state.loc[sink]

	if state.at[agent] == sink:
		# already at destination
		possible_decomp.append([])
	elif can_traverse(state, source, sink):
		# Next to the destination
		possible_decomp.append([('navigate_op', agent, source, sink)])
	else:
		# Look for possible neighbors
		neighbors = []
		for n in navigation.get_neighbors(state, source):
			if n not in state.visited[agent]: 
				neighbors.append(n)

		sorted_n = sorted(neighbors, key=lambda n: navigation.heuristic(state, n, sink))

		for mid in sorted_n:
			possible_decomp.append([('navigate_op', agent, source, mid), ('visit', agent, mid), ('navigate2', agent, mid, sink), ('unvisit',agent, mid)])

	if possible_decomp == []: return [False]

	return possible_decomp
def get_rock_data_m(state, agent, rand=False):
	keys = []
	to_return = []
	for (key, val) in state.at.items():
		if val != None:
			if (key in state.rocks):
				# Using heapq
				keys.append(key)

	if state.has_rock_sample[agent]:
		to_return = [[('get_a_rock_data', agent, state.rock_sample[agent])]]

	if rand: 
		random.shuffle(keys)
	sorted_keys = sorted(keys, key=lambda n: navigation.heuristic(state, state.at[agent], state.at[n]))
	for k in sorted_keys:
		to_return.append([('get_a_rock_data', agent, k)])

	if len(to_return) == 0: return [False] # If there is no soil anywhere
	return to_return