static bool read_poly(int dataset, VarInfo6& info) { int complex = 0; int size = getDimsNode(dataset, &complex, info.pdims); info.size = 0; //open __refs__ node int refs = getDataSetIdFromName(dataset, "__refs__"); for (int i = 0; i < size; ++i) { std::string polyname(std::to_string(i)); int poly = getDataSetIdFromName(refs, polyname.data()); //get dims complex = 0; int dims = 0; int ret = getDatasetInfo(poly, &complex, &dims, NULL); if (ret < 0) { return false; } std::vector<int> d(dims); int datasize = getDatasetInfo(poly, &complex, &dims, d.data()); info.size += datasize * sizeof(double) * (complex + 1); } closeList6(refs); closeList6(dataset); generateInfo(info); return true; }
static types::InternalType* import_cell(int dataset) { //get sparse dimensions int complex = 0; std::vector<int> pdims; int size = getDimsNode(dataset, &complex, pdims); if (size == 0) { closeList6(dataset); return new types::Cell(); } //open __refs__ node int refs = getDataSetIdFromName(dataset, "__refs__"); std::vector<types::InternalType*> data(size); for (int i = 0; i < size; ++i) { int ref = getDataSetIdFromName(refs, std::to_string(i).data()); types::InternalType* val = import_data(ref); if (val == nullptr) { return nullptr; } data[i] = val; } types::Cell* cell = new types::Cell(static_cast<int>(pdims.size()), pdims.data(), data.data()); closeList6(refs); closeList6(dataset); return cell; }
static types::InternalType* import_boolean_sparse(int dataset) { //get sparse dimensions int complex = 0; std::vector<int> pdims; int size = getDimsNode(dataset, &complex, pdims); //get non zeros count int nnz = 0; int datannz = getDataSetIdFromName(dataset, "__nnz__"); readInteger32Matrix(datannz, &nnz); if (nnz == 0) { closeList6(dataset); return new types::SparseBool(pdims[0], pdims[1]); } //get inner vector int datain = getDataSetIdFromName(dataset, "__inner__"); int dimin = 0; int sizein = getDatasetInfo(datain, &complex, &dimin, NULL); std::vector<int> dimsin(dimin); sizein = getDatasetInfo(datain, &complex, &dimin, dimsin.data()); std::vector<int> in(sizein); int ret = readInteger32Matrix(datain, in.data()); if (ret < 0) { closeList6(dataset); return nullptr; } //get outer vector int dataout = getDataSetIdFromName(dataset, "__outer__"); int dimout = 0; int sizeout = getDatasetInfo(dataout, &complex, &dimout, NULL); std::vector<int> dimsout(dimout); sizeout = getDatasetInfo(dataout, &complex, &dimout, dimsout.data()); std::vector<int> out(sizeout); ret = readInteger32Matrix(dataout, out.data()); if (ret < 0) { closeList6(dataset); return nullptr; } closeList6(dataset); return new types::SparseBool(pdims[0], pdims[1], nnz, in.data(), out.data()); }
static bool read_handles(int dataset, VarInfo6& info) { //get cell dimensions int complex = 0; int size = getDimsNode(dataset, &complex, info.pdims); info.dims = static_cast<int>(info.pdims.size()); if (size == 0) { info.size = 0; generateInfo(info); closeList6(dataset); return true; } closeList6(dataset); generateInfo(info); return true; }
static bool read_boolean_sparse(int dataset, VarInfo6& info) { int complex = 0; std::vector<int> pdims; int size = getDimsNode(dataset, &complex, pdims); //get non zeros count int nnz = 0; int datannz = getDataSetIdFromName(dataset, "__nnz__"); readInteger32Matrix(datannz, &nnz); info.dims = 2; info.pdims[0] = pdims[0]; info.pdims[1] = pdims[1]; //rows(int) + nnz(int) info.size = info.pdims[0] * sizeof(int) + nnz * sizeof(int); generateInfo(info); closeList6(dataset); return true; }
static bool read_cell(int dataset, VarInfo6& info) { //get cell dimensions int complex = 0; int size = getDimsNode(dataset, &complex, info.pdims); info.dims = static_cast<int>(info.pdims.size()); if (size == 0) { info.size = 0; generateInfo(info); closeList6(dataset); return true; } //open __refs__ node int refs = getDataSetIdFromName(dataset, "__refs__"); for (int i = 0; i < size; ++i) { int ref = getDataSetIdFromName(refs, std::to_string(i).data()); VarInfo6 info2; if (read_data(ref, info2) == false) { closeList6(refs); closeList6(dataset); return false; } info.size += info2.size; } closeList6(refs); closeList6(dataset); generateInfo(info); return true; }
static bool read_struct(int dataset, VarInfo6& info) { int complex = 0; int size = getDimsNode(dataset, &complex, info.pdims); info.dims = static_cast<int>(info.pdims.size()); info.size = 0; if (size == 0) { generateInfo(info); closeList6(dataset); return true; } int fieldCount = 0; int ret = getListDims6(dataset, &fieldCount); if (ret < 0) { closeList6(dataset); return false; } //open __refs__ node int refs = getDataSetIdFromName(dataset, "__refs__"); H5O_info_t oinfo; for (int i = 0; i < fieldCount; ++i) { H5Oget_info_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_NATIVE, i, &oinfo, H5P_DEFAULT); ssize_t len = H5Lget_name_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, i, 0, 0, H5P_DEFAULT) + 1; char* name = (char*)MALLOC(sizeof(char) * len); H5Lget_name_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, i, name, len, H5P_DEFAULT); std::string cname(name); FREE(name); if (cname != "__dims__" && cname != "__refs__") { int dataref = getDataSetIdFromName(dataset, cname.data()); if (dataref < 0) { closeList6(dataset); return false; } int refdim = 0; getDatasetInfo(dataref, &complex, &refdim, NULL); std::vector<int> refdims(refdim); int refcount = getDatasetInfo(dataref, &complex, &refdim, refdims.data()); std::vector<hobj_ref_t> vrefs(refcount); ret = H5Dread(dataref, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, vrefs.data()); if (ret < 0) { return false; } //import field for (int j = 0; j < refcount; ++j) { int data = H5Rdereference(refs, H5R_OBJECT, &vrefs[j]); if (data < 0) { return false; } VarInfo6 info2; ret = read_data(data, info2); if (ret == false) { return false; } info.size += info2.size; } closeDataSet(dataref); } } generateInfo(info); closeList6(refs); closeList6(dataset); return true; }
static types::InternalType* import_handles(int dataset) { //get sparse dimensions int complex = 0; std::vector<int> pdims; int size = getDimsNode(dataset, &complex, pdims); if (size == 0) { closeList6(dataset); return nullptr; } //open __refs__ node int refs = getDataSetIdFromName(dataset, "__refs__"); types::GraphicHandle* handles = new types::GraphicHandle(static_cast<int>(pdims.size()), pdims.data()); long long* h = handles->get(); if (size == 1) { //%h_copy int ref = getDataSetIdFromName(refs, std::to_string(0).data()); int val = add_current_entity(ref); if (val < 0) { return nullptr; } h[0] = getHandle(val); } else { for (int i = 0; i < size; ++i) { int ref = getDataSetIdFromName(refs, std::to_string(i).data()); int val = import_handle(ref, -1); if (val < 0) { return nullptr; } h[i] = getHandle(val); } } closeList6(refs); closeList6(dataset); //update links property of legend handle if (Links::count()) { std::list<int> legends = Links::legends(); for (auto & i : legends) { Links::PathList paths = Links::get(i); update_link_path(i, paths); } } return handles; }
static types::InternalType* import_sparse(int dataset) { types::Sparse* sp = nullptr; //get sparse dimensions int complex = 0; std::vector<int> pdims; int size = getDimsNode(dataset, &complex, pdims); //get non zeros count int nnz = 0; int datannz = getDataSetIdFromName(dataset, "__nnz__"); readInteger32Matrix(datannz, &nnz); if (nnz == 0) { closeList6(dataset); return new types::Sparse(pdims[0], pdims[1]); } //get inner vector int datain = getDataSetIdFromName(dataset, "__inner__"); int dimin = 0; int sizein = getDatasetInfo(datain, &complex, &dimin, NULL); std::vector<int> dimsin(dimin); sizein = getDatasetInfo(datain, &complex, &dimin, dimsin.data()); if (sizein < 0) { closeList6(dataset); return nullptr; } std::vector<int> in(sizein); int ret = readInteger32Matrix(datain, in.data()); if (ret < 0) { closeList6(dataset); return nullptr; } //get outer vector int dataout = getDataSetIdFromName(dataset, "__outer__"); int dimout = 0; int sizeout = getDatasetInfo(dataout, &complex, &dimout, NULL); std::vector<int> dimsout(dimout); sizeout = getDatasetInfo(dataout, &complex, &dimout, dimsout.data()); if (sizeout < 0) { closeList6(dataset); return nullptr; } std::vector<int> out(sizeout); ret = readInteger32Matrix(dataout, out.data()); if (ret < 0) { closeList6(dataset); return nullptr; } //get data int ddata = getDataSetIdFromName(dataset, "__data__"); int dimdata = 0; int sizedata = getDatasetInfo(ddata, &complex, &dimdata, NULL); std::vector<int> dimsdata(dimdata); sizedata = getDatasetInfo(ddata, &complex, &dimdata, dimsdata.data()); if (sizedata < 0) { closeList6(dataset); return nullptr; } std::vector<double> real(sizedata); if (complex) { std::vector<double> img(sizedata); ret = readDoubleComplexMatrix(ddata, real.data(), img.data()); if (ret < 0) { closeList6(dataset); return nullptr; } sp = new types::Sparse(pdims[0], pdims[1], nnz, in.data(), out.data(), real.data(), img.data()); } else { ret = readDoubleMatrix(ddata, real.data()); if (ret < 0) { closeList6(dataset); return nullptr; } sp = new types::Sparse(pdims[0], pdims[1], nnz, in.data(), out.data(), real.data(), nullptr); } closeList6(dataset); return sp; }
static types::InternalType* import_poly(int dataset) { //get poly dims node int complex = 0; std::vector<int> pdims; int size = getDimsNode(dataset, &complex, pdims); //get variable name char* var = NULL; int varname = getDataSetIdFromName(dataset, "__varname__"); readStringMatrix(varname, &var); wchar_t* wvar = to_wide_string(var); std::wstring wvarname(wvar); FREE(wvar); freeStringMatrix(varname, &var); types::Polynom* p = new types::Polynom(wvarname, static_cast<int>(pdims.size()), pdims.data()); types::SinglePoly** pss = p->get(); //open __refs__ node int refs = getDataSetIdFromName(dataset, "__refs__"); size = p->getSize(); //loop on children for (int i = 0; i < size; ++i) { //forge name std::string polyname(std::to_string(i)); int poly = getDataSetIdFromName(refs, polyname.data()); //get dims complex = 0; int dims = 0; int ret = getDatasetInfo(poly, &complex, &dims, NULL); if (ret < 0) { return nullptr; } std::vector<int> d(dims); int datasize = getDatasetInfo(poly, &complex, &dims, d.data()); types::SinglePoly* ss = NULL; //get coef if (dims == 0 || datasize <= 0) { ss = new types::SinglePoly(); } else if (complex) { double* real = NULL; double* img = NULL; //create singlepoly ss = new types::SinglePoly(&real, &img, datasize - 1); readDoubleComplexMatrix(poly, real, img); } else { double* real = NULL; ss = new types::SinglePoly(&real, datasize - 1); readDoubleMatrix(poly, real); } pss[i] = ss; } closeList6(refs); closeList6(dataset); return p; }
static types::InternalType* import_struct(int dataset) { //get struct dims node int complex = 0; std::vector<int> pdims; int size = getDimsNode(dataset, &complex, pdims); types::Struct* str = new types::Struct(static_cast<int>(pdims.size()), pdims.data()); size = str->getSize(); if (size == 0) { //empty struct closeList6(dataset); delete str; return new types::Struct(); } types::SingleStruct** sstr = str->get(); int fieldCount = 0; int ret = getListDims6(dataset, &fieldCount); if (ret < 0) { closeList6(dataset); return str; } //get fields name int dfield = getDataSetIdFromName(dataset, "__fields__"); int dim = 0; getDatasetInfo(dfield, &complex, &dim, NULL); std::vector<int> d(dim); size = getDatasetInfo(dfield, &complex, &dim, d.data()); if (size < 0) { closeList6(dataset); delete str; return nullptr; } //get dims value std::vector<char*> fields(size); readStringMatrix(dfield, fields.data()); //open __refs__ node int refs = getDataSetIdFromName(dataset, "__refs__"); for (const auto & name : fields) { wchar_t* field = to_wide_string(name); str->addField(field); int dataref = getDataSetIdFromName(dataset, name); if (dataref < 0) { closeList6(dataset); freeStringMatrix(dfield, fields.data()); FREE(field); delete str; return nullptr; } int refdim = 0; getDatasetInfo(dataref, &complex, &refdim, NULL); std::vector<int> refdims(refdim); int refcount = getDatasetInfo(dataref, &complex, &refdim, refdims.data()); std::vector<hobj_ref_t> vrefs(refcount); ret = H5Dread(dataref, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, vrefs.data()); if (ret < 0) { freeStringMatrix(dfield, fields.data()); FREE(field); delete str; return nullptr; } //import field for (int j = 0; j < refcount; ++j) { int data = H5Rdereference(refs, H5R_OBJECT, &vrefs[j]); if (data < 0) { freeStringMatrix(dfield, fields.data()); FREE(field); delete str; return nullptr; } types::InternalType* val = import_data(data); if (val == nullptr) { freeStringMatrix(dfield, fields.data()); FREE(field); delete str; return nullptr; } sstr[j]->set(field, val); } FREE(field); closeDataSet(dataref); } freeStringMatrix(dfield, fields.data()); closeList6(refs); closeList6(dataset); return str; }