@@ -89,13 +89,6 @@ void MatrixWorkerTable<T>::Get(const std::vector<integer_t>& row_ids,
8989 Log::Debug (" [Get] worker = %d, #rows_set = %d\n " , MV_Rank (), row_ids.size ());
9090}
9191
92- template <typename T>
93- void MatrixWorkerTable<T>::Add(T* data, size_t size, const AddOption* option) {
94- CHECK (size == num_col_ * num_row_);
95- integer_t whole_table = -1 ;
96- Add (whole_table, data, size, option);
97- }
98-
9992template <typename T>
10093void MatrixWorkerTable<T>::Add(integer_t row_id, T* data, size_t size,
10194 const AddOption* option) {
@@ -122,6 +115,30 @@ void MatrixWorkerTable<T>::Add(const std::vector<integer_t>& row_ids,
122115 Log::Debug (" [Add] worker = %d, #rows_set = %d\n " , MV_Rank (), row_ids.size ());
123116}
124117
118+ template <typename T>
119+ void MatrixWorkerTable<T>::Add(T* data, size_t size, integer_t * row_ids,
120+ integer_t row_ids_size,
121+ const AddOption* option) {
122+ if (row_ids_size == 0 ) {
123+ CHECK (size == num_col_ * num_row_);
124+ integer_t row_id = -1 ;
125+ Blob ids_blob (&row_id, sizeof (integer_t ));
126+ Blob data_blob (data, size * sizeof (T));
127+ WorkerTable::Add (ids_blob, data_blob, option);
128+ Log::Debug (" [Add] worker = %d, #row = %d\n " , MV_Rank (), row_id);
129+ } else {
130+ CHECK (size == num_col_);
131+ Blob ids_blob (row_ids, sizeof (integer_t ) * row_ids_size);
132+ Blob data_blob (row_ids_size * row_size_);
133+ // copy each row
134+ for (auto i = 0 ; i < row_ids_size; ++i){
135+ memcpy (data_blob.data () + i * row_size_, &data[i * num_col_], row_size_);
136+ }
137+ WorkerTable::Add (ids_blob, data_blob, option);
138+ Log::Debug (" [Add] worker = %d, #rows_set = %d\n " , MV_Rank (), row_ids_size);
139+ }
140+ }
141+
125142template <typename T>
126143int MatrixWorkerTable<T>::Partition(const std::vector<Blob>& kv,
127144 std::unordered_map<int , std::vector<Blob>>* out) {
0 commit comments