void Transpose::scalar(const var& iVar, var& oVar) const { // Note that we need to transpose the view too. If it's allocated, it's // transposed at allocation; if it's supplied it's assumed to be correct // already. This leaves the in-place case; this happens after the // operation. // Transpose always broadcasts to array() broadcast(iVar, oVar); // Transpose view if necessary if (iVar.is(oVar)) { // Swap the trailing dimensions int d = iVar.dim(); Heap* h = iVar.heap(); int& str1 = h->stride(d-1); int& shp1 = h->shape(d-1); int& str2 = h->stride(d-2); int& shp2 = h->shape(d-2); int tmp = shp1; shp1 = shp2; shp2 = tmp; str2 = shp1 * str1; } }
void Transpose::vector(var iVar, ind iOffsetI, var& oVar, ind iOffsetO) const { assert(oVar); int dim = iVar.dim(); ind rows = iVar.shape(dim-2); ind cols = iVar.shape(dim-1); if (iVar.is(oVar)) // In place transpose switch (iVar.atype()) { case TYPE_FLOAT: inPlace<float>(oVar.ptr<float>(iOffsetO), rows, cols); break; case TYPE_DOUBLE: inPlace<double>(oVar.ptr<double>(iOffsetO), rows, cols); break; default: throw error("Transpose::vector(): unknown type"); } else // Transpose to new location switch (iVar.atype()) { case TYPE_FLOAT: outOfPlace<float>(iVar.ptr<float>(iOffsetI), rows, cols, oVar.ptr<float>(iOffsetO)); break; case TYPE_DOUBLE: outOfPlace<double>(iVar.ptr<double>(iOffsetI), rows, cols, oVar.ptr<double>(iOffsetO)); break; default: throw error("Transpose::vector(): unknown type"); } }
void DFTBase::vector(var iVar, ind iOffsetI, var& oVar, ind iOffsetO) const { assert(oVar); MKL_LONG r; if (iVar.is(oVar)) { throw error("DFTBase::vector(): not implemented"); if (mImpl->inverse) r = DftiComputeBackward(mImpl->handle, oVar.ptr<float>(iOffsetO)); else r = DftiComputeForward(mImpl->handle, oVar.ptr<float>(iOffsetO)); } else if (mImpl->inverse) switch (mImpl->forwardType.type()) { case TYPE_FLOAT: r = DftiComputeBackward( mImpl->handle, iVar.ptr<cfloat>(iOffsetI), oVar.ptr<float>(iOffsetO) ); break; case TYPE_DOUBLE: r = DftiComputeBackward( mImpl->handle, iVar.ptr<cdouble>(iOffsetI), oVar.ptr<double>(iOffsetO) ); break; case TYPE_CFLOAT: r = DftiComputeBackward( mImpl->handle, iVar.ptr<cfloat>(iOffsetI), oVar.ptr<cfloat>(iOffsetO) ); break; case TYPE_CDOUBLE: r = DftiComputeBackward( mImpl->handle, iVar.ptr<cdouble>(iOffsetI), oVar.ptr<cdouble>(iOffsetO) ); break; default: throw error("DFTBase::vector(): unknown type"); } else switch (mImpl->forwardType.type()) { case TYPE_FLOAT: r = DftiComputeForward( mImpl->handle, iVar.ptr<float>(iOffsetI), oVar.ptr<cfloat>(iOffsetO) ); break; case TYPE_DOUBLE: r = DftiComputeForward( mImpl->handle, iVar.ptr<double>(iOffsetI), oVar.ptr<cdouble>(iOffsetO) ); break; case TYPE_CFLOAT: r = DftiComputeForward( mImpl->handle, iVar.ptr<cfloat>(iOffsetI), oVar.ptr<cfloat>(iOffsetO) ); break; case TYPE_CDOUBLE: r = DftiComputeForward( mImpl->handle, iVar.ptr<cdouble>(iOffsetI), oVar.ptr<cdouble>(iOffsetO) ); break; default: throw error("DFTBase::vector(): unknown type"); } dftiCheck(r); }