Exemplo n.º 1
0
def reduce(alist: Alist, children: List[Alist], G: InferenceGraph):
    delimiter = ';;'
    total = 0.0
    numList = []
    nonNumList = []
    inst_vars = alist.instantiated_attributes().keys()
    for c in children:
        for k, v in c.instantiated_attributes().items():
            if k not in inst_vars and k in alist.attributes and k != tt.OP:
                c.instantiate_variable(k, v)

        opVarValue = c.get(c.get(tt.OPVAR))
        if isinstance(opVarValue, str):
            opVarValue = list(map(str, opVarValue.split(delimiter)))
        else:
            opVarValue = [opVarValue]
        for opval in opVarValue:
            if utils.is_numeric(opval):
                total += float(opval)
                numList.append(float(opval))
                if not str(opval).startswith(vx.NESTING):
                    nonNumList.append(str(opval))

            else:
                # if not c.get(c.get(tt.OPVAR)).startswith(vx.NESTING):
                #     nonNumList.append(c.get(c.get(tt.OPVAR)))
                nonNumList.append(opval)

    if numList or nonNumList:
        if len(numList) >= len(nonNumList):
            opVar = alist.get(tt.OPVAR)
            valueToReturn = total / len(children)
            if opVar == alist.get(tt.TIME):
                valueToReturn = str(int(valueToReturn))
            alist.instantiate_variable(opVar, valueToReturn)
        else:
            # # get modal value
            # valueToReturn = max(nonNumList, key=nonNumList.count)
            counts = dict(Counter(nonNumList))
            counts_set = set(counts.values())
            max_val = max(counts_set)
            items = [x for x, y in counts.items() if y == max_val]
            valueToReturn = f'{delimiter} '.join(map(str, set(items)))

            # if len(nonNumList) == 1:
            #     valueToReturn = nonNumList[0]
            # else:
            #     # return list of different values
            #     valueToReturn = ', '.join(map(str,set(nonNumList)))

            alist.instantiate_variable(alist.get(tt.OPVAR), valueToReturn)
    else:
        return None

    alist.instantiate_variable(
        tt.COV,
        estimate_uncertainty(children,
                             len(numList) == len(children), alist.get(tt.OP),
                             len(children)))
    return alist
Exemplo n.º 2
0
 def test_getInstantiatedAttributes(self):
     alist = Alist(
         **{
             tt.ID: '1',
             tt.SUBJECT: 'Africa',
             tt.PROPERTY: 'P1082',
             tt.OBJECT: '?x',
             tt.TIME: '2010',
             tt.OPVAR: '?x',
             tt.COST: 1
         })
     alist.set('#d', 34)
     alist.set('?x', 100)
     instantiatedVars = alist.instantiated_attributes()
     self.assertTrue(
         len(instantiatedVars) > 0,
         "there should be 2 instantiated variables.")