def recordBoxStats(listOfBoxes, phaseLabel):
        requires(isinstance(phaseLabel, str))
        requires(len(phaseLabel) > 0)
        requires(isinstance(listOfBoxes, list))
        requires(all([isProperBox(x) for x in listOfBoxes]))

        labelForThisPhaseInQuestionAnswering = "Question_DomainOfVariablesInResponce:" + phaseLabel

        #V~~VV~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V~V
        # Below is largely copied from descriptionState.py
        # TODO: add this sort of code as a funtion in the utils to call upon....
        #=========================================================================
        generalSummaryFunctionsAndLabelsForThem = [\
            ( (lambda A : np.prod(np.diff(A, axis=1)) ), "bvolume"), \
            ( (lambda A : np.min(np.diff(A, axis=1)) ), "bminSideLength"), \
            ( (lambda A : np.max(np.diff(A, axis=1)) ), "bmaxSideLength"), \
            ( (lambda A : np.sum(np.diff(A, axis=1)) ), "bsumSideLengths"), \
        ]
        for thisFunctAndLabel in generalSummaryFunctionsAndLabelsForThem:
            theseValues = [thisFunctAndLabel[0](x) for x in listOfBoxes]
            resultValue = distributionStatics(theseValues)
            specificLabel = labelForThisPhaseInQuestionAnswering + ":" + thisFunctAndLabel[
                1]
            for thisKey in resultValue:
                commandToExecute = \
                    "INSERT INTO QAStateValues ( QAStateUUID , fieldName, fieldValue) VALUES ('" + \
                    ObjDatabaseValueTracker.get_QAStateUUID_mostRecentBeingComputed() + "', '" + (specificLabel + ":" + thisKey)  + "', ? );"
                objDatabaseInterface.interfaceBleed_insertValuesForBlob(\
                    commandToExecute, [resultValue[thisKey]]  )
            objDatabaseInterface.commit()
        #^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^
        return
def analysis(universeBox, thisInstanceOfModelBoxProgatorManager, functionToStatisfy, functionToDetermineWhenToGiveUpOnBox, \
        limitSplittingToAxisWithIndicesInThisList=None, functionToCheckWhetherNoPointsInTheBoxStatisfyCondition=None):
    timingInfoForLocation_2e048534_BoxTest = []
    requires(isinstance(limitSplittingToAxisWithIndicesInThisList, list))
    requires( \
        np.all([(x >= 0 and x < getDimensionOfBox(universeBox)) for x in limitSplittingToAxisWithIndicesInThisList]))
    requires( \
        (len(set(limitSplittingToAxisWithIndicesInThisList)) == len(limitSplittingToAxisWithIndicesInThisList))  )

    CEGARFileWrittingManagerInstance = CEGARFileWrittingManager(universeBox)
    CEGARFileWrittingManagerInstance.writeMetadata(\
        "fileNameOfLoadedModel", thisInstanceOfModelBoxProgatorManager.fileNameOfLoadedModel)
    CEGARFileWrittingManagerInstance.writeMetadata(\
        "functionToStatisfy", inspect.getsource(functionToStatisfy))
    CEGARFileWrittingManagerInstance.writeMetadata(\
        "functionToDetermineWhenToGiveUpOnBox", inspect.getsource(functionToDetermineWhenToGiveUpOnBox))
    CEGARFileWrittingManagerInstance.writeMetadata(\
        "QAStateUUID_mostRecentBeingComputed", ObjDatabaseValueTracker.get_QAStateUUID_mostRecentBeingComputed())
    theseInputAbstractions = getInitialAbstraction_boxesBySign(universeBox)
    assert (isinstance(theseInputAbstractions, list))
    assert (len(theseInputAbstractions) > 0)

    scalingForSplitting = universeBox[:, 1] - universeBox[:, 0]
    tempBox = scalingForSplitting.copy()
    # TODO: remove this unnecessary copy in the near future.
    # As implemented in the splitBox file, when the scaling factor has a nan in a posotion,
    # the axis corresponding to that index is ignored.
    tempBox[:] = np.nan
    tempBox[limitSplittingToAxisWithIndicesInThisList] = scalingForSplitting[
        limitSplittingToAxisWithIndicesInThisList]
    scalingForSplitting = tempBox

    for thisBox in theseInputAbstractions:
        anySuccess = analysis_divingIntoBox(thisBox, thisInstanceOfModelBoxProgatorManager, \
            functionToStatisfy, functionToDetermineWhenToGiveUpOnBox, CEGARFileWrittingManagerInstance, scalingForSplitting, 0, \
            functionToCheckWhetherNoPointsInTheBoxStatisfyCondition=functionToCheckWhetherNoPointsInTheBoxStatisfyCondition)
        if (not anySuccess):
            CEGARFileWrittingManagerInstance.writeBox(thisBox, [
                0, labelsForBoxes.
                HIGHESTLEVELBOXUNIONBOX_FALSESOMEWHEREANDEXHAUSTEDLOOKING
            ])

    CEGARFileWrittingManagerInstance.closeFilesToSaveResultsIn()
    return CEGARFileWrittingManagerInstance