コード例 #1
0
def optimize(data, niter, oname=None, first=True):
    import pymc, pyfits, numpy
    import indexTricks as iT

    priors = data['PRIORS']
    models = data['MODELS']
    pars = data['PARAMS']

    image = {}
    for key in data['IMG'].keys():
        image[key] = data['IMG'][key].copy()
    ZP = data['ZP']
    filters = [filt for filt in data['FILTERS']]

    sigmas = data['SIGMA']
    if 'GAIN' in data.keys():
        gain = data['GAIN']
        doSigma = True
    else:
        doSigma = False

    if 'OVRS' in data.keys():
        OVRS = data['OVRS']
    else:
        OVRS = 1

    MASK = data['MASK'].copy()
    mask = MASK == 0
    mask_r = mask.ravel()

    key2index = {}
    i = 0
    for key in filters:
        key2index[key] = i
        i += 1

    model2index = {}
    i = 0
    for key in filters:
        for model in models[key]:
            model2index[model.name] = i
            i += 1

    imshape = MASK.shape
    yc, xc = iT.overSample(imshape, OVRS)

    if doSigma == True:
        nu = {}
        eta = {}
        background = {}
        counts = {}
        sigmask = {}
        for key in filters:
            nu[key] = pymc.Uniform('nu_%s' % key,
                                   -6,
                                   6,
                                   value=log10(gain[key]))
            eta[key] = pymc.Uniform('eta_%s' % key, -4, 5, value=1.)
            background[key] = sigmas[key]
            sigmask[key] = image[key] > 1.5 * sigmas[key]**0.5
            counts[key] = image[key][sigmask[key]].copy()
            pars.append(nu[key])
            pars.append(eta[key])

        def getSigma(n=nu, e=eta, b=background, c=counts, m=mask):
            sigma = b.copy()
            sigma[m] += ((10**n) * c)**e
            return numpy.sqrt(sigma).ravel()

        sigmas = []
        for key in filters:
            parents = {
                'n': nu[key],
                'e': eta[key],
                'b': background[key],
                'c': counts[key],
                'm': sigmask[key]
            }
            sigmas.append(
                pymc.Deterministic(eval=getSigma,
                                   name='sigma_%s' % key,
                                   parents=parents,
                                   doc='',
                                   trace=False,
                                   verbose=False))
    else:
        for key in filters:
            sigmas[key] = sigmas[key].ravel()

    for key in filters:
        image[key] = image[key].ravel()

    @pymc.deterministic(trace=False)
    def logpAndMags(p=pars):
        lp = 0.
        mags = []
        for key in filters:
            indx = key2index[key]
            if doSigma == True:
                sigma = sigmas[indx].value
            else:
                sigma = sigmas[key]
            simage = (image[key] / sigma)[mask_r]
            lp += linearmodelSB(p,
                                simage,
                                sigma[mask_r],
                                mask,
                                models[key],
                                xc,
                                yc,
                                OVRS=OVRS)
            mags += [model.Mag(ZP[key]) for model in models[key]]
        return lp, mags

    @pymc.deterministic
    def lp(lpAM=logpAndMags):
        return lpAM[0]

    @pymc.deterministic
    def Mags(lpAM=logpAndMags):
        return lpAM[1]

    @pymc.observed
    def logpCost(value=0., logP=lp):
        return logP

    costs = [logpCost]
    if priors is not None:

        @pymc.observed
        def colorPrior(value=0., M=Mags):
            lp = 0.
            for p in priors:
                color = M[model2index[p[0]]] - M[model2index[p[1]]]
                lp += p[2](color)
            return lp

        costs.append(colorPrior)

    def resid(p):
        model = numpy.empty(0)
        for key in filters:
            indx = key2index[key]
            if doSigma == True:
                sigma = sigmas[indx].value
            else:
                sigma = sigmas[key]
            simage = (image[key] / sigma)[mask_r]
            model = numpy.append(
                model,
                linearmodelSB(p,
                              simage,
                              sigma[mask_r],
                              mask,
                              models[key],
                              xc,
                              yc,
                              levMar=True,
                              OVRS=OVRS))
        return model

    print "Optimizing", niter
    from SampleOpt import AMAOpt as Opt, levMar as levMar
    default = numpy.empty(0)
    for key in filters:
        indx = key2index[key]
        if doSigma == True:
            sigma = sigmas[indx].value
        else:
            sigma = sigmas[key]
        simage = (image[key] / sigma)[mask_r]
        default = numpy.append(default, simage)
#    levMar(pars,resid,default)

    cov = None
    if 'COV' in data.keys():
        cov = data['COV']

    O = Opt(pars, costs, [lp, Mags], cov=cov)
    O.set_minprop(len(pars) * 2)
    O.sample(niter / 10)

    O = Opt(pars, costs, [lp, Mags], cov=cov)
    O.set_minprop(len(pars) * 2)
    O.cov = O.cov / 4.
    O.sample(niter / 4)

    O = Opt(pars, costs, [lp, Mags], cov=cov)
    O.set_minprop(len(pars) * 2)
    O.cov = O.cov / 10.
    O.sample(niter / 4)

    O = Opt(pars, costs, [lp, Mags], cov=cov)
    O.set_minprop(len(pars) * 2)
    O.cov = O.cov / 10.
    O.sample(niter)
    logp, trace, result = O.result()
    mags = numpy.array(result['Mags'])

    for key in model2index.keys():
        result[key] = mags[:, model2index[key]].copy()
    del result['Mags']

    output = {}
    for key in filters:
        indx = key2index[key]
        if doSigma == True:
            sigma = sigmas[indx].value
        else:
            sigma = sigmas[key]
        simage = (image[key] / sigma)[mask_r]
        m = linearmodelSB([p.value for p in pars],
                          simage,
                          sigma[mask_r],
                          mask,
                          models[key],
                          xc,
                          yc,
                          noResid=True,
                          OVRS=OVRS)
        output[key] = m
    return output, (logp, trace, result)