void AABBTiler::evaluate_thickness_parameters(WireNetwork& wire_network, const AABBTiler::FuncList& funcs) { assert(m_params); const size_t num_vertices = wire_network.get_num_vertices(); const size_t num_edges = wire_network.get_num_edges(); const size_t num_unit_vertices = m_unit_wire_network->get_num_vertices(); const size_t num_unit_edges = m_unit_wire_network->get_num_edges(); size_t num_thickness_entries, thickness_index_stride; if (m_params->get_thickness_type() == ParameterCommon::VERTEX) { thickness_index_stride = num_unit_vertices; num_thickness_entries = num_vertices; wire_network.add_attribute("thickness", true); } else { thickness_index_stride = num_unit_edges; num_thickness_entries = num_edges; wire_network.add_attribute("thickness", false); } MatrixFr thickness(num_thickness_entries, 1); ParameterCommon::Variables vars; size_t count=0; for (auto f : funcs) { VectorF local_thickness = m_params->evaluate_thickness(vars); thickness.block(count * thickness_index_stride, 0, thickness_index_stride, 1) = local_thickness; count++; } wire_network.set_attribute("thickness", thickness); }
void TilerEngine::update_attributes(WireNetwork& wire_network, size_t num_repetitions) { std::vector<std::string> attr_names = m_unit_wire_network->get_attribute_names(); for (auto itr : attr_names) { const std::string& name = itr; wire_network.add_attribute(name, m_unit_wire_network->is_vertex_attribute(name), false); const MatrixFr& values = m_unit_wire_network->get_attribute(name); const size_t rows = values.rows(); const size_t cols = values.cols(); MatrixFr tiled_values(rows * num_repetitions, cols); for (size_t i=0; i<num_repetitions; i++) { tiled_values.block(i*rows, 0, rows, cols) = values; } wire_network.set_attribute(name, tiled_values); } }
void AABBTiler::evaluate_offset_parameters(WireNetwork& wire_network, const AABBTiler::FuncList& funcs) { const size_t dim = wire_network.get_dim(); const size_t num_vertices = wire_network.get_num_vertices(); const size_t num_unit_vertices = m_unit_wire_network->get_num_vertices(); wire_network.add_attribute("vertex_offset", true); MatrixFr attr_value(num_vertices, dim); ParameterCommon::Variables vars; const MatrixFr& ori_vertices = m_unit_wire_network->get_vertices(); size_t count=0; for (auto f : funcs) { MatrixFr local_offseted_vertices = ori_vertices + m_params->evaluate_offset(vars); attr_value.block(count * num_unit_vertices, 0, num_unit_vertices, dim) = f(local_offseted_vertices); count++; } attr_value = attr_value - wire_network.get_vertices(); wire_network.set_attribute("vertex_offset", attr_value); }