def checkNodePossibilities(node, indy, newSSS, cellNum, model, params, KOlist,
                           KIlist, boolC):
    tol = .01 * len(newSSS)  # set tolerance for equivalence
    end = findEnd(node, model)  # find end of model for this node
    start = model.individualParse[node]  # find start of model for this node
    truth = list(indy[start:end])
    equivs = [truth]  #add if
    if (end - start) == 0:
        return truth, equivs, 0.
    indOptions = []
    indErrors = []
    # iterate over possibilities for this node
    for i in range(1, 2**(end - start)):
        tempultimate = list(indy)
        tempInd = bitList(i, len(truth))
        tempultimate[start:end] = tempInd  # set rule to one being checked
        currentsumtemp = evaluateByNode(tempultimate, cellNum, model, newSSS,
                                        params, KOlist, KIlist, boolC)
        currentsum = currentsumtemp[node]  # save the error found
        indOptions.append(tempInd)
        indErrors.append(currentsum)
        gc.collect()
    minny = min(indErrors)
    equivs = []
    # find the minimum error individual
    for i in range(len(indOptions)):
        if indErrors[i] < minny + tol:
            equivs.append(indOptions[i])
    truth = equivs[0]
    return truth, equivs, minny
Exemple #2
0
def checkNodePossibilities(node, indy, newSSS, cellNum, model, params, KOlist,
                           KIlist, boolC):
    tol = .01 * len(newSSS)
    end = findEnd(node, model)
    start = model.individualParse[node]
    truth = list(indy[start:end])
    equivs = [truth]  #add if
    if (end - start) == 0:
        return truth, equivs, 0.
    indOptions = []
    indErrors = []
    for i in range(1, 2**(end - start)):
        tempultimate = list(indy)
        tempInd = bitList(i, len(truth))
        tempultimate[start:end] = tempInd
        currentsumtemp = evaluateByNode(tempultimate, cellNum, model, newSSS,
                                        params, KOlist, KIlist, boolC)
        currentsum = currentsumtemp[node]
        indOptions.append(tempInd)
        indErrors.append(currentsum)
        gc.collect()
    minny = min(indErrors)
    equivs = []
    for i in range(len(indOptions)):
        if indErrors[i] < minny + tol:
            equivs.append(indOptions[i])
    truth = equivs[0]
    return truth, equivs, minny
def genBits(model):
    # generate random bitlist
    startInd = list(genRandBits(model.size))
    counter = 0
    # make sure bitlist isn't zero
    while numpy.sum(startInd) == 0 and counter < 10000:
        startInd = list(genRandBits(model.size))
        counter += 1
    # go through nodes and make sure that there are 1-5 ones in the random list
    for node in range(0, len(model.nodeList)):
        end = findEnd(node, model)
        start = model.individualParse[node]
        if (end - start) > 1:
            counter = 0
            while numpy.sum(startInd[start:end]) > 5 and counter < 10000:
                chosen = math.floor(random() * (end - start))
                startInd[start + int(chosen)] = 0
                counter += 1
            if numpy.sum(startInd[start:end]) == 0:
                chosen = math.floor(random() * (end - start))
                startInd[start + int(chosen)] = 1
        elif (end - start) == 1:
            startInd[start] = 1
    return [copy.deepcopy(model), startInd]
def mutFlipBitAdapt(indyIn, genfrac, mutModel):
    errors = list(indyIn.fitness.values)  # get errors
    individual = indyIn[1]
    model = indyIn[0]
    # get rid of errors in nodes that can't be changed
    errorNodes = 0
    for j in xrange(len(errors)):
        if model.andLenList[j] < 2:
            errors[j] = 0
        else:
            errorNodes = errorNodes + 1

    if numpy.sum(errors) < .05 * errorNodes or errorNodes == 0:
        # condition selection on number of incoming edges + downstream edges
        pseudoerrors = [
            len(model.possibilityList[i]) if model.successorNums[i] == 0 else
            len(model.possibilityList[i]) * model.successorNums[i]
            for i in range(len(model.nodeList))
        ]
        # zero out nodes that can't be changed
        for j in xrange(len(pseudoerrors)):
            if model.andLenList[j] < 2:
                pseudoerrors[j] = 0
        focusNode = selectMutNode(pseudoerrors)
    else:
        # if errors are relatively high, focus on nodes that fit the worst and have highest in-degree
        # calculate probabilities for mutating each node
        for i in range(len(errors)):
            temper = model.successorNums[i]
            if temper == 0:
                errors[i] = errors[i] * len(model.possibilityList[i])
            else:
                errors[i] = errors[i] * len(model.possibilityList[i]) * temper
        focusNode = selectMutNode(errors)
    # perform mutation
    if model.andLenList[focusNode] > 1:
        # find ends of the node of interest in the individual
        start = model.individualParse[focusNode]
        end = findEnd(focusNode, model)
        # mutate the inputs some of the time
        if len(model.possibilityList[focusNode]) > 3 and random() < mutModel:
            temppermup = []
            upstreamAdders = list(model.possibilityList[focusNode])
            rvals = list(model.rvalues[focusNode])
            while len(temppermup) < 3:
                randy = random()  # randomly select a node to mutate
                tempsum = sum(rvals)
                if tempsum == 0:
                    addNoder = int(math.floor(random() * len(upstreamAdders)))
                else:
                    recalc = numpy.cumsum(
                        [1. * rval / tempsum for rval in rvals])
                    addNoder = next(i for i in range(len(recalc))
                                    if recalc[i] > randy)
                temppermup.append(upstreamAdders.pop(addNoder))
                rvals.pop(addNoder)
            model.update_upstream(focusNode, temppermup)
            model.updateCpointers()
        for i in range(start, end):
            if random() < 2 / (end - start + 1):
                individual[i] = 1
            else:
                individual[i] = 0
        #ensure that there is at least one shadow and node turned on
        if numpy.sum(individual[start:end]) == 0:
            individual[start] = 1
        indyIn[0] = model
        indyIn[1] = individual
    else:
        print('did not actually check')
    return indyIn,