T dot_array(const BaseArray<T>& a, const BaseArray<T>& b) { if(a.getNumDims() != 1 || b.getNumDims() != 1) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"error in dot array function. Wrong dimension"); const T* data1 = a.getData(); const T* data2 = b.getData(); T r = std::inner_product(data1, data1 + a.getNumElems(), data2, 0.0); return r; }
void create_array_from_shape(const spec_type& sp,BaseArray<T>& s,BaseArray<T>& d) { //alocate target array vector<size_t> shape; vector<size_t>::const_iterator iter; for(iter = (sp.first).begin();iter!=(sp.first).end();++iter) { if(*iter!=0) shape.push_back(*iter); } d.setDims(shape); //Check if the dimension of passed indices match the dimension of target array if(sp.second.size()!=s.getNumDims()) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Erro in create array from shape, number of dimensions does not match"); T* data = new T[d.getNumElems()]; idx_type::const_iterator spec_iter; //calc number of indeces size_t n =1; for(spec_iter = sp.second.begin();spec_iter!=sp.second.end();++spec_iter) { n*=spec_iter->size(); } size_t k =0; size_t index=0; vector<size_t>::const_iterator indeces_iter; //initialize target array with elements of source array using passed indices vector<size_t> idx; for(int i=0;i<n;i++) { spec_iter = sp.second.begin(); for(int dim=0;dim<s.getNumDims();dim++) { size_t idx1 = getNextIndex(*spec_iter,i); idx.push_back(idx1); spec_iter++; } if(index>(d.getNumElems()-1)) { throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Erro in create array from shape, number of dimensions does not match"); } data[index] = s(idx); idx.clear(); index++; } //assign elemets to target array d.assign( data ); delete [] data; }
void convertArrayLayout(const BaseArray<S> &s, BaseArray<T> &d) { size_t ndims = s.getNumDims(); if (ndims != d.getNumDims()) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Wrong dimensions in convertArrayLayout"); vector<size_t> sdims = s.getDims(); vector<size_t> ddims(ndims); for (size_t dim = 1; dim <= ndims; dim++) ddims[ndims - dim] = sdims[dim - 1]; d.resize(ddims); convertArrayDim(1, s, sdims, d, ddims); }
void transpose_array(const BaseArray<T>& x, BaseArray<T>& a) { size_t ndims = x.getNumDims(); if(ndims < 2 || ndims != a.getNumDims()) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Wrong dimensions in transpose_array"); vector<size_t> ex = x.getDims(); std::swap(ex[0], ex[1]); a.setDims(ex); vector<Slice> sx(ndims); vector<Slice> sa(ndims); for (int i = 1; i <= x.getDim(1); i++) { sa[1] = sx[0] = Slice(i); ArraySlice<T>(a, sa).assign(ArraySliceConst<T>(x, sx)); } }
void multiply_array(const BaseArray<T> &leftArray, const BaseArray<T> &rightArray, BaseArray<T> &resultArray) { size_t leftNumDims = leftArray.getNumDims(); size_t rightNumDims = rightArray.getNumDims(); size_t matchDim = rightArray.getDim(1); resultArray.setDims(leftArray.getDims()); if (leftArray.getDim(leftNumDims) != matchDim) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Wrong sizes in multiply_array"); if (leftNumDims == 1 && rightNumDims == 2) { size_t rightDim = rightArray.getDim(2); for (size_t j = 1; j <= rightDim; j++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) val += leftArray(k) * rightArray(k, j); resultArray(j) = val; } } else if (leftNumDims == 2 && rightNumDims == 1) { size_t leftDim = leftArray.getDim(1); for (size_t i = 1; i <= leftDim; i++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) val += leftArray(i, k) * rightArray(k); resultArray(i) = val; } } else if (leftNumDims == 2 && rightNumDims == 2) { size_t leftDim = leftArray.getDim(1); size_t rightDim = rightArray.getDim(2); for (size_t i = 1; i <= leftDim; i++) { for (size_t j = 1; j <= rightDim; j++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) val += leftArray(i, k) * rightArray(k, j); resultArray(i, j) = val; } } } else throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Unsupported dimensions in multiply_array"); }
static void convertArrayDim(size_t dim, const BaseArray<S> &s, vector<size_t> &sidx, BaseArray<T> &d, vector<size_t> &didx) { size_t ndims = s.getNumDims(); size_t size = s.getDim(dim); for (size_t i = 1; i <= size; i++) { didx[ndims - dim] = sidx[dim - 1] = i; if (dim < sidx.size()) convertArrayDim(dim + 1, s, sidx, d, didx); else d(didx) = s(sidx); } }
void assignRowMajorData(const T *data, BaseArray<T> &array) { vector<size_t> idx(array.getNumDims()); assignRowMajorDim(1, data, array, idx); }