Skip to content

Commit

Permalink
Add objective encoding option to ADF translation
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Neugebauer committed Jan 22, 2019
1 parent 7c05ac5 commit 484de5c
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 14 deletions.
18 changes: 9 additions & 9 deletions dabasco/adf/import_strass.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def import_adf(dbas_graph, opinion, opinion_strict):
:param dbas_graph: DBASGraph to be used for ADF generation
:type dbas_graph: DBASGraph
:param opinion: DBASUser to be used for ADF generation
:param opinion: DBASUser to be used for ADF generation (optional)
:type opinion: DBASUser
:param opinion_strict: indicate whether user opinion shall be implemented as strict or defeasible rules
:type opinion_strict: bool
Expand All @@ -18,8 +18,8 @@ def import_adf(dbas_graph, opinion, opinion_strict):
adf = ADF()

# Get accepted/rejected statements from opinion
user_accepted_statements = opinion.get_accepted_statements()
user_rejected_statements = opinion.get_rejected_statements()
user_accepted_statements = opinion.get_accepted_statements() if opinion else []
user_rejected_statements = opinion.get_rejected_statements() if opinion else []

# Setup statement acceptance functions
for statement in dbas_graph.statements:
Expand All @@ -40,8 +40,8 @@ def import_adf(dbas_graph, opinion, opinion_strict):
statement_name = LITERAL_PREFIX_STATEMENT + str(statement)
adf.add_statement(statement_name, ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
else:
acceptance_criteria = [ADFNode(ADFNode.LEAF, LITERAL_PREFIX_INFERENCE_RULE + str(inference.id))
for inference in inferences_for]
acceptance_criteria = [ADFNode(ADFNode.LEAF, LITERAL_PREFIX_INFERENCE_RULE + str(inference_for.id))
for inference_for in inferences_for]
if statement_assumed:
acceptance_criteria.append(ADFNode(ADFNode.LEAF, LITERAL_PREFIX_OPINION_ASSUME + str(statement)))
statement_name = LITERAL_PREFIX_STATEMENT + str(statement)
Expand All @@ -56,8 +56,8 @@ def import_adf(dbas_graph, opinion, opinion_strict):
statement_name = LITERAL_PREFIX_NOT + LITERAL_PREFIX_STATEMENT + str(statement)
adf.add_statement(statement_name, ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
else:
acceptance_criteria = [ADFNode(ADFNode.LEAF, LITERAL_PREFIX_INFERENCE_RULE + str(inference.id))
for inference in inferences_against]
acceptance_criteria = [ADFNode(ADFNode.LEAF, LITERAL_PREFIX_INFERENCE_RULE + str(inference_for.id))
for inference_for in inferences_against]
if statement_rejected:
acceptance_criteria.append(ADFNode(ADFNode.LEAF, LITERAL_PREFIX_OPINION_REJECT + str(statement)))
statement_name = LITERAL_PREFIX_NOT + LITERAL_PREFIX_STATEMENT + str(statement)
Expand All @@ -66,7 +66,7 @@ def import_adf(dbas_graph, opinion, opinion_strict):
ADFNode(ADFNode.OR, acceptance_criteria)
]))

if opinion_strict:
if opinion and opinion_strict:
# Setup strict user assumption acceptance functions
for assumption in user_accepted_statements:
assumption_name = LITERAL_PREFIX_OPINION_ASSUME + str(assumption)
Expand All @@ -86,7 +86,7 @@ def import_adf(dbas_graph, opinion, opinion_strict):
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, statement_name)),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, rejection_name_negated))
]))
else:
elif opinion and not opinion_strict:
# Setup defeasible user assumption acceptance functions
for assumption in user_accepted_statements:
assumption_name = LITERAL_PREFIX_OPINION_ASSUME + str(assumption)
Expand Down
158 changes: 158 additions & 0 deletions dabasco/adf/tests/test_import_strass.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,53 @@

class TestADFImport(unittest.TestCase):

def test_discussion1_objective(self):
discussion_id = 1

dbas_discussion_json = {
"inferences": [
{"conclusion": 1, "id": 1, "is_supportive": True, "premises": [2]},
{"conclusion": 1, "id": 2, "is_supportive": False, "premises": [3]}
],
"nodes": [1, 2, 3],
"undercuts": []
}

dbas_discussion = import_dbas_graph(discussion_id=discussion_id, graph_export=dbas_discussion_json)
adf_result = import_adf(dbas_discussion, None, False)

adf_reference = ADF()

# D-BAS Statements
adf_reference.add_statement('s1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns1')),
ADFNode(ADFNode.OR, ADFNode(ADFNode.LEAF, 'i1'))
]))
adf_reference.add_statement('ns1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 's1')),
ADFNode(ADFNode.OR, ADFNode(ADFNode.LEAF, 'i2'))
]))
adf_reference.add_statement('s2', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('ns2', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('s3', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('ns3', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))

# D-BAS Inferences
adf_reference.add_statement('i1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns1')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni1')),
ADFNode(ADFNode.LEAF, 's2')
]))
adf_reference.add_statement('ni1', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i1')))
adf_reference.add_statement('i2', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 's1')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni2')),
ADFNode(ADFNode.LEAF, 's3')
]))
adf_reference.add_statement('ni2', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i2')))

self.assertTrue(adf_reference.is_equivalent_to(adf_result))

def test_discussion1_user1_defeasible(self):
discussion_id = 1
user_id = 1
Expand Down Expand Up @@ -166,6 +213,72 @@ def test_discussion1_user1_strict(self):

self.assertTrue(adf_reference.is_equivalent_to(adf_result))

def test_discussion2_objective(self):
discussion_id = 2

dbas_discussion_json = {
"inferences": [
{"conclusion": 1, "id": 1, "is_supportive": True, "premises": [2]},
{"conclusion": 1, "id": 2, "is_supportive": False, "premises": [3]},
{"conclusion": 2, "id": 3, "is_supportive": False, "premises": [4]}
],
"nodes": [1, 2, 3, 4, 5],
"undercuts": [
{"conclusion": 2, "id": 4, "premises": [5]}
]
}

dbas_discussion = import_dbas_graph(discussion_id=discussion_id, graph_export=dbas_discussion_json)
adf_result = import_adf(dbas_discussion, None, False)

adf_reference = ADF()

# D-BAS Statements
adf_reference.add_statement('s1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns1')),
ADFNode(ADFNode.OR, ADFNode(ADFNode.LEAF, 'i1'))
]))
adf_reference.add_statement('ns1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 's1')),
ADFNode(ADFNode.OR, ADFNode(ADFNode.LEAF, 'i2'))
]))
adf_reference.add_statement('s2', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('ns2', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 's2')),
ADFNode(ADFNode.OR, ADFNode(ADFNode.LEAF, 'i3'))
]))
adf_reference.add_statement('s3', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('ns3', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('s4', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('ns4', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('s5', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('ns5', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))

# D-BAS Inferences
adf_reference.add_statement('i1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns1')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni1')),
ADFNode(ADFNode.LEAF, 's2')]))
adf_reference.add_statement('ni1', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i1')))
adf_reference.add_statement('i2', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 's1')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni2')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i4')),
ADFNode(ADFNode.LEAF, 's3')]))
adf_reference.add_statement('ni2', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i2')))
adf_reference.add_statement('i3', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 's2')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni3')),
ADFNode(ADFNode.LEAF, 's4')]))
adf_reference.add_statement('ni3', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i3')))
adf_reference.add_statement('i4', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i2')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni4')),
ADFNode(ADFNode.LEAF, 's5')]))
adf_reference.add_statement('ni4', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i4')))

self.assertTrue(adf_reference.is_equivalent_to(adf_result))

def test_discussion2_user1_defeasible(self):
discussion_id = 2
user_id = 1
Expand Down Expand Up @@ -265,6 +378,51 @@ def test_discussion2_user1_defeasible(self):

self.assertTrue(adf_reference.is_equivalent_to(adf_result))

def test_discussion3_objective(self):
discussion_id = 3

dbas_discussion_json = {
"inferences": [
{"conclusion": 1, "id": 1, "is_supportive": True, "premises": [2]},
{"conclusion": 2, "id": 2, "is_supportive": True, "premises": [1]}
],
"nodes": [1, 2],
"undercuts": []
}

dbas_discussion = import_dbas_graph(discussion_id=discussion_id, graph_export=dbas_discussion_json)
adf_result = import_adf(dbas_discussion, None, False)

adf_reference = ADF()

# D-BAS Statements
adf_reference.add_statement('s1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns1')),
ADFNode(ADFNode.OR, ADFNode(ADFNode.LEAF, 'i1'))
]))
adf_reference.add_statement('ns1', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))
adf_reference.add_statement('s2', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns2')),
ADFNode(ADFNode.OR, ADFNode(ADFNode.LEAF, 'i2'))
]))
adf_reference.add_statement('ns2', ADFNode(ADFNode.LEAF, ADFNode.CONSTANT_FALSE))

# D-BAS Inferences
adf_reference.add_statement('i1', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns1')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni1')),
ADFNode(ADFNode.LEAF, 's2')
]))
adf_reference.add_statement('ni1', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i1')))
adf_reference.add_statement('i2', ADFNode(ADFNode.AND, [
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ns2')),
ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'ni2')),
ADFNode(ADFNode.LEAF, 's1')
]))
adf_reference.add_statement('ni2', ADFNode(ADFNode.NOT, ADFNode(ADFNode.LEAF, 'i2')))

self.assertTrue(adf_reference.is_equivalent_to(adf_result))


if __name__ == '__main__':
unittest.main()
14 changes: 9 additions & 5 deletions dabasco/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ def toastify(discussion, user, opinion_strict):
return jsonify(result)


@app.route('/evaluate/adfify/dis/<int:discussion>',
defaults={'user': None, 'opinion_strict': 0})
@app.route('/evaluate/adfify/dis/<int:discussion>/user/<int:user>',
defaults={'opinion_strict': 0})
@app.route('/evaluate/adfify/dis/<int:discussion>/user/<int:user>/opinion_strict',
Expand All @@ -137,16 +139,18 @@ def adfify(discussion, user, opinion_strict):

# Get D-BAS graph and user data
dbas_graph = load_dbas_graph_data(discussion)
dbas_user = load_dbas_user_data(discussion, user)
dbas_user = load_dbas_user_data(discussion, user) if user else None

# Create ADF
adf = adf_import_strass.import_adf(dbas_graph, dbas_user, opinion_strict=bool(opinion_strict))

# Convert to DIAMOND/YADF formatted string
output_string = adf_export_diamond.export_diamond(adf)
json_result = jsonify({DABASCO_OUTPUT_KEYWORD_DISCUSSION_ID: discussion,
DABASCO_OUTPUT_KEYWORD_USER_ID: user,
DABASCO_OUTPUT_KEYWORD_ADF: output_string})
str_output = adf_export_diamond.export_diamond(adf)
result = {DABASCO_OUTPUT_KEYWORD_DISCUSSION_ID: discussion,
DABASCO_OUTPUT_KEYWORD_ADF: str_output}
if user:
result[DABASCO_OUTPUT_KEYWORD_USER_ID] = user
json_result = jsonify(result)
return json_result


Expand Down

0 comments on commit 484de5c

Please sign in to comment.