| 173 | } |
| 174 | |
| 175 | static std::pair<int, int> test_dataset(ggml_backend_sched_t backend_sched, ggml_backend_t backend, const bool shuffle) { |
| 176 | int ntest = 0; |
| 177 | int npass = 0; |
| 178 | |
| 179 | struct helper_ctx_data cd = helper_get_ctx_data(backend_sched, backend); |
| 180 | |
| 181 | for (int64_t ndata_shard = 1; ndata_shard <= ndata; ++ndata_shard) { |
| 182 | ggml_opt_dataset_t dataset = cd.datasets_supervised[ndata_shard-1]; |
| 183 | |
| 184 | if (shuffle) { |
| 185 | ggml_opt_dataset_shuffle(cd.opt_ctx, dataset, -1); |
| 186 | } |
| 187 | |
| 188 | for (int64_t ndata_batch = 1; ndata_batch <= ndata; ++ndata_batch) { |
| 189 | if (ndata_batch % ndata_shard != 0) { |
| 190 | continue; |
| 191 | } |
| 192 | bool subtest_ok = true; |
| 193 | |
| 194 | struct ggml_tensor * data_batch = cd.data_batch[ndata_batch-1]; |
| 195 | struct ggml_tensor * labels_batch = cd.labels_batch[ndata_batch-1]; |
| 196 | |
| 197 | std::vector<float> data(ggml_nelements( data_batch)); |
| 198 | std::vector<float> labels(ggml_nelements(labels_batch)); |
| 199 | |
| 200 | std::vector<int64_t> idata_shuffled; |
| 201 | const int64_t nbatches = ndata / ndata_batch; |
| 202 | for (int64_t ibatch = 0; ibatch < nbatches; ++ibatch) { |
| 203 | ggml_opt_dataset_get_batch(dataset, data_batch, labels_batch, ibatch); |
| 204 | |
| 205 | ggml_backend_tensor_get( data_batch, data.data(), 0, ggml_nbytes( data_batch)); |
| 206 | ggml_backend_tensor_get(labels_batch, labels.data(), 0, ggml_nbytes(labels_batch)); |
| 207 | |
| 208 | for (int64_t idata_batch = 0; idata_batch < ndata_batch; ++idata_batch) { |
| 209 | const int64_t idata = ibatch*ndata_batch + idata_batch; |
| 210 | const int64_t idata_found = data[idata_batch*ne_datapoint] / 16; |
| 211 | subtest_ok = subtest_ok && (shuffle || idata_found == idata); |
| 212 | idata_shuffled.push_back(idata_found); |
| 213 | |
| 214 | for (int64_t id = 0; id < ne_datapoint; ++id) { |
| 215 | if (data[ idata_batch*ne_datapoint + id] != 16*idata_found + id) { |
| 216 | subtest_ok = false; |
| 217 | } |
| 218 | } |
| 219 | for (int64_t il = 0; il < ne_label; ++il) { |
| 220 | if (labels[idata_batch*ne_label + il] != 16*(16*idata_found + il)) { |
| 221 | subtest_ok = false; |
| 222 | } |
| 223 | } |
| 224 | } |
| 225 | } |
| 226 | |
| 227 | if (!shuffle || ndata % ndata_batch == 0) { |
| 228 | const int ndata_max = (ndata / ndata_batch) * ndata_batch; |
| 229 | |
| 230 | for (int64_t idata = 0; subtest_ok && idata < ndata_max; ++idata) { |
| 231 | int ninstances = 0; |
| 232 | for (int64_t id : idata_shuffled) { |
no test coverage detected