Block::BlockPtr ContiguousArrayManager::get_block(const BlockId& block_id, int& rank, Block::BlockPtr& contiguous, sip::offset_array_t& offsets) { //get contiguous array that contains block block_id, which must exist, and get its selectors and shape int array_id = block_id.array_id(); rank = sip_tables_.array_rank(array_id); contiguous = get_array(array_id); sip::check(contiguous != NULL, "contiguous array not allocated"); const sip::index_selector_t& selector = sip_tables_.selectors(array_id); BlockShape array_shape = sip_tables_.contiguous_array_shape(array_id); //shape of containing contiguous array //get offsets of block_id in the containing array for (int i = 0; i < rank; ++i) { offsets[i] = sip_tables_.offset_into_contiguous(selector[i], block_id.index_values(i)); } //set offsets of unused indices to 0 std::fill(offsets + rank, offsets + MAX_RANK, 0); //get shape of subblock BlockShape block_shape = sip_tables_.shape(block_id); //allocate a new block and copy data from contiguous block Block::BlockPtr block = new Block(block_shape); contiguous->extract_slice(rank, offsets, block); return block; }
bool BlockManager::has_wild_value(const BlockId& id) { int i = 0; while (i != MAX_RANK) { if (id.index_values(i) == wild_card_value) return true; ++i; } return false; }
std::string SialPrinterForProduction::BlockId2String(const BlockId& id){ std::stringstream ss; bool contiguous_local = sip_tables_.is_contiguous_local(id.array_id()); int rank = sip_tables_.array_rank(id.array_id()); ss << sip_tables_.array_name(id.array_id()) ; ss << '['; int i; for (i = 0; i < rank; ++i) { ss << (i == 0 ? "" : ",") << id.index_values(i); if (contiguous_local) { if (id.index_values(i) != id.upper_index_values(i)) { ss << ":" << id.upper_index_values(i); } } } ss << ']'; return ss.str(); }
void BlockManager::gen(const BlockId& id, int rank, const int pos, std::vector<int> prefix /*pass by value*/, int to_append, std::vector<BlockId>& list) { if (pos != 0) { prefix.push_back(to_append); } if (pos < rank) { int curr_index = id.index_values(pos); if (curr_index == wild_card_value) { int index_slot = sip_tables_.selectors(id.array_id())[pos]; int lower = sip_tables_.lower_seg(index_slot); int upper = lower + sip_tables_.num_segments(index_slot); for (int i = lower; i < upper; ++i) { gen(id, rank, pos + 1, prefix, i, list); } } else { gen(id, rank, pos + 1, prefix, curr_index, list); } } else { list.push_back(BlockId(id.array_id(), rank, prefix)); } }