200 bool search_swap(node_value_type n, node_fail_vector_type& vFailNode,
int swap_cnt)
202 typedef typename node_vector_type::iterator node_iterator_type;
203 pair<size_t, size_t> row_range =
m_cbk.row_range(n);
205 size_t row_idx1 = row_range.first;
206 size_t row_idx2 = row_range.second;
207 assert(row_idx1 < row_idx2);
211 assert(!
m_cbk.check_valid(best_cost));
212 for (
size_t row_idx = row_idx1; row_idx != row_idx2; ++row_idx)
216 row_const_value_type row =
m_cbk.row(row_idx);
218 vector<node_iterator_type> vIt2 (swap_cnt+1, vNode.begin());
219 bool next_flag1 =
false;
220 for (
int i = 0; i < swap_cnt; ++i)
222 if (vIt2.back() == vNode.end())
229 if (next_flag1)
continue;
230 for (; vIt2.back() != vNode.end(); ++vIt2.back())
233 for (
int i = vIt2.size()-1; i > 0; --i)
240 bool next_flag2 =
false;
242 for (
int i = 0; i < vIt2.size()-1; ++i)
245 assert(n != *vIt2[i]);
252 if (next_flag2)
continue;
255 site_coordinate_type ws_site_xl;
256 site_coordinate_type ws_site_xh =
m_cbk.site_xl(*vIt2.back());
257 if (vIt2.front() != vNode.begin())
259 node_iterator_type it2_0 = vIt2.front();
261 ws_site_xl = this->
site_xh(*it2_0);
263 else ws_site_xl =
m_cbk.site_xl(row);
265 if (ws_site_xh-ws_site_xl < site_size_x)
continue;
268 for (site_coordinate_type tgt_site = ws_site_xl;
269 tgt_site <= ws_site_xh-site_size_x; ++tgt_site)
272 if (!
m_cbk.check_displace(n, tgt_site, row_idx))
continue;
273 cost_type cur_cost =
m_cbk.calc_cost(n, row_idx, tgt_site, vIt2, swap_cnt);
274 if (!
m_cbk.check_valid(best_cost) || cur_cost < best_cost)
276 best_cost = cur_cost;
281 if (
m_cbk.check_valid(best_cost))
284 m_cbk.apply(n, best_cost, vFailNode, swap_cnt);