//#include <cplex.h> // void CliquePartitionProblem::cps(std::string const &fileName, ILpSolver & solver) const { int const n(nV()); // char const binary(solver.binary()); char const continuous(solver.continuous()); char const leq(solver.leq()); char const eq(solver.eq()); char const geq(solver.geq()); // ColumnBuffer columnBuffer(continuous); DoubleVector denseCost(n * (n - 1), 0); for (auto const & e : _costs) { int const u(e._i); int const v(e._j); int const id(ijtok(n, u, v)); denseCost[id] = e._v; } //cpCost(denseCost); //IntVector index(n * (n - 1)); int nCols(0); for (int u(0); u < nV(); ++u) { for (int v(u + 1); v < nV(); ++v, ++nCols) { int const id(ijtok(n, u, v)); columnBuffer.add(denseCost[id], binary, 0, 1, GetStr("x_", u, "_", v)); if (id != nCols) { std::cout << "wrong numbering" << std::endl; std::exit(-1); } } } columnBuffer.add(cst(), continuous, 1, 1, "CST"); solver.add(columnBuffer); RowBuffer rowBuffer; double const eps(1e-20); for (int u(0); u < nV(); ++u) { for (int v(u + 1); v < nV(); ++v) { int const uv(ijtok(n, u, v)); for (int w(v + 1); w < nV(); ++w) { int const uw(ijtok(n, u, w)); int const vw(ijtok(n, v, w)); if (denseCost[uv] > -eps || denseCost[vw] > -eps) { rowBuffer.add(1, leq, GetStr("T_", u, "_", v, "_", w)); rowBuffer.add(uv, 1); rowBuffer.add(vw, 1); rowBuffer.add(uw, -1); } if (denseCost[vw] > -eps || denseCost[uw] > -eps) { rowBuffer.add(1, leq, GetStr("T_", v, "_", w, "_", u)); rowBuffer.add(vw, 1); rowBuffer.add(uw, 1); rowBuffer.add(uv, -1); } if (denseCost[uw] > -eps || denseCost[uv] > -eps) { rowBuffer.add(1, leq, GetStr("T_", w, "_", u, "_", v)); rowBuffer.add(uw, 1); rowBuffer.add(uv, 1); rowBuffer.add(vw, -1); } } } } solver.add(rowBuffer); solver.maximize(); solver.write(fileName + ".lp"); solver.run(); double objval = solver.objValue(); std::cout << "optimal solution value : " << std::setprecision(20) << objval << std::endl; }
inline void KisTextureTile::repeatStripes(const KisTextureTileUpdateInfo &updateInfo) { /** * WARN: This function can repeat stripes of 1px width only! */ const int pixelSize = updateInfo.pixelSize(); const QRect imageRect = updateInfo.imageRect(); const QPoint patchOffset = updateInfo.patchOffset(); const QSize patchSize = updateInfo.patchSize(); const QRect patchRect = QRect(m_textureRectInImagePixels.topLeft() + patchOffset, patchSize); if(imageRect.top() == patchRect.top()) { glTexSubImage2D(GL_TEXTURE_2D, 0, patchOffset.x(), patchOffset.y() - 1, patchSize.width(), 1, m_texturesInfo->format, m_texturesInfo->type, updateInfo.data()); } if(imageRect.bottom() == patchRect.bottom()) { int shift = patchSize.width() * (patchSize.height() - 1) * pixelSize; glTexSubImage2D(GL_TEXTURE_2D, 0, patchOffset.x(), patchOffset.y() + patchSize.height(), patchSize.width(), 1, m_texturesInfo->format, m_texturesInfo->type, updateInfo.data() + shift); } if(imageRect.left() == patchRect.left()) { QByteArray columnBuffer(patchSize.height() * pixelSize, 0); quint8 *srcPtr = updateInfo.data(); quint8 *dstPtr = (quint8*) columnBuffer.data(); for(int i = 0; i < patchSize.height(); i++) { memcpy(dstPtr, srcPtr, pixelSize); srcPtr += patchSize.width() * pixelSize; dstPtr += pixelSize; } glTexSubImage2D(GL_TEXTURE_2D, 0, patchOffset.x() - 1, patchOffset.y(), 1, patchSize.height(), m_texturesInfo->format, m_texturesInfo->type, columnBuffer.constData()); } if(imageRect.right() == patchRect.right()) { QByteArray columnBuffer(patchSize.height() * pixelSize, 0); quint8 *srcPtr = updateInfo.data() + (patchSize.width() - 1) * pixelSize; quint8 *dstPtr = (quint8*) columnBuffer.data(); for(int i = 0; i < patchSize.height(); i++) { memcpy(dstPtr, srcPtr, pixelSize); srcPtr += patchSize.width() * pixelSize; dstPtr += pixelSize; } glTexSubImage2D(GL_TEXTURE_2D, 0, patchOffset.x() + patchSize.width(), patchOffset.y(), 1, patchSize.height(), m_texturesInfo->format, m_texturesInfo->type, columnBuffer.constData()); } }
void KisTextureTile::update(const KisTextureTileUpdateInfo &updateInfo) { glBindTexture(GL_TEXTURE_2D, m_textureId); setTextureParameters(); const GLvoid *fd = updateInfo.data(); #ifdef USE_PIXEL_BUFFERS KisConfig cfg; if (!m_glBuffer) { QByteArray ba; ba.fromRawData((const char*)updateInfo.data(), updateInfo.patchPixelsLength()); createTextureBuffer(ba); } #endif if (updateInfo.isEntireTileUpdated()) { #ifdef USE_PIXEL_BUFFERS if (cfg.useOpenGLTextureBuffer()) { m_glBuffer->bind(); m_glBuffer->allocate(updateInfo.patchPixelsLength()); void *vid = m_glBuffer->map(QGLBuffer::WriteOnly); memcpy(vid, fd, updateInfo.patchPixelsLength()); m_glBuffer->unmap(); // we set fill data to 0 so the next glTexImage2D call uses our buffer fd = 0; } #endif glTexImage2D(GL_TEXTURE_2D, 0, m_texturesInfo->internalFormat, m_texturesInfo->width, m_texturesInfo->height, 0, m_texturesInfo->format, m_texturesInfo->type, fd); #ifdef USE_PIXEL_BUFFERS if (cfg.useOpenGLTextureBuffer()) { m_glBuffer->release(); } #endif } else { QPoint patchOffset = updateInfo.patchOffset(); QSize patchSize = updateInfo.patchSize(); #ifdef USE_PIXEL_BUFFERS if (cfg.useOpenGLTextureBuffer()) { m_glBuffer->bind(); quint32 size = patchSize.width() * patchSize.height() * updateInfo.pixelSize(); m_glBuffer->allocate(size); void *vid = m_glBuffer->map(QGLBuffer::WriteOnly); memcpy(vid, fd, size); m_glBuffer->unmap(); // we set fill data to 0 so the next glTexImage2D call uses our buffer fd = 0; } #endif glTexSubImage2D(GL_TEXTURE_2D, 0, patchOffset.x(), patchOffset.y(), patchSize.width(), patchSize.height(), m_texturesInfo->format, m_texturesInfo->type, fd); #ifdef USE_PIXEL_BUFFERS if (cfg.useOpenGLTextureBuffer()) { m_glBuffer->release(); } #endif } /** * On the boundaries of KisImage, there is a border-effect as well. * So we just repeat the bounding pixels of the image to make * bilinear interpolator happy. */ /** * WARN: The width of the stripes will be equal to the broder * width of the tiles. */ const int pixelSize = updateInfo.pixelSize(); const QRect imageRect = updateInfo.imageRect(); const QPoint patchOffset = updateInfo.patchOffset(); const QSize patchSize = updateInfo.patchSize(); const QRect patchRect = QRect(m_textureRectInImagePixels.topLeft() + patchOffset, patchSize); const QSize tileSize = updateInfo.tileRect().size(); if(imageRect.top() == patchRect.top()) { int start = 0; int end = patchOffset.y() - 1; for (int i = start; i <= end; i++) { glTexSubImage2D(GL_TEXTURE_2D, 0, patchOffset.x(), i, patchSize.width(), 1, m_texturesInfo->format, m_texturesInfo->type, updateInfo.data()); } } if (imageRect.bottom() == patchRect.bottom()) { int shift = patchSize.width() * (patchSize.height() - 1) * pixelSize; int start = patchOffset.y() + patchSize.height(); int end = tileSize.height() - 1; for (int i = start; i < end; i++) { glTexSubImage2D(GL_TEXTURE_2D, 0, patchOffset.x(), i, patchSize.width(), 1, m_texturesInfo->format, m_texturesInfo->type, updateInfo.data() + shift); } } if (imageRect.left() == patchRect.left()) { QByteArray columnBuffer(patchSize.height() * pixelSize, 0); quint8 *srcPtr = updateInfo.data(); quint8 *dstPtr = (quint8*) columnBuffer.data(); for(int i = 0; i < patchSize.height(); i++) { memcpy(dstPtr, srcPtr, pixelSize); srcPtr += patchSize.width() * pixelSize; dstPtr += pixelSize; } int start = 0; int end = patchOffset.x() - 1; for (int i = start; i <= end; i++) { glTexSubImage2D(GL_TEXTURE_2D, 0, i, patchOffset.y(), 1, patchSize.height(), m_texturesInfo->format, m_texturesInfo->type, columnBuffer.constData()); } } if (imageRect.right() == patchRect.right()) { QByteArray columnBuffer(patchSize.height() * pixelSize, 0); quint8 *srcPtr = updateInfo.data() + (patchSize.width() - 1) * pixelSize; quint8 *dstPtr = (quint8*) columnBuffer.data(); for(int i = 0; i < patchSize.height(); i++) { memcpy(dstPtr, srcPtr, pixelSize); srcPtr += patchSize.width() * pixelSize; dstPtr += pixelSize; } int start = patchOffset.x() + patchSize.width(); int end = tileSize.width() - 1; for (int i = start; i <= end; i++) { glTexSubImage2D(GL_TEXTURE_2D, 0, i, patchOffset.y(), 1, patchSize.height(), m_texturesInfo->format, m_texturesInfo->type, columnBuffer.constData()); } } setNeedsMipmapRegeneration(); }