Compress-Stream-Zstd

 view release on metacpan or  search on metacpan

ext/zstd/tests/paramgrill.c  view on Meta::CPAN

                        DEBUGOUTPUT("Res: %d\n", res);
                        if(res == BETTER_RESULT) { /* synonymous with better when called w/ infeasibleBM */
                            winnerInfo = candidateInfo;
                            better = 1;
                            if(compareResultLT(bestFeasible1.result, winnerInfo.result, target, buf.srcSize)) {
                                bestFeasible1 = winnerInfo;
                            }
                        }
                    }
                }  /* for (offset = -1; offset <= 1; offset += 2) */
            }   /* for (i = 0; i < varLen; i++) */

            if(better) {
                continue;
            }

            for (dist = 2; dist < varLen + 2; dist++) { /* varLen is # dimensions */
                for (i = 0; i < (1ULL << varLen) / varLen + 2; i++) {
                    int res;
                    CHECKTIME(winnerInfo);
                    candidateInfo.params = cparam;
                    /* param error checking already done here */
                    paramVariation(&candidateInfo.params, mtAll, (U32)dist);

                    res = benchMemo(&candidateInfo.result,
                                buf, ctx,
                                sanitizeParams(candidateInfo.params), target,
                                &winnerInfo.result, mtAll, feas);
                    DEBUGOUTPUT("Res: %d\n", res);
                    if (res == BETTER_RESULT) { /* synonymous with better in this case*/
                        winnerInfo = candidateInfo;
                        better = 1;
                        if (compareResultLT(bestFeasible1.result, winnerInfo.result, target, buf.srcSize)) {
                            bestFeasible1 = winnerInfo;
                        }
                        break;
                    }
                }

                if (better) {
                    break;
                }
            }   /* for(dist = 2; dist < varLen + 2; dist++) */

            if (!better) { /* infeas -> feas -> stop */
                if (feas) return winnerInfo;
                feas = 1;
                better = 1;
                winnerInfo = bestFeasible1; /* note with change, bestFeasible may not necessarily be feasible, but if one has been benchmarked, it will be. */
                DEBUGOUTPUT("Climb Part 2\n");
            }
        }
        winnerInfo = bestFeasible1;
    }

    return winnerInfo;
}

/* Optimizes for a fixed strategy */

/* flexible parameters: iterations of failed climbing (or if we do non-random, maybe this is when everything is close to visited)
   weight more on visit for bad results, less on good results/more on later results / ones with more failures.
   allocate memoTable here.
 */
static winnerInfo_t
optimizeFixedStrategy(const buffers_t buf, const contexts_t ctx,
                      const constraint_t target, paramValues_t paramTarget,
                      const ZSTD_strategy strat,
                      memoTable_t* memoTableArray, const int tries)
{
    int i = 0;

    paramValues_t init;
    winnerInfo_t winnerInfo, candidateInfo;
    winnerInfo = initWinnerInfo(emptyParams());
    /* so climb is given the right fixed strategy */
    paramTarget.vals[strt_ind] = strat;
    /* to pass ZSTD_checkCParams */
    paramTarget = cParamUnsetMin(paramTarget);

    init = paramTarget;

    for(i = 0; i < tries; i++) {
        DEBUGOUTPUT("Restart\n");
        do {
            randomConstrainedParams(&init, memoTableArray, strat);
        } while(redundantParams(init, target, buf.maxBlockSize));
        candidateInfo = climbOnce(target, memoTableArray, buf, ctx, init);
        if (compareResultLT(winnerInfo.result, candidateInfo.result, target, buf.srcSize)) {
            winnerInfo = candidateInfo;
            BMK_printWinnerOpt(stdout, CUSTOM_LEVEL, winnerInfo.result, winnerInfo.params, target, buf.srcSize);
            i = 0;
            continue;
        }
        CHECKTIME(winnerInfo);
        i++;
    }
    return winnerInfo;
}

/* goes best, best-1, best+1, best-2, ... */
/* return 0 if nothing remaining */
static int nextStrategy(const int currentStrategy, const int bestStrategy)
{
    if(bestStrategy <= currentStrategy) {
        int candidate = 2 * bestStrategy - currentStrategy - 1;
        if(candidate < 1) {
            candidate = currentStrategy + 1;
            if(candidate > (int)ZSTD_STRATEGY_MAX) {
                return 0;
            } else {
                return candidate;
            }
        } else {
            return candidate;
        }
    } else { /* bestStrategy >= currentStrategy */
        int candidate = 2 * bestStrategy - currentStrategy;
        if(candidate > (int)ZSTD_STRATEGY_MAX) {
            candidate = currentStrategy - 1;
            if(candidate < 1) {

ext/zstd/tests/paramgrill.c  view on Meta::CPAN

        if (BMK_benchParam(&res, buf, ctx, g_params)) {
            ret = 45;
            goto _cleanUp;
        }
        if(compareResultLT(winner.result, res, relaxTarget(target), buf.srcSize)) {
            winner.result = res;
            winner.params = g_params;
        }
    }

    /* bench */
    DISPLAYLEVEL(2, "\r%79s\r", "");
    if(nbFiles == 1) {
        DISPLAYLEVEL(2, "optimizing for %s", fileNamesTable[0]);
    } else {
        DISPLAYLEVEL(2, "optimizing for %lu Files", (unsigned long)nbFiles);
    }

    if(target.cSpeed != 0) { DISPLAYLEVEL(2," - limit compression speed %u MB/s", (unsigned)(target.cSpeed >> 20)); }
    if(target.dSpeed != 0) { DISPLAYLEVEL(2, " - limit decompression speed %u MB/s", (unsigned)(target.dSpeed >> 20)); }
    if(target.cMem != (U32)-1) { DISPLAYLEVEL(2, " - limit memory %u MB", (unsigned)(target.cMem >> 20)); }

    DISPLAYLEVEL(2, "\n");
    init_clockGranularity();

    {   paramValues_t CParams;

        /* find best solution from default params */
        {   const int maxSeeds = g_noSeed ? 1 : ZSTD_maxCLevel();
            DEBUGOUTPUT("Strategy Selection\n");
            if (paramTarget.vals[strt_ind] == PARAM_UNSET) {
                BMK_benchResult_t candidate;
                int i;
                for (i=1; i<=maxSeeds; i++) {
                    int ec;
                    CParams = overwriteParams(cParamsToPVals(ZSTD_getCParams(i, buf.maxBlockSize, ctx.dictSize)), paramTarget);
                    ec = BMK_benchParam(&candidate, buf, ctx, CParams);
                    BMK_printWinnerOpt(stdout, i, candidate, CParams, target, buf.srcSize);

                    if(!ec && compareResultLT(winner.result, candidate, relaxTarget(target), buf.srcSize)) {
                        winner.result = candidate;
                        winner.params = CParams;
                    }

                    CHECKTIMEGT(ret, 0, _displayCleanUp); /* if pass time limit, stop */
                    /* if the current params are too slow, just stop. */
                    if(target.cSpeed > candidate.cSpeed * 3 / 2) { break; }
                }

                BMK_printWinnerOpt(stdout, CUSTOM_LEVEL, winner.result, winner.params, target, buf.srcSize);
            }
        }

        DEBUGOUTPUT("Real Opt\n");
        /* start 'real' optimization */
        {   int bestStrategy = (int)winner.params.vals[strt_ind];
            if (paramTarget.vals[strt_ind] == PARAM_UNSET) {
                int st = bestStrategy;
                int tries = g_maxTries;

                /* one iterations of hill climbing with the level-defined parameters. */
                {   winnerInfo_t const w1 = climbOnce(target, allMT, buf, ctx, winner.params);
                    if (compareResultLT(winner.result, w1.result, target, buf.srcSize)) {
                        winner = w1;
                    }
                    CHECKTIMEGT(ret, 0, _displayCleanUp);
                }

                while(st && tries > 0) {
                    winnerInfo_t wc;
                    DEBUGOUTPUT("StrategySwitch: %s\n", g_stratName[st]);

                    wc = optimizeFixedStrategy(buf, ctx, target, paramBase, st, allMT, tries);

                    if(compareResultLT(winner.result, wc.result, target, buf.srcSize)) {
                        winner = wc;
                        tries = g_maxTries;
                        bestStrategy = st;
                    } else {
                        st = nextStrategy(st, bestStrategy);
                        tries -= TRY_DECAY;
                    }
                    CHECKTIMEGT(ret, 0, _displayCleanUp);
                }
            } else {
                winner = optimizeFixedStrategy(buf, ctx, target, paramBase, paramTarget.vals[strt_ind], allMT, g_maxTries);
            }

        }

        /* no solution found */
        if(winner.result.cSize == (size_t)-1) {
            ret = 1;
            DISPLAY("No feasible solution found\n");
            goto _cleanUp;
        }

        /* end summary */
_displayCleanUp:
        if (g_displayLevel >= 0) {
            BMK_displayOneResult(stdout, winner, buf.srcSize);
        }
        BMK_paramValues_into_commandLine(stdout, winner.params);
        DISPLAYLEVEL(1, "grillParams size - optimizer completed \n");
    }

_cleanUp:
    freeContexts(ctx);
    freeBuffers(buf);
    freeMemoTableArray(allMT);
    return ret;
}

/*-************************************
*  CLI parsing functions
**************************************/

/** longCommandWArg() :
 *  check if *stringPtr is the same as longCommand.
 *  If yes, @return 1 and advances *stringPtr to the position which immediately follows longCommand.
 * @return 0 and doesn't modify *stringPtr otherwise.



( run in 0.895 second using v1.01-cache-2.11-cpan-71847e10f99 )