def getROCArea(cls, tcurve: Instances):
     n = tcurve.numInstances()
     if cls.RELATION_NAME != tcurve.relationName() or n == 0:
         return float('nan')
     tpInd = tcurve.attribute(cls.TRUE_POS_NAME).index()
     fpInd = tcurve.attribute(cls.FALSE_POS_NAME).index()
     tpVals = tcurve.attributeToDoubleArray(tpInd)
     fpVals = tcurve.attributeToDoubleArray(fpInd)
     area = cumNeg = 0
     totalPos = tpVals[0]
     totalNeg = fpVals[0]
     for i in range(n):
         if i < n - 1:
             cip = tpVals[i] - tpVals[i + 1]
             cin = fpVals[i] - fpVals[i + 1]
         else:
             cip = tpVals[n - 1]
             cin = fpVals[n - 1]
         area += cip * (cumNeg + (0.5 * cin))
         cumNeg += cin
     if totalNeg * totalPos == 0:
         if area == 0:
             return float("nan")
         elif area > 0:
             return float("inf")
         else:
             return float("-inf")
     area /= (totalNeg * totalPos)
     return area
 def getPRCArea(cls, tcurve: Instances):
     n = tcurve.numInstances()
     if cls.RELATION_NAME != tcurve.relationName() or n == 0:
         return float('nan')
     pInd = tcurve.attribute(cls.PRECISION_NAME).index()
     rInd = tcurve.attribute(cls.RECALL_NAME).index()
     pVals = tcurve.attributeToDoubleArray(pInd)
     rVals = tcurve.attributeToDoubleArray(rInd)
     area = 0
     xlast = rVals[n - 1]
     for i in range(n - 2, -1, -1):
         recallDelta = rVals[i] - xlast
         area += pVals[i] * recallDelta
         xlast = rVals[i]
     if area == 0:
         return Utils.missingValue()
     return area