def test_shouldBeUnachievable(): root = Goal(Decomposition.AND, "root") context1 = Context("c1") context2 = Context("c2") current = [] current.append(context1) task1 = Task("T1") task2 = Task("T2") task1.addApplicableContext(context2) task2.addApplicableContext(context2) root.addDependency(task1) root.addDependency(task2) deps = [] deps.append(task1) deps.append(task2) plan = PragmaticPlanning().isAchievable(root, current, None) assert plan is None
def test_refinement(): refinement = Refinement() task = Task("T1") delegation = Delegation("D1") goal = Goal(Decomposition.AND, "G1") assert task.myType() is refinement.TASK assert delegation.myType() is refinement.DELEGATION assert goal.myType() is refinement.GOAL
def test_aNonApplicableRootGoalIsNotAchievable(): goal = Goal(Decomposition.AND, "G1") current = Context("C1") fullContext = [] qc = QualityConstraint(current, CommonMetrics.SECONDS, 15, Comparison.LESS_OR_EQUAL_TO) goal.addApplicableContext(Context("C2")) interp = Interpretation() interp.addQualityConstraint(qc) assert PragmaticPlanning().isAchievable(goal, fullContext, interp) is None
def test_shouldBeApplicable(): goal = Goal(Decomposition.AND, "G1") task = Task("T1") delegation = Delegation("D1") contextCurrent = Context("C1") fullContext = [] fullContext.append(contextCurrent) goal.addApplicableContext(contextCurrent) task.addApplicableContext(contextCurrent) delegation.addApplicableContext(contextCurrent) assert True is PragmaticPlanning().isApplicable(goal, fullContext) assert True is PragmaticPlanning().isApplicable(task, fullContext) assert True is PragmaticPlanning().isApplicable(delegation, fullContext)
def test_shouldBeAchievable(): root = Goal(Decomposition.AND, "root") context = Context("c1") current = [] current.append(context) task1 = Task("t1") task2 = Task("t2") task1.addApplicableContext(context) root.addDependency(task1) root.addDependency(task2) plan = PragmaticPlanning().isAchievable(root, current, None) assert plan assert task2 in plan.getTasks()
def test_aGoalOrDecomposedWithTwoTasksMayNotBeAchievable(): goal = Goal(Decomposition.OR, "Root") task1 = Task("T1") task2 = Task("T2") current = Context("C1") fullContext = [] fullContext.append(current) qc = QualityConstraint(current, CommonMetrics.SECONDS, 15, Comparison.LESS_OR_EQUAL_TO) task1.addApplicableContext(current) task1.setProvidedQuality(current, CommonMetrics.SECONDS, 16) task2.addApplicableContext(current) task2.setProvidedQuality(current, CommonMetrics.SECONDS, 17) goal.addDependency(task1) goal.addDependency(task2) goal.addApplicableContext(current) interp = Interpretation() interp.addQualityConstraint(qc) plan = PragmaticPlanning().isAchievable(goal, fullContext, interp) assert goal.decomposition is Decomposition.OR assert plan is None
def test_shouldGetDependencies(): root = Goal(Decomposition.AND, "root") task = Task("T1") goal = Goal(Decomposition.AND, "G1") delegation = Delegation("D1") root.addDependency(task) root.addDependency(goal) root.addDependency(delegation) deps = [] deps.append(delegation) deps.append(goal) deps.append(task) for d in deps: assert d in root.dependencies
def test_shouldGetApplicableDependencies(): root = Goal(Decomposition.AND, "root") context = Context("c1") current = [] current.append(context) task = Task("t1") goal = Goal(Decomposition.AND, "g1") delegation = Delegation("D1") task.addApplicableContext(context) root.addDependency(task) root.addDependency(goal) root.addDependency(delegation) deps = [] deps.append(task) assert 1 == len(deps) assert task in deps
def test_aGoalWithATaskMayBeAchievable(): goal = Goal(Decomposition.AND, "Root") task = Task("T1") current = Context("C1") fullContext = [] fullContext.append(current) qc = QualityConstraint(current, CommonMetrics.SECONDS, 15, Comparison.LESS_OR_EQUAL_TO) interp = Interpretation() interp.addQualityConstraint(qc) task.addApplicableContext(current) task.setProvidedQuality(current, CommonMetrics.SECONDS, 13) goal.addDependency(task) goal.addApplicableContext(current) plan = PragmaticPlanning().isAchievable(goal, fullContext, interp) assert len(plan.getTasks()) == 1
def __init__(self): # Goals self.respondToEmergencyGoal = Pragmatic(Decomposition.AND, "respondToEmergencyGoal") self.emergencyIsDetectedGoal = Pragmatic(Decomposition.OR, "emergencyIsDetectedGoal") self.centralReceivesInfoGoal = Pragmatic(Decomposition.AND, "centralReceivesInfoGoal") self.locationIsIdentifiedGoal = Pragmatic(Decomposition.OR, "locationIsIdentifiedGoal") self.infoIsPreparedGoal = Pragmatic(Decomposition.OR, "infoIsPreparedGoal") self.isNotifiedAboutEmergencyGoal = Pragmatic( Decomposition.OR, "isNotifiedAboutEmergencyGoal") self.callForHelpIsAcceptedGoal = Goal(Decomposition.AND, "callForHelpIsAcceptedGoal") self.falseAlarmIsCheckedGoal = Goal(Decomposition.OR, "falseAlarmIsCheckedGoal") self.pIsContacted = Goal(Decomposition.AND, "pIsContacted") self.receivesEmergencyButtonCallGoal = Goal( Decomposition.OR, "receivesEmergencyButtonCallGoal") self.situationsAreIdentifiedGoal = Goal(Decomposition.AND, "situationsAreIdentifiedGoal") self.vitalSignsAreMonitoredGoal = Goal(Decomposition.AND, "vitalSignsAreMonitoredGoal") self.infoIsSentToEmergencyGoal = Goal(Decomposition.OR, "infoIsSentToEmergencyGoal") self.setupAutomatedInfoGoal = Goal(Decomposition.AND, "setupAutomatedInfoGoal") self.situationDataIsRecoveredGoal = Goal( Decomposition.AND, "situationDataIsRecoveredGoal") self.contactResponsibleGoal = Goal(Decomposition.AND, "contactResponsibleGoal") self.medicalCareReachesGoal = Goal(Decomposition.AND, "medicalCareReachesGoal") self.ambulanceIsDispatchedToLocationGoal = Goal( Decomposition.AND, "ambulanceIsDispatchedToLocationGoal")
def __init__(self): self.tasks = MpersTasks() self.goals = MpersGoals() # Refinements self.goals.respondToEmergencyGoal.addDependency( self.goals.emergencyIsDetectedGoal) self.goals.respondToEmergencyGoal.addDependency( self.goals.isNotifiedAboutEmergencyGoal) self.goals.respondToEmergencyGoal.addDependency( self.goals.centralReceivesInfoGoal) self.goals.respondToEmergencyGoal.addDependency( self.goals.medicalCareReachesGoal) self.goals.emergencyIsDetectedGoal.addDependency( self.goals.callForHelpIsAcceptedGoal) self.goals.emergencyIsDetectedGoal.addDependency( self.goals.situationsAreIdentifiedGoal) self.goals.callForHelpIsAcceptedGoal.addDependency( self.goals.receivesEmergencyButtonCallGoal) self.goals.callForHelpIsAcceptedGoal.addDependency( self.goals.falseAlarmIsCheckedGoal) self.goals.receivesEmergencyButtonCallGoal.addDependency( self.tasks.notifyCentralBySMSTask) self.goals.receivesEmergencyButtonCallGoal.addDependency( self.tasks.notifyCentralByInternetTask) self.goals.falseAlarmIsCheckedGoal.addDependency( self.tasks.acceptEmergencyTask) self.goals.falseAlarmIsCheckedGoal.addDependency( self.goals.pIsContacted) self.goals.pIsContacted.addDependency( self.tasks.confirmEmergencyByCallTask) self.goals.situationsAreIdentifiedGoal.addDependency( self.tasks.processDataFromSensorsTask) self.goals.situationsAreIdentifiedGoal.addDependency( self.goals.vitalSignsAreMonitoredGoal) self.goals.situationsAreIdentifiedGoal.addDependency( self.tasks.identifySituationTask) self.goals.vitalSignsAreMonitoredGoal.addDependency( self.tasks.collectDataFromSensorsTask) self.goals.vitalSignsAreMonitoredGoal.addDependency( self.tasks.persistDataToDatabaseTask) self.goals.isNotifiedAboutEmergencyGoal.addDependency( self.tasks.notifyByLightAlertTask) self.goals.isNotifiedAboutEmergencyGoal.addDependency( self.tasks.notifyByMobileVibrationTask) self.goals.isNotifiedAboutEmergencyGoal.addDependency( self.tasks.notifyBySoundAlertTask) self.goals.isNotifiedAboutEmergencyGoal.addDependency( self.tasks.centralCallTask) self.goals.centralReceivesInfoGoal.addDependency( self.goals.infoIsSentToEmergencyGoal) self.goals.centralReceivesInfoGoal.addDependency( self.goals.infoIsPreparedGoal) self.goals.infoIsSentToEmergencyGoal.addDependency( self.tasks.sendInfoByInternetTask) self.goals.infoIsSentToEmergencyGoal.addDependency( self.tasks.sendInfoBySMSTask) self.goals.infoIsPreparedGoal.addDependency( self.goals.setupAutomatedInfoGoal) self.goals.infoIsPreparedGoal.addDependency( self.goals.contactResponsibleGoal) self.goals.setupAutomatedInfoGoal.addDependency( self.goals.locationIsIdentifiedGoal) self.goals.setupAutomatedInfoGoal.addDependency( self.goals.situationDataIsRecoveredGoal) self.goals.locationIsIdentifiedGoal.addDependency( self.tasks.accessLocationFromTriangulationTask) self.goals.locationIsIdentifiedGoal.addDependency( self.tasks.considerLastKnownLocationTask) self.goals.locationIsIdentifiedGoal.addDependency( self.tasks.identifyLocationByVoiceCallTask) self.goals.locationIsIdentifiedGoal.addDependency( self.tasks.accessLocationFromGPSTask) self.goals.situationDataIsRecoveredGoal.addDependency( self.tasks.accessDataFromDatabaseTask) self.goals.contactResponsibleGoal.addDependency( self.tasks.getInfoFromResponsibleTask) self.goals.medicalCareReachesGoal.addDependency( self.goals.ambulanceIsDispatchedToLocationGoal) self.goals.ambulanceIsDispatchedToLocationGoal.addDependency( self.tasks.ambulanceDispatchDelegationTask) # Applicable Contexts self.tasks.notifyCentralBySMSTask.addApplicableContext( self.contexts.c2) self.tasks.notifyCentralByInternetTask.addApplicableContext( self.contexts.c3) self.tasks.notifyCentralByInternetTask.addApplicableContext( self.contexts.c4) self.tasks.acceptEmergencyTask.addNonapplicableContext( self.contexts.c2) self.tasks.confirmEmergencyByCallTask.addApplicableContext( self.contexts.c2) self.tasks.notifyByMobileVibrationTask.addApplicableContext( self.contexts.c1) self.tasks.notifyBySoundAlertTask.addApplicableContext( self.contexts.c6) self.tasks.notifyByLightAlertTask.addApplicableContext( self.contexts.c7) self.tasks.centralCallTask.addApplicableContext(self.contexts.c8) self.tasks.sendInfoBySMSTask.addApplicableContext(self.contexts.c2) self.tasks.sendInfoByInternetTask.addApplicableContext( self.contexts.c3) self.tasks.sendInfoByInternetTask.addApplicableContext( self.contexts.c4) self.tasks.identifyLocationByVoiceCallTask.addApplicableContext( self.contexts.c2) self.tasks.accessLocationFromTriangulationTask.addApplicableContext( self.contexts.c2) self.tasks.accessLocationFromGPSTask.addApplicableContext( self.contexts.c5) # Goal Interpretation qc1 = QualityConstraint(None, MpersMetrics.SECONDS, 180, Comparison.LESS_OR_EQUAL_TO) qc2 = QualityConstraint(self.contexts.c10, MpersMetrics.SECONDS, 90, Comparison.LESS_OR_EQUAL_TO) qc3 = QualityConstraint(self.contexts.c9, MpersMetrics.SECONDS, 240, Comparison.LESS_OR_EQUAL_TO) self.goals.respondToEmergencyGoal.interp.addQualityConstraint(qc1) self.goals.respondToEmergencyGoal.interp.addQualityConstraint(qc2) self.goals.respondToEmergencyGoal.interp.addQualityConstraint(qc3) qc1 = QualityConstraint(None, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 30, Comparison.LESS_OR_EQUAL_TO) qc2 = QualityConstraint(self.contexts.c3, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 10, Comparison.LESS_OR_EQUAL_TO) qc3 = QualityConstraint(self.contexts.c9, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 5, Comparison.LESS_OR_EQUAL_TO) self.goals.emergencyIsDetectedGoal.interp.addQualityConstraint(qc1) self.goals.emergencyIsDetectedGoal.interp.addQualityConstraint(qc2) self.goals.emergencyIsDetectedGoal.interp.addQualityConstraint(qc3) qc1 = QualityConstraint(None, MpersMetrics.SECONDS, 60, Comparison.LESS_OR_EQUAL_TO) self.goals.centralReceivesInfoGoal.interp.addQualityConstraint(qc1) qc4 = QualityConstraint(None, MpersMetrics.DISTANCE_ERROR, 1000, Comparison.LESS_OR_EQUAL_TO) qc6 = QualityConstraint(self.contexts.c5, MpersMetrics.DISTANCE_ERROR, 20, Comparison.LESS_OR_EQUAL_TO) qc5 = QualityConstraint(self.contexts.c10, MpersMetrics.DISTANCE_ERROR, 200, Comparison.LESS_OR_EQUAL_TO) qc1 = QualityConstraint(None, MpersMetrics.SECONDS, 120, Comparison.LESS_OR_EQUAL_TO) qc3 = QualityConstraint(self.contexts.c9, MpersMetrics.SECONDS, 240, Comparison.LESS_OR_EQUAL_TO) qc2 = QualityConstraint(self.contexts.c10, MpersMetrics.SECONDS, 20, Comparison.LESS_OR_EQUAL_TO) self.goals.locationIsIdentifiedGoal.interp.addQualityConstraint(qc1) self.goals.locationIsIdentifiedGoal.interp.addQualityConstraint(qc2) self.goals.locationIsIdentifiedGoal.interp.addQualityConstraint(qc3) self.goals.locationIsIdentifiedGoal.interp.addQualityConstraint(qc4) self.goals.locationIsIdentifiedGoal.interp.addQualityConstraint(qc5) self.goals.locationIsIdentifiedGoal.interp.addQualityConstraint(qc6) qc1 = QualityConstraint(None, MpersMetrics.SECONDS, 45, Comparison.LESS_OR_EQUAL_TO) qc2 = QualityConstraint(self.contexts.c10, MpersMetrics.SECONDS, 30, Comparison.LESS_OR_EQUAL_TO) self.goals.infoIsPreparedGoal.interp.addQualityConstraint(qc1) self.goals.infoIsPreparedGoal.interp.addQualityConstraint(qc2) qc1 = QualityConstraint(None, MpersMetrics.NOISE, 10, Comparison.LESS_OR_EQUAL_TO) qc2 = QualityConstraint(self.contexts.c1, MpersMetrics.NOISE, 3, Comparison.LESS_OR_EQUAL_TO) self.goals.isNotifiedAboutEmergencyGoal.interp.addQualityConstraint( qc1) self.goals.isNotifiedAboutEmergencyGoal.interp.addQualityConstraint( qc2) # Provided Task QoS self.tasks.notifyCentralBySMSTask.setProvidedQuality( None, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 10) self.tasks.notifyCentralByInternetTask.setProvidedQuality( None, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 5) self.tasks.acceptEmergencyTask.setProvidedQuality( None, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 30) self.tasks.confirmEmergencyByCallTask.setProvidedQuality( None, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 5) self.tasks.processDataFromSensorsTask.setProvidedQuality( None, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 15) self.tasks.collectDataFromSensorsTask.setProvidedQuality( None, MpersMetrics.SECONDS, 120) self.tasks.collectDataFromSensorsTask.setProvidedQuality( self.contexts.c3, MpersMetrics.SECONDS, 60) self.tasks.persistDataToDatabaseTask.setProvidedQuality( None, MpersMetrics.SECONDS, 5) self.tasks.identifySituationTask.setProvidedQuality( None, MpersMetrics.FALSE_NEGATIVE_PERCENTAGE, 20) self.tasks.notifyByMobileVibrationTask.setProvidedQuality( None, MpersMetrics.NOISE, 2) self.tasks.notifyBySoundAlertTask.setProvidedQuality( None, MpersMetrics.NOISE, 9) self.tasks.notifyByLightAlertTask.setProvidedQuality( None, MpersMetrics.NOISE, 0) self.tasks.centralCallTask.setProvidedQuality(None, MpersMetrics.NOISE, 7) self.tasks.sendInfoBySMSTask.setProvidedQuality( None, MpersMetrics.SECONDS, 65) self.tasks.sendInfoBySMSTask.setProvidedQuality( self.contexts.c8, MpersMetrics.SECONDS, 45) self.tasks.sendInfoByInternetTask.setProvidedQuality( None, MpersMetrics.SECONDS, 40) self.tasks.considerLastKnownLocationTask.setProvidedQuality( None, MpersMetrics.DISTANCE_ERROR, 900) self.tasks.considerLastKnownLocationTask.setProvidedQuality( None, MpersMetrics.SECONDS, 15) self.tasks.identifyLocationByVoiceCallTask.setProvidedQuality( None, MpersMetrics.DISTANCE_ERROR, 100) self.tasks.identifyLocationByVoiceCallTask.setProvidedQuality( self.contexts.c11, MpersMetrics.DISTANCE_ERROR, 300) self.tasks.identifyLocationByVoiceCallTask.setProvidedQuality( None, MpersMetrics.SECONDS, 45) self.tasks.accessLocationFromTriangulationTask.setProvidedQuality( None, MpersMetrics.DISTANCE_ERROR, 40) self.tasks.accessLocationFromTriangulationTask.setProvidedQuality( self.contexts.c11, MpersMetrics.DISTANCE_ERROR, 400) self.tasks.accessLocationFromTriangulationTask.setProvidedQuality( None, MpersMetrics.SECONDS, 30) self.tasks.accessLocationFromGPSTask.setProvidedQuality( None, MpersMetrics.DISTANCE_ERROR, 20) self.tasks.accessLocationFromGPSTask.setProvidedQuality( self.contexts.c11, MpersMetrics.DISTANCE_ERROR, 30) self.tasks.accessLocationFromGPSTask.setProvidedQuality( None, MpersMetrics.SECONDS, 50) self.tasks.accessDataFromDatabaseTask.setProvidedQuality( None, MpersMetrics.SECONDS, 20) self.tasks.getInfoFromResponsibleTask.setProvidedQuality( None, MpersMetrics.SECONDS, 25) self.tasks.getInfoFromResponsibleTask.setProvidedQuality( self.contexts.c11, MpersMetrics.SECONDS, 50) self.tasks.ambulanceDispatchDelegationTask.setProvidedQuality( None, MpersMetrics.SECONDS, 30) self.rootGoal = Goal(Decomposition.AND, "rootGoal") self.rootGoal = self.goals.respondToEmergencyGoal
def __init__(self, decomposition, identifier): Goal.__init__(self, decomposition, identifier) self.interp = Interpretation()