From 79ae20115e73597fbaf18d5429d7b2788dd4efb6 Mon Sep 17 00:00:00 2001 From: ArenBabikian Date: Sat, 9 May 2020 19:09:06 -0400 Subject: Adjust PLEDEG Java Case Study file --- .../case.study.pledge.run/bin/.gitignore | 1 - .../case.study.pledge.run/bin/queries/.gitignore | 112 +++ .../bin/queries/NewOCLFileX.ocl | 45 ++ .../bin/queries/case_study_A.vql | 334 +++++++++ .../case.study.pledge.run/config/taxation.vsconfig | 50 +- .../case.study.pledge.run/inputs/FamilyTree.xmi | 3 + .../case.study.pledge.run/plugin.xml | 84 +-- .../src/queries/case_study_A.vql | 2 +- .../src/run/GeneratePledgeModels.xtend | 331 ++++++--- .../xtend-gen/run/.GeneratePledgeModels.xtendbin | Bin 12374 -> 16907 bytes .../case.study.pledge.run/xtend-gen/run/.gitignore | 1 + .../xtend-gen/run/GeneratePledgeModels.java | 812 +++++++++++++-------- 12 files changed, 1284 insertions(+), 491 deletions(-) create mode 100644 Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/.gitignore create mode 100644 Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/NewOCLFileX.ocl create mode 100644 Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/case_study_A.vql create mode 100644 Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/FamilyTree.xmi diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/.gitignore index 3d70f0da..07e30191 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/.gitignore +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/.gitignore @@ -1,2 +1 @@ -/queries/ /run/ diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/.gitignore new file mode 100644 index 00000000..527f3a0e --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/.gitignore @@ -0,0 +1,112 @@ +/.Inv17.java._trace +/.Inv20.java._trace +/.Inv33_con.java._trace +/.Inv34.java._trace +/.Inv35.java._trace +/.Inv47.java._trace +/.Inv48.java._trace +/.Inv48_helper.java._trace +/.Case_study_A.java._trace +/.Inv49.java._trace +/.Inv49_con.java._trace +/.Inv49_helper.java._trace +/.H_inv49.java._trace +/.Ocl_inv49.java._trace +/.Vql_inv49.java._trace +/.Vql_inv492.java._trace +/.H1_inv48.java._trace +/.H2_inv48.java._trace +/.Vql_inv48.java._trace +/.H3_inv48.java._trace +/.H1_inv49.java._trace +/.H2_inv49.java._trace +/.H_inv47.java._trace +/.Inv35test.java._trace +/.Inv33.java._trace +/.X.java._trace +/.H_inv16_moreThan1.java._trace +/.H_inv48_1.java._trace +/.H_inv48_2.java._trace +/.H_inv48_3.java._trace +/.H_inv49_1.java._trace +/.H_inv49_2.java._trace +/.Inv16.java._trace +/.Inv15.java._trace +/.H_inv13.java._trace +/.Inv13.java._trace +/.Inv12.java._trace +/.H_inv12_notNonRes.java._trace +/.H_inv12_notZZ.java._trace +/.H_inv11_incOver100.java._trace +/.Inv11.java._trace +/.H_inv11_incNotOver100.java._trace +/.H_inv8_notEI.java._trace +/.Inv8.java._trace +/.H_inv08_notEI.java._trace +/.Inv08.java._trace +/.H_inv08_inRange.java._trace +/.X_inv08_inRange.java._trace +/.X_inv08_notEI.java._trace +/.X_inv11_incNotOver100.java._trace +/.X_inv11_incOver100.java._trace +/.X_inv12_notNonRes.java._trace +/.X_inv12_notZZ.java._trace +/.X_inv13.java._trace +/.X_inv47.java._trace +/.X_inv48_1.java._trace +/.X_inv48_2.java._trace +/.X_inv48_3.java._trace +/.X_inv49_1.java._trace +/.X_inv49_2.java._trace +/.X_inv48_Dis.java._trace +/.X_inv48_notDis.java._trace +/.X_inv08_noType.java._trace +/.X_inv08_invalidType.java._trace +/.Inv06.java._trace +/.X_inv06_inRange.java._trace +/.Inv05.java._trace +/.X_inv05_inRange.java._trace +/.Inv03.java._trace +/.X_inv03_noAll.java._trace +/.X_inv03_eligAll.java._trace +/.X_inv03_hasAll.java._trace +/.Inv07.java._trace +/.Inv10.java._trace +/.X_inv15.java._trace +/Inv03.java +/Inv05.java +/Inv06.java +/X_inv03_eligAll.java +/X_inv03_hasAll.java +/X_inv05_inRange.java +/Case_study_A.java +/Inv07.java +/Inv08.java +/Inv10.java +/Inv11.java +/Inv12.java +/Inv13.java +/Inv15.java +/Inv17.java +/Inv20.java +/Inv33.java +/Inv34.java +/Inv35.java +/Inv47.java +/Inv48.java +/Inv49.java +/X_inv08_inRange.java +/X_inv08_noType.java +/X_inv08_notEI.java +/X_inv11_incNotOver100.java +/X_inv11_incOver100.java +/X_inv12_notNonRes.java +/X_inv12_notZZ.java +/X_inv13.java +/X_inv15.java +/X_inv47.java +/X_inv48_3.java +/X_inv48_Dis.java +/X_inv48_notDis.java +/X_inv49_1.java +/X_inv49_2.java diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/NewOCLFileX.ocl b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/NewOCLFileX.ocl new file mode 100644 index 00000000..66ae728e --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/NewOCLFileX.ocl @@ -0,0 +1,45 @@ +import 'file:/Users/Aren Babikian/git/VIATRA-Attributes/case.study.a.model/model/Taxation.ecore' + +package Taxation + +--context Income inv inv8: +--if(not self.income_type.oclIsTypeOf(Employment_Income)) then +--self.details->forAll(d| d.distance = 0) +--else +--self.details->forAll(d| d.distance >= 0.0 and d.distance <= 100) +--endif +-- +--context Legal_Union_Record inv inv490: +--self.individual_A.oclIsKindOf(Tax_Payer) +-- +--context Legal_Union_Record inv inv491: +--self.individual_B->forAll(i | i.oclIsKindOf(Physical_Person) ) +-- +--context Legal_Union_Record inv inv492: +--self.individual_B->forAll(i | not i.oclIsTypeOf(Dependent) ) +-- +--context Legal_Union_Record inv inv493: +--self.individual_A <> self.individual_B +-- +--context Tax_Payer inv inv13: +-- self.addresses->exists( hab_add:Address | hab_add.oclIsTypeOf(Habitual_Address) = true and hab_add.country=Country::ZZ) +--implies +-- self.oclIsTypeOf(Resident_Tax_Payer) + + context Income inv inv7: +let val:Real =self.details->asOrderedSet()->first().distance in +self.details->forAll(d: Income_Detail|d.distance = val) + +--context External_Allowance inv inv15: +--let child:Dependent = self.person in +--let h:Household = Household.allInstances()->select(children->includes(child))->asOrderedSet()->first() in +--let t1:Set(Physical_Person) = Set{h.parents.individual_A}->union(h.parents.individual_B)->select(oclIsKindOf(Tax_Payer)) in +--if(t1->size()=1) then +--self.reciver = t1->asOrderedSet()->first() +--else +--self.reciver = t1->asOrderedSet()->at(2) or self.reciver = t1->asOrderedSet()->at(1) +--endif + + + +endpackage \ No newline at end of file diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/case_study_A.vql b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/case_study_A.vql new file mode 100644 index 00000000..f736ec58 --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/bin/queries/case_study_A.vql @@ -0,0 +1,334 @@ +package queries + +import "http:///TaxCard.ecore" + +//AttributeRemoved -> DF + +//inv1-External_Allowance.amount is a derived feature (TODOcheck) +//inv2-Tax_Card.income.taxPayer.taxesDue is a derived feature (TODOcheck) + +//inv3-multiplicity adjusted +@Constraint(message = "inv03", severity = "error", key = {dep}) +pattern inv03(dep : Dependent) { + find x_inv03_eligAll(dep); + neg find x_inv03_hasAll(dep); +} or { + Dependent.birth_year(dep, by); + check(2018-by > 21); + Dependent.continued_studies(dep, false); + Dependent.allowances(dep, _); +} +pattern x_inv03_eligAll(dep : Dependent) { + Dependent.birth_year(dep, by); + check(2018-by <= 21); +} or { + Dependent.continued_studies(dep, true); +} +pattern x_inv03_hasAll(dep : Dependent) { + Dependent.allowances(dep, _); +} + +//inv5 - oclIsTypeOf - handled here +@Constraint(message = "inv05", severity = "error", key = {inc}) +pattern inv05(inc : Income) { + //income_type: None + neg find x_inv08_noType(inc); + Income.details.worked_days(inc, wd); + check(wd != 0); +} or { + //income_type: Not Employment_Income + Income.income_type(inc, type); + neg find x_inv08_notEI(type); + Income.details.worked_days(inc, wd); + check(wd != 0); +} or { + //income_type: Employment Income + Income.income_type(inc, type); + Employment_Income(type); + find x_inv05_inRange(inc); +} +pattern x_inv05_inRange(inc : Income) { + Income.details.worked_days(inc, wd); + check(wd < 1); +} or { + Income.details.worked_days(inc, wd); + check(wd > 25); +} + +//inv6-Does not make sens, but directly from OCL +//first part of or from definition of getAge() +@Constraint(message = "inv06", severity = "error", key = {tp}) +pattern inv06(tp : Tax_Payer) { + Tax_Payer.dependents(tp, _); + Tax_Payer.birth_year(tp, TPBy); + check(2018 - TPBy > 2018-16); +} or { + Tax_Payer.birth_year(tp, TPBy); + Tax_Payer.dependents(tp, dep); + Dependent.birth_year(dep, DepBy); + check(2018-DepBy <= 2018-TPBy-16); +} + +//inv7-OrderedSet +@Constraint(message = "inv07", severity = "error", key = {inc}) +pattern inv07(inc : Income) { + Income.details.distance(inc, d1); + Income.details.distance(inc, d2); + check(d1 != d2);//compare values +} + +//user_complete_details-AttributeRemoved + +//inv8 - oclIsTypeOf - handled here +@Constraint(message = "inv08", severity = "error", key = {inc}) +pattern inv08(inc : Income) { + //income_type: None + neg find x_inv08_noType(inc); + Income.details.distance(inc, dist); + check(dist != 0); +} or { + //income_type: Not Employment_Income + Income.income_type(inc, type); + neg find x_inv08_notEI(type); + Income.details.distance(inc, dist); + check(dist != 0); +} or { + //income_type: Employment Income + Income.income_type(inc, type); + Employment_Income(type); + find x_inv08_inRange(inc); +} +pattern x_inv08_notEI(type : Employment_Income) { + Employment_Income(type); +} +pattern x_inv08_noType(inc : Income) { + Income.income_type(inc, _); +} +pattern x_inv08_inRange(inc : Income) { + Income.details.distance(inc, dist); + check(dist < 0); +} or { + Income.details.distance(inc, dist); + check(dist > 100); +} +//inv9-DerivedFeature + +//inv10-Ordered Sets +@Constraint(message = "inv10", severity = "error", key = {inc}) +pattern inv10(inc : Income) { + Income.details.amount(inc, a1); + Income.details.amount(inc, a2); + check(a1 != a2);//compare values +} + +//inv11-attributes-handled by multiplicity +@Constraint(message = "inv11", severity = "error", key = {exp}) +pattern inv11(exp : Expense) { + find x_inv11_incOver100(exp); + find x_inv11_incNotOver100(exp); +} +pattern x_inv11_incOver100(exp : Expense) { + Expense.income.income_amount(exp, incVal); + check(incVal / 2 > 50); + +} or { + Expense.declared_amount(exp, decl); + check(decl != 50); +} +pattern x_inv11_incNotOver100(exp : Expense) { + Expense.income.income_amount(exp, incVal); + check(incVal / 2 <= 50); +} or { + Expense.declared_amount(exp, decl); + check(decl < 50); +} or { + Expense.income.income_amount(exp, incVal); + Expense.declared_amount(exp, decl); + check(decl > incVal/2); +} + +//inv12 +//exists - handled logically +@Constraint(message = "inv12", severity = "error", key = {tp}) +pattern inv12(tp : Tax_Payer) { + Tax_Payer.addresses(tp, hab_add); + Habitual_Address(hab_add); + neg find x_inv12_notZZ(hab_add); + Tax_Payer.incomes(tp, inc); + Local_Income(inc); + neg find x_inv12_notNonRes(tp); +} +pattern x_inv12_notNonRes(tp : Non_Resident_Tax_Payer) { + Non_Resident_Tax_Payer(tp); +} +pattern x_inv12_notZZ(hab_add : Habitual_Address) { + Address.country(hab_add, ::ZZ); +} + +//inv13 - Added new containment rel Phys_Pers->Address +//exists - handled logically +@Constraint(message = "inv13", severity = "error", key = {tp}) +pattern inv13(tp : Tax_Payer) { + Tax_Payer.addresses(tp, hab_add); + Habitual_Address(hab_add); + Address.country(hab_add, ::ZZ); + neg find x_inv13(tp); +} +pattern x_inv13(tp : Resident_Tax_Payer) { + Resident_Tax_Payer(tp); +} + +//inv14-MultiplicityChanged + +//inv15-Ordered Sets in assignment if block +//ERROR if no household object +@Constraint(message = "inv15", severity = "error", key = {ea}) +pattern inv15(ea : External_Allowance) { + neg find x_inv15(ea); +} +pattern x_inv15(ea : External_Allowance) { + External_Allowance.person(ea, child); + Household.children(h, child);//only one due to multiplicity + Household.parents.individual_A(h, iA); + Tax_Payer(iA); + External_Allowance.reciver(ea, iA); +} or { + External_Allowance.person(ea, child); + Household.children(h, child);//only one due to multiplicity + Household.parents.individual_B(h, iB); + Tax_Payer(iB); + External_Allowance.reciver(ea, iB); +} + +//inv16-Tax_Card.tax_card_type is a derived feature + +//inv17-attribute-handled by multiplicity +@Constraint(message = "inv17", severity = "error", key = {lur}) +pattern inv17(lur : Legal_Union_Record) { + Legal_Union_Record.start_year(lur, sy); + check(sy < 1950); +} or { + Legal_Union_Record.start_year(lur, sy); + check(sy > 2018); +} + +//inv18-MultiplicityChecked +//inv19-MultiplicityChecked + +//inv20-Useless constraint since both edges are containment (TODOCheck) +//OclIsUndefined-Handled by multiplicity +@Constraint(message = "inv20", severity = "error", key = {lur}) +pattern inv20(lur : Legal_Union_Record) { + Legal_Union_Record.individual_A(lur, iA); + Legal_Union_Record.individual_B(lur, iB); + iA == iB; +} +//inv21-MultiplicityChecked +//inv22-MultiplicityChecked +//inv23-MultiplicityChecked +//inv24-MultiplicityChecked +//inv25-MultiplicityChecked +//inv26-MultiplicityChanged +//inv27-dupOfInv24 +//inv28-dubOfInv23 +//inv29-MultiplicityChanged +//inv30-AttributeRemoved +//inv31-AttributeRemoved +//inv32-AttributeRemoved + +//inv33-attribute-handled by multiplicity +@Constraint(message = "inv33", severity = "error", key = {p}) +pattern inv33(p : Physical_Person) { + Physical_Person.birth_year(p, by); + check(2018-by < 0); +} or { + Physical_Person.birth_year(p, by); + check(2018-by > 100); +} + +//inv34-attribute-handled by multiplicity +@Constraint(message = "inv34", severity = "error", key = {p}) +pattern inv34(p : Physical_Person) { + Physical_Person.birth_month(p, birthMonth); + check(birthMonth < 1); +} or { + Physical_Person.birth_month(p, birthMonth); + check(birthMonth > 12); +} + +//inv35-attribute-handled by multiplicity +@Constraint(message = "inv35", severity = "error", key = {p}) +pattern inv35(p : Physical_Person) { + Physical_Person.birth_day(p, birthDay); + check(birthDay < 1); +} or { + Physical_Person.birth_day(p, birthDay); + check(birthDay > 28); +} + +//inv36-AttributeRemoved +//inv37-AttributeRemoved +//inv38-AttributeRemoved +//inv39-AttributeRemoved +//inv40-AttributeRemoved +//inv41-AttributeRemoved +//inv42-AttributeRemoved +//inv43-AttributeRemoved +//inv44-AttributeRemoved +//inv45-AttributeRemoved +//inv46-AttributeRemoved + +//inv47-attributes-handled by multiplicity +@Constraint(message = "inv47", severity = "error", key = {lur}) +pattern inv47(lur : Legal_Union_Record) { + Legal_Union_Record.end_year(lur, endY); + Legal_Union_Record.start_year(lur, startY); + neg find x_inv47(lur); + check(startY >= endY); +} +pattern x_inv47(lur : Legal_Union_Record) { + Legal_Union_Record.separation_cause(lur, ::NONE); + Legal_Union_Record.end_year(lur, -1); +} + +//inv48-attributes-handled by multiplicity +@Constraint(message = "inv48", severity = "error", key = {p}) +pattern inv48(p : Physical_Person) { + neg find x_inv48_notDis(p); + neg find x_inv48_Dis(p); +} +pattern x_inv48_notDis(p : Physical_Person) { + Physical_Person.disability_type(p, ::NONE); + Physical_Person.disability_percentage(p, 0.0); +} +pattern x_inv48_Dis(p : Physical_Person) { + neg find x_inv48_3(p); + Physical_Person.disability_percentage(p, disPer); + check(disPer > 0.0); + check(disPer <= 1.0); +} +pattern x_inv48_3(p : Physical_Person) { + Physical_Person.disability_type(p, ::NONE); +} + +//inv49-OclKindOf-handled by multiplicity +@Constraint(message = "inv49", severity = "error", key = {lur}) +pattern inv49(lur : Legal_Union_Record) { + neg find x_inv49_1(lur); +} +pattern x_inv49_1(lur : Legal_Union_Record) { + Legal_Union_Record.individual_A(lur, iA); + Legal_Union_Record.individual_B(lur, iB); + Tax_Payer(iA); + Physical_Person(iB); + neg find x_inv49_2(iB); + iA != iB; +} +pattern x_inv49_2(iB: Dependent) { + Dependent(iB); +} + +//inv50-MultiplicityChecked +//inv51-MultiplicityChecked +//inv52-MultiplicityChecked +//inv53-MultiplicityChecked \ No newline at end of file diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/taxation.vsconfig b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/taxation.vsconfig index fa3f6000..0c819976 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/taxation.vsconfig +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/taxation.vsconfig @@ -1,25 +1,25 @@ -import epackage "config/Taxation.ecore" -//import viatra "src/queries/familyTreeConstraints.vql" - -generate { - metamodel = { package Taxation } - //constraints = { package queries} - solver = ViatraSolver - scope = { - //#node = 6, - #int = {0}, - #real = {0.0} - } - - config = { - runtime = 10, - log-level = normal - } - - runs = 1 - - debug = "config/output/debug/" - log = "config/output/debug/log.txt" - output = "config/output/models" - statistics = "config/output/debug/statistics.csv" -} \ No newline at end of file +//import epackage "config/Taxation.ecore" +////import viatra "src/queries/familyTreeConstraints.vql" +// +//generate { +// metamodel = { package Taxation } +// //constraints = { package queries} +// solver = ViatraSolver +// scope = { +// //#node = 6, +// #int = {0}, +// #real = {0.0} +// } +// +// config = { +// runtime = 10, +// log-level = normal +// } +// +// runs = 1 +// +// debug = "config/output/debug/" +// log = "config/output/debug/log.txt" +// output = "config/output/models" +// statistics = "config/output/debug/statistics.csv" +//} \ No newline at end of file diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/FamilyTree.xmi b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/FamilyTree.xmi new file mode 100644 index 00000000..066b286f --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/FamilyTree.xmi @@ -0,0 +1,3 @@ + + diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plugin.xml b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plugin.xml index 8b036ff2..63aa0b02 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plugin.xml +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/plugin.xml @@ -1,42 +1,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/queries/case_study_A.vql b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/queries/case_study_A.vql index 5d46bf42..f736ec58 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/queries/case_study_A.vql +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/queries/case_study_A.vql @@ -1,5 +1,5 @@ package queries - + import "http:///TaxCard.ecore" //AttributeRemoved -> DF diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GeneratePledgeModels.xtend b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GeneratePledgeModels.xtend index ff0e1d03..3f5855d8 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GeneratePledgeModels.xtend +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/src/run/GeneratePledgeModels.xtend @@ -1,6 +1,7 @@ package run import Taxation.TaxationPackage +import familytree.FamilytreePackage import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace @@ -11,6 +12,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.impl.ModelResultImpl import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration @@ -18,12 +20,12 @@ import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DebugConfiguration import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace +import java.io.PrintWriter import java.math.BigDecimal import java.text.SimpleDateFormat import java.util.Date @@ -31,6 +33,7 @@ import java.util.HashMap import java.util.List import java.util.Map import java.util.TreeSet +import org.eclipse.emf.common.util.EList import org.eclipse.emf.ecore.EAttribute import org.eclipse.emf.ecore.EClass import org.eclipse.emf.ecore.EEnum @@ -43,118 +46,216 @@ import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup import org.eclipse.viatra.query.runtime.api.IQueryGroup import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine +import queries.Case_study_A +import queries.FamilyTreeConstraints class GeneratePledgeModels { - def static void main(String[] args) { - val x = (new EMFPatternLanguageStandaloneSetup).createInjectorAndDoEMFRegistration -// //PatternLanguageWithRSSetup.createInjectorAndDoEMFRegistration -// ApplicationConfigurationStandaloneSetup.doSetup - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl) - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("logicproblem", new XMIResourceFactoryImpl) - Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("partialmodel", new XMIResourceFactoryImpl) - ReteEngine.getClass - - val Ecore2Logic ecore2Logic = new Ecore2Logic - val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic) - val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic) - val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic - - // Workspace setup - val Date date = new Date(System.currentTimeMillis) - val SimpleDateFormat format = new SimpleDateFormat("dd-HHmm"); - val formattedDate = format.format(date) - - val inputs = new FileSystemWorkspace('''inputs/''', "") - val workspace = new FileSystemWorkspace('''output/''' + formattedDate + '''/''', "") - val debug = new FileSystemWorkspace('''output/''' + formattedDate + '''/debug/''', "") - workspace.initAndClear - - println("Input and output workspaces are created") - -// print(TaxationPackage.eINSTANCE.getEClassifiers.filter(EClass).toList.get(0)) - //* - val metamodel = loadMetamodel(TaxationPackage.eINSTANCE) - val partialModel = loadPartialModel(inputs, "Household.xmi") - // val queries = loadQueries(metamodel, Case_study_A.instance) - /*/ - val metamodel = loadMetamodel(FamilytreePackage.eINSTANCE) -// val partialModel = loadPartialModel(inputs, "yakindu/Yakindu.xmi") - val queries = loadQueries(metamodel, FamilyTreeConstraints.instance) - // */ - println("DSL loaded") - - val SIZE = 2 - var REPS = 1 - val RUNTIME = 600 - - // ///////////////////////// - // Prepare Problem - val modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, new Ecore2LogicConfiguration()) - var problem = modelGenerationProblem.output - -// val modelExtensionProblem = instanceModel2Logic.transform(modelGenerationProblem, partialModel) -// problem = modelExtensionProblem.output -// val validModelExtensionProblem = viatra2Logic.transformQueries(queries, modelGenerationProblem, -// new Viatra2LogicConfiguration) -// problem = validModelExtensionProblem.output - debug.writeModel(problem, "problem.logicproblem") - println("Problem created") - // End Prepare Problem - // ///////////////////////// +static val SIZE_LB = 20 +static val SIZE_UB = 20 +static val SIZE_MUL = 1 +static val SIZE_INC = 5 + +static var REPS = 1 +static val RUNTIME = 600 + +static val DOMAIN = "FamilyTree" // "FamilyTree", "Taxation" +static val QUERIES = false +static val INDIV_WRT = true +static val GLOBAL_WRT = true +static val q2t = if(QUERIES) "Y" else "N" + +def static void main(String[] args) { + (new EMFPatternLanguageStandaloneSetup).createInjectorAndDoEMFRegistration + Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl) + Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("logicproblem", new XMIResourceFactoryImpl) + Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("partialmodel", new XMIResourceFactoryImpl) + ReteEngine.getClass + val Ecore2Logic ecore2Logic = new Ecore2Logic + val Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic) + val Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic) + val InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic + + // Workspace setup + val Date date = new Date(System.currentTimeMillis) + val SimpleDateFormat format = new SimpleDateFormat("dd-HHmm"); + val formattedDate = format.format(date) + + val inputs = new FileSystemWorkspace('''inputs/''', "") + val dataws = new FileSystemWorkspace('''output/''', "") + val modelsws = new FileSystemWorkspace('''output/''' + formattedDate + '''/models/''', "") + val workspace = new FileSystemWorkspace('''output/''' + formattedDate + '''/''', "") + val debug = new FileSystemWorkspace('''output/''' + DOMAIN + "-" + formattedDate + '''/debug/''', "") + workspace.initAndClear + modelsws.initAndClear + + println("Input and output workspaces are created") + + // ////////////////////////// + // DOMAIN + var EcoreMetamodelDescriptor metamodel = null + var EList partialModel = null + var ViatraQuerySetDescriptor queries = null + switch DOMAIN { + case "Taxation": { + metamodel = loadMetamodel(TaxationPackage.eINSTANCE) + partialModel = loadPartialModel(inputs, "Household.xmi") + queries = loadQueries(metamodel, Case_study_A.instance) + } + case "FamilyTree": { + metamodel = loadMetamodel(FamilytreePackage.eINSTANCE) + partialModel = loadPartialModel(inputs, "FamilyTree.xmi") + queries = loadQueries(metamodel, FamilyTreeConstraints.instance) + } + default: { + System.err.println("Unsupported Domain") + throw new Exception + } + } + println("DSL loaded") + + // ///////////////////////// + // Prepare Problem + val modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, new Ecore2LogicConfiguration()) + var problem = modelGenerationProblem.output + val modelExtensionProblem = instanceModel2Logic.transform(modelGenerationProblem, partialModel) + problem = modelExtensionProblem.output + if (QUERIES) { + val validModelExtensionProblem = viatra2Logic.transformQueries(queries, modelExtensionProblem, + new Viatra2LogicConfiguration) + problem = validModelExtensionProblem.output + } + // debug.writeModel(problem, "problem.logicproblem") + println("Problem created") + // ///////////////////////// + // BEGIN RUN + var PrintWriter global_writer = null + val header = "domain, queries?,size,model?,timeout,measuredTime,TransformatonTime,SolverTime\n" + if (GLOBAL_WRT) { + global_writer = new PrintWriter( + workspace.workspaceURI + "//_" + DOMAIN + SIZE_LB + "to" + SIZE_UB + "x" + REPS + "q" + q2t + "-" + + formattedDate + ".csv") + global_writer.append(header) + } + + var NEXT_INC = SIZE_INC + for (var size = SIZE_LB; size <= SIZE_UB; size += NEXT_INC) { + NEXT_INC *= SIZE_MUL + + var PrintWriter indiv_writer = null + if (INDIV_WRT) { + indiv_writer = new PrintWriter( // TODO + workspace.workspaceURI + "//__" + DOMAIN + "Sz" + size + "x" + REPS + "q" + q2t + "-" + formattedDate + + ".csv") + indiv_writer.append(header) + } + + println() + println("DOMAIN: " + DOMAIN + ", SIZE=" + size) + for (var i = 0; i < REPS; i++) { - var ViatraReasoner reasoner = new ViatraReasoner + print("<> : ") + + var ViatraReasoner reasoner = new ViatraReasoner - // ///////////////////////////////////////////////////// - // Define Config File - val knownIntegers = new TreeSet - knownIntegers.addAll(0) + // ///////////////////////////////////////////////////// + // Define Config File + val knownIntegers = new TreeSet + knownIntegers.addAll(0, 10, 20, 30, 40, 50) - val knownReals = new TreeSet - knownReals.addAll(new BigDecimal("0.0")) + val knownReals = new TreeSet + knownReals.addAll(new BigDecimal("0.0")) - val knownStrings = new TreeSet - knownStrings.addAll("r0", "r1", "r2") + val knownStrings = new TreeSet + knownStrings.addAll("r0", "r1", "r2", "r3", "r4", "r5", "r6") - val solverConfig = new ViatraReasonerConfiguration => [ - it.documentationLevel = DocumentationLevel::FULL - it.debugCongiguration = new DebugConfiguration => [logging = true] - it.runtimeLimit = RUNTIME -// it.typeScopes.maxNewElements = SIZE -// it.typeScopes.minNewElements = 3 - if(!knownIntegers.isEmpty) it.typeScopes.knownIntegers = knownIntegers - if(!knownReals.isEmpty) it.typeScopes.knownReals = knownReals -// if(!knownStrings.isEmpty) it.typeScopes.knownStrings = knownStrings - ] + val curSize = size + val solverConfig = new ViatraReasonerConfiguration => [ + it.documentationLevel = DocumentationLevel::NONE +// it.debugCongiguration = new DebugConfiguration => [logging = true] + it.runtimeLimit = RUNTIME + // it.typeScopes.maxNewElements = SIZE + it.typeScopes.minNewElements = curSize - println("Run #" + i + ":") - val startTime = System.currentTimeMillis - var solution = reasoner.solve(problem, solverConfig, debug) - val totalTime = System.currentTimeMillis - startTime +// if(!knownIntegers.isEmpty) it.typeScopes.knownIntegers = knownIntegers + if(!knownReals.isEmpty) it.typeScopes.knownReals = knownReals + // if(!knownStrings.isEmpty) it.typeScopes.knownStrings = knownStrings + ] - println(" Problem Solved") - solution.writeStats(totalTime, solverConfig) + val startTime = System.currentTimeMillis + var solution = reasoner.solve(problem, solverConfig, debug) + val measuredTime = System.currentTimeMillis - startTime + print("<" + measuredTime / 1000.0 + "s") + +// solution.writeStats(totalTime, solverConfig) + try { if (solution instanceof ModelResult) { - solution.writeRepresentation(workspace, i) - solution.writeInterpretation(logic2Ecore, workspace, i, reasoner, modelGenerationProblem) - println(" Solution saved and visualised") - } else - println(" Returned: " + solution.class.simpleName.toString) - -// println("Stats Created") - // Run Garbage Collector - val Runtime r = Runtime.getRuntime(); - r.gc(); - r.gc(); - r.gc(); - Thread.sleep(3000) + solution.writeInterpretation(logic2Ecore, modelsws, size + "_" + i, reasoner, modelGenerationProblem) + println(" (XMI Success)") + } + } catch (Exception e) { + System.err.println(" (XMI Error)" + e.message) + } + + try { + if (solution instanceof ModelResult) { + solution.writeRepresentation(modelsws, size + "_" + i) + println(" (VIZ Success) >>") + } + } catch (Exception e) { + System.err.println(" (VIZ Error)" + e.message + ">>") } - println("---End---") + println() + // Run Garbage Collector + val Runtime r = Runtime.getRuntime(); + r.gc(); + r.gc(); + r.gc(); + Thread.sleep(3000) } + if(INDIV_WRT) indiv_writer.close +} +if(GLOBAL_WRT) global_writer.close + } + + def - def static Map getTypeMap(Map classMap, EcoreMetamodelDescriptor metamodel, +static Map getTypeMap(Map classMap, EcoreMetamodelDescriptor metamodel, Ecore2Logic e2l, Ecore2Logic_Trace trace) { val typeMap = new HashMap val listMap = metamodel.classes.toMap[s|s.name] @@ -168,7 +269,9 @@ class GeneratePledgeModels { return typeMap } - def static loadMetamodel(EPackage pckg) { + def + +static loadMetamodel(EPackage pckg) { val List classes = pckg.getEClassifiers.filter(EClass).toList val List enums = pckg.getEClassifiers.filter(EEnum).toList val List literals = enums.map[getELiterals].flatten.toList @@ -177,13 +280,17 @@ class GeneratePledgeModels { return new EcoreMetamodelDescriptor(classes, #{}, false, enums, literals, references, attributes) } - def static loadPartialModel(ReasonerWorkspace inputs, String path) { + def + +static loadPartialModel(ReasonerWorkspace inputs, String path) { Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl()) inputs.readModel(EObject, path).eResource.contents // inputs.readModel(EObject,"FamInstance.xmi").eResource.allContents.toList } - def static loadQueries(EcoreMetamodelDescriptor metamodel, IQueryGroup i) { + def + +static loadQueries(EcoreMetamodelDescriptor metamodel, IQueryGroup i) { val patterns = i.specifications.toList val wfPatterns = patterns.filter[it.allAnnotations.exists[it.name == "Constraint"]].toSet val derivedFeatures = emptyMap @@ -199,37 +306,45 @@ class GeneratePledgeModels { return res } - def static writeInterpretation(LogicResult solution, Logic2Ecore logic2Ecore, ReasonerWorkspace workspace, int i, - ViatraReasoner reasoner, TracedOutput mgProb) { + def + +static writeInterpretation(LogicResult solution, Logic2Ecore logic2Ecore, ReasonerWorkspace workspace, + String id, ViatraReasoner reasoner, TracedOutput mgProb) { val interpretations = reasoner.getInterpretations(solution as ModelResult) for (interpIndex : 0 ..< interpretations.size) { // val extension b = new LogicStructureBuilder // val extension a = new LogicProblemBuilder val interpretation = interpretations.get(interpIndex) val model = logic2Ecore.transformInterpretation(interpretation, mgProb.trace) - workspace.writeModel(model, '''solution«i»_«interpIndex».xmi''') +// println(model) + workspace.writeModel(model, '''sol-«id»_«interpIndex».xmi''') } } - def static writeRepresentation(LogicResult solution, ReasonerWorkspace workspace, int i) { + def + +static writeRepresentation(LogicResult solution, ReasonerWorkspace workspace, String id) { val representations = solution.representation for (representationIndex : 0 ..< representations.size) { val representation = representations.get(representationIndex) if (representation instanceof PartialInterpretation) { val gml = (new PartialInterpretation2Gml).transform(representation) - workspace.writeText('''solution«i»_«representationIndex».gml''', gml) + workspace.writeText('''sol-«id»_«representationIndex».gml''', gml) val png = (new GraphvizVisualiser).visualiseConcretization(representation) - png.writeToFile(workspace, '''solution«i»_«representationIndex».png''') +// println(png) + png.writeToFile(workspace, '''sol-«id»_«representationIndex».png''') // workspace.writeModel(representation, '''solution«representationIndex».partialintrpretation''') } else { - workspace.writeText('''solution«representationIndex».txt''', representation.toString) + workspace.writeText('''sol-«representationIndex».txt''', representation.toString) } } } - def static writeStats(LogicResult solution, long time, ViatraReasonerConfiguration config) { + def + +static writeStats(LogicResult solution, long time, ViatraReasonerConfiguration config) { val stats = solution.statistics println(" Statistics:") // for (e : stats.entries.filter[name.substring(0, 9) == "_Solution"]) { diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.GeneratePledgeModels.xtendbin b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.GeneratePledgeModels.xtendbin index 163f84a1..c5572067 100644 Binary files a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.GeneratePledgeModels.xtendbin and b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.GeneratePledgeModels.xtendbin differ diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.gitignore b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.gitignore index f3c882e4..a93ae854 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.gitignore +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/.gitignore @@ -6,3 +6,4 @@ /.GeneratePledgeModels.java._trace /.GeneratePledgeModels.xtendbin /GeneratePledgeModels.java +/.UML2TGF.java._trace diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/GeneratePledgeModels.java b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/GeneratePledgeModels.java index 2809679d..84232a13 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/GeneratePledgeModels.java +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/xtend-gen/run/GeneratePledgeModels.java @@ -1,314 +1,498 @@ -package run; - -import Taxation.TaxationPackage; -import com.google.common.base.Objects; -import com.google.common.collect.Iterables; -import com.google.inject.Injector; -import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic; -import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration; -import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace; -import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor; -import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; -import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicModelInterpretation; -import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput; -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type; -import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem; -import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult; -import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult; -import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.Statistics; -import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore; -import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic; -import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor; -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic; -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation; -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml; -import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretationVisualisation; -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.DebugConfiguration; -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner; -import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration; -import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser; -import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace; -import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace; -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import org.eclipse.emf.common.util.EList; -import org.eclipse.emf.ecore.EAttribute; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EEnum; -import org.eclipse.emf.ecore.EEnumLiteral; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.EReference; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; -import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup; -import org.eclipse.viatra.query.runtime.api.IQueryGroup; -import org.eclipse.viatra.query.runtime.api.IQuerySpecification; -import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; -import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine; -import org.eclipse.xtend2.lib.StringConcatenation; -import org.eclipse.xtext.xbase.lib.CollectionExtensions; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.ExclusiveRange; -import org.eclipse.xtext.xbase.lib.Functions.Function1; -import org.eclipse.xtext.xbase.lib.InputOutput; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.eclipse.xtext.xbase.lib.ListExtensions; -import org.eclipse.xtext.xbase.lib.ObjectExtensions; -import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; - -@SuppressWarnings("all") -public class GeneratePledgeModels { - public static void main(final String[] args) { - try { - final Injector x = new EMFPatternLanguageStandaloneSetup().createInjectorAndDoEMFRegistration(); - Map _extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); - XMIResourceFactoryImpl _xMIResourceFactoryImpl = new XMIResourceFactoryImpl(); - _extensionToFactoryMap.put("xmi", _xMIResourceFactoryImpl); - Map _extensionToFactoryMap_1 = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); - XMIResourceFactoryImpl _xMIResourceFactoryImpl_1 = new XMIResourceFactoryImpl(); - _extensionToFactoryMap_1.put("logicproblem", _xMIResourceFactoryImpl_1); - Map _extensionToFactoryMap_2 = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); - XMIResourceFactoryImpl _xMIResourceFactoryImpl_2 = new XMIResourceFactoryImpl(); - _extensionToFactoryMap_2.put("partialmodel", _xMIResourceFactoryImpl_2); - ReteEngine.class.getClass(); - final Ecore2Logic ecore2Logic = new Ecore2Logic(); - final Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic); - final Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic); - final InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic(); - long _currentTimeMillis = System.currentTimeMillis(); - final Date date = new Date(_currentTimeMillis); - final SimpleDateFormat format = new SimpleDateFormat("dd-HHmm"); - final String formattedDate = format.format(date); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("inputs/"); - final FileSystemWorkspace inputs = new FileSystemWorkspace(_builder.toString(), ""); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("output/"); - String _plus = (_builder_1.toString() + formattedDate); - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("/"); - String _plus_1 = (_plus + _builder_2); - final FileSystemWorkspace workspace = new FileSystemWorkspace(_plus_1, ""); - StringConcatenation _builder_3 = new StringConcatenation(); - _builder_3.append("output/"); - String _plus_2 = (_builder_3.toString() + formattedDate); - StringConcatenation _builder_4 = new StringConcatenation(); - _builder_4.append("/debug/"); - String _plus_3 = (_plus_2 + _builder_4); - final FileSystemWorkspace debug = new FileSystemWorkspace(_plus_3, ""); - workspace.initAndClear(); - InputOutput.println("Input and output workspaces are created"); - final EcoreMetamodelDescriptor metamodel = GeneratePledgeModels.loadMetamodel(TaxationPackage.eINSTANCE); - final EList partialModel = GeneratePledgeModels.loadPartialModel(inputs, "Household.xmi"); - InputOutput.println("DSL loaded"); - final int SIZE = 2; - int REPS = 1; - final int RUNTIME = 600; - Ecore2LogicConfiguration _ecore2LogicConfiguration = new Ecore2LogicConfiguration(); - final TracedOutput modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, _ecore2LogicConfiguration); - LogicProblem problem = modelGenerationProblem.getOutput(); - debug.writeModel(problem, "problem.logicproblem"); - InputOutput.println("Problem created"); - for (int i = 0; (i < REPS); i++) { - { - ViatraReasoner reasoner = new ViatraReasoner(); - final TreeSet knownIntegers = new TreeSet(); - CollectionExtensions.addAll(knownIntegers, Integer.valueOf(0)); - final TreeSet knownReals = new TreeSet(); - BigDecimal _bigDecimal = new BigDecimal("0.0"); - CollectionExtensions.addAll(knownReals, _bigDecimal); - final TreeSet knownStrings = new TreeSet(); - CollectionExtensions.addAll(knownStrings, "r0", "r1", "r2"); - ViatraReasonerConfiguration _viatraReasonerConfiguration = new ViatraReasonerConfiguration(); - final Procedure1 _function = (ViatraReasonerConfiguration it) -> { - it.documentationLevel = DocumentationLevel.FULL; - DebugConfiguration _debugConfiguration = new DebugConfiguration(); - final Procedure1 _function_1 = (DebugConfiguration it_1) -> { - it_1.logging = true; - }; - DebugConfiguration _doubleArrow = ObjectExtensions.operator_doubleArrow(_debugConfiguration, _function_1); - it.debugCongiguration = _doubleArrow; - it.runtimeLimit = RUNTIME; - boolean _isEmpty = knownIntegers.isEmpty(); - boolean _not = (!_isEmpty); - if (_not) { - it.typeScopes.knownIntegers = knownIntegers; - } - boolean _isEmpty_1 = knownReals.isEmpty(); - boolean _not_1 = (!_isEmpty_1); - if (_not_1) { - it.typeScopes.knownReals = knownReals; - } - }; - final ViatraReasonerConfiguration solverConfig = ObjectExtensions.operator_doubleArrow(_viatraReasonerConfiguration, _function); - InputOutput.println((("Run #" + Integer.valueOf(i)) + ":")); - final long startTime = System.currentTimeMillis(); - LogicResult solution = reasoner.solve(problem, solverConfig, debug); - long _currentTimeMillis_1 = System.currentTimeMillis(); - final long totalTime = (_currentTimeMillis_1 - startTime); - InputOutput.println(" Problem Solved"); - GeneratePledgeModels.writeStats(solution, totalTime, solverConfig); - if ((solution instanceof ModelResult)) { - GeneratePledgeModels.writeRepresentation(solution, workspace, i); - GeneratePledgeModels.writeInterpretation(solution, logic2Ecore, workspace, i, reasoner, modelGenerationProblem); - InputOutput.println(" Solution saved and visualised"); - } else { - String _string = solution.getClass().getSimpleName().toString(); - String _plus_4 = (" Returned: " + _string); - InputOutput.println(_plus_4); - } - final Runtime r = Runtime.getRuntime(); - r.gc(); - r.gc(); - r.gc(); - Thread.sleep(3000); - } - } - InputOutput.println("---End---"); - } catch (Throwable _e) { - throw Exceptions.sneakyThrow(_e); - } - } - - public static Map getTypeMap(final Map classMap, final EcoreMetamodelDescriptor metamodel, final Ecore2Logic e2l, final Ecore2Logic_Trace trace) { - final HashMap typeMap = new HashMap(); - final Function1 _function = (EClass s) -> { - return s.getName(); - }; - final Map listMap = IterableExtensions.toMap(metamodel.getClasses(), _function); - Set _keySet = classMap.keySet(); - for (final Class elem : _keySet) { - typeMap.put( - e2l.TypeofEClass(trace, - listMap.get(elem.getSimpleName())), classMap.get(elem)); - } - return typeMap; - } - - public static EcoreMetamodelDescriptor loadMetamodel(final EPackage pckg) { - final List classes = IterableExtensions.toList(Iterables.filter(pckg.getEClassifiers(), EClass.class)); - final List enums = IterableExtensions.toList(Iterables.filter(pckg.getEClassifiers(), EEnum.class)); - final Function1> _function = (EEnum it) -> { - return it.getELiterals(); - }; - final List literals = IterableExtensions.toList(Iterables.concat(ListExtensions.>map(enums, _function))); - final Function1> _function_1 = (EClass it) -> { - return it.getEReferences(); - }; - final List references = IterableExtensions.toList(Iterables.concat(ListExtensions.>map(classes, _function_1))); - final Function1> _function_2 = (EClass it) -> { - return it.getEAttributes(); - }; - final List attributes = IterableExtensions.toList(Iterables.concat(ListExtensions.>map(classes, _function_2))); - return new EcoreMetamodelDescriptor(classes, Collections.unmodifiableSet(CollectionLiterals.newHashSet()), false, enums, literals, references, attributes); - } - - public static EList loadPartialModel(final ReasonerWorkspace inputs, final String path) { - EList _xblockexpression = null; - { - Map _extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); - XMIResourceFactoryImpl _xMIResourceFactoryImpl = new XMIResourceFactoryImpl(); - _extensionToFactoryMap.put("*", _xMIResourceFactoryImpl); - _xblockexpression = inputs.readModel(EObject.class, path).eResource().getContents(); - } - return _xblockexpression; - } - - public static ViatraQuerySetDescriptor loadQueries(final EcoreMetamodelDescriptor metamodel, final IQueryGroup i) { - final List> patterns = IterableExtensions.>toList(i.getSpecifications()); - final Function1, Boolean> _function = (IQuerySpecification it) -> { - final Function1 _function_1 = (PAnnotation it_1) -> { - String _name = it_1.getName(); - return Boolean.valueOf(Objects.equal(_name, "Constraint")); - }; - return Boolean.valueOf(IterableExtensions.exists(it.getAllAnnotations(), _function_1)); - }; - final Set> wfPatterns = IterableExtensions.>toSet(IterableExtensions.>filter(patterns, _function)); - final Map, EStructuralFeature> derivedFeatures = CollectionLiterals., EStructuralFeature>emptyMap(); - final ViatraQuerySetDescriptor res = new ViatraQuerySetDescriptor(patterns, wfPatterns, derivedFeatures); - return res; - } - - public static void writeInterpretation(final LogicResult solution, final Logic2Ecore logic2Ecore, final ReasonerWorkspace workspace, final int i, final ViatraReasoner reasoner, final TracedOutput mgProb) { - final List interpretations = reasoner.getInterpretations(((ModelResult) solution)); - int _size = interpretations.size(); - ExclusiveRange _doubleDotLessThan = new ExclusiveRange(0, _size, true); - for (final Integer interpIndex : _doubleDotLessThan) { - { - final LogicModelInterpretation interpretation = interpretations.get((interpIndex).intValue()); - final EObject model = logic2Ecore.transformInterpretation(interpretation, mgProb.getTrace()); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("solution"); - _builder.append(i); - _builder.append("_"); - _builder.append(interpIndex); - _builder.append(".xmi"); - workspace.writeModel(model, _builder.toString()); - } - } - } - - public static void writeRepresentation(final LogicResult solution, final ReasonerWorkspace workspace, final int i) { - final EList representations = solution.getRepresentation(); - int _size = representations.size(); - ExclusiveRange _doubleDotLessThan = new ExclusiveRange(0, _size, true); - for (final Integer representationIndex : _doubleDotLessThan) { - { - final Object representation = representations.get((representationIndex).intValue()); - if ((representation instanceof PartialInterpretation)) { - final String gml = new PartialInterpretation2Gml().transform(((PartialInterpretation)representation)); - StringConcatenation _builder = new StringConcatenation(); - _builder.append("solution"); - _builder.append(i); - _builder.append("_"); - _builder.append(representationIndex); - _builder.append(".gml"); - workspace.writeText(_builder.toString(), gml); - final PartialInterpretationVisualisation png = new GraphvizVisualiser().visualiseConcretization(((PartialInterpretation)representation)); - StringConcatenation _builder_1 = new StringConcatenation(); - _builder_1.append("solution"); - _builder_1.append(i); - _builder_1.append("_"); - _builder_1.append(representationIndex); - _builder_1.append(".png"); - png.writeToFile(workspace, _builder_1.toString()); - } else { - StringConcatenation _builder_2 = new StringConcatenation(); - _builder_2.append("solution"); - _builder_2.append(representationIndex); - _builder_2.append(".txt"); - workspace.writeText(_builder_2.toString(), representation.toString()); - } - } - } - } - - public static String writeStats(final LogicResult solution, final long time, final ViatraReasonerConfiguration config) { - String _xblockexpression = null; - { - final Statistics stats = solution.getStatistics(); - InputOutput.println(" Statistics:"); - Object _xifexpression = null; - if ((config.typeScopes.maxNewElements == 2147483647)) { - _xifexpression = "*"; - } else { - _xifexpression = Integer.valueOf(config.typeScopes.maxNewElements); - } - String _plus = (((" #new nodes : [" + Integer.valueOf(config.typeScopes.minNewElements)) + "..") + _xifexpression); - String _plus_1 = (_plus + "]"); - InputOutput.println(_plus_1); - _xblockexpression = InputOutput.println(((" \"solve\" time: " + Double.valueOf((((double) time) / 1000))) + " s")); - } - return _xblockexpression; - } -} +package run; + +import Taxation.TaxationPackage; +import com.google.common.base.Objects; +import com.google.common.collect.Iterables; +import familytree.FamilytreePackage; +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic; +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration; +import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace; +import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor; +import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; +import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicModelInterpretation; +import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput; +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type; +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem; +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.LogicResult; +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult; +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.Statistics; +import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.impl.ModelResultImpl; +import hu.bme.mit.inf.dslreasoner.logic2ecore.Logic2Ecore; +import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic; +import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicConfiguration; +import hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2LogicTrace; +import hu.bme.mit.inf.dslreasoner.viatra2logic.ViatraQuerySetDescriptor; +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2Logic; +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation; +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretation2Gml; +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.visualisation.PartialInterpretationVisualisation; +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasoner; +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.ViatraReasonerConfiguration; +import hu.bme.mit.inf.dslreasoner.visualisation.pi2graphviz.GraphvizVisualiser; +import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace; +import hu.bme.mit.inf.dslreasoner.workspace.ReasonerWorkspace; +import java.io.PrintWriter; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EEnum; +import org.eclipse.emf.ecore.EEnumLiteral; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; +import org.eclipse.viatra.query.patternlanguage.emf.EMFPatternLanguageStandaloneSetup; +import org.eclipse.viatra.query.runtime.api.IQueryGroup; +import org.eclipse.viatra.query.runtime.api.IQuerySpecification; +import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; +import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine; +import org.eclipse.xtend2.lib.StringConcatenation; +import org.eclipse.xtext.xbase.lib.CollectionExtensions; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.ExclusiveRange; +import org.eclipse.xtext.xbase.lib.Functions.Function0; +import org.eclipse.xtext.xbase.lib.Functions.Function1; +import org.eclipse.xtext.xbase.lib.InputOutput; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.eclipse.xtext.xbase.lib.ListExtensions; +import org.eclipse.xtext.xbase.lib.ObjectExtensions; +import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; +import queries.Case_study_A; +import queries.FamilyTreeConstraints; + +@SuppressWarnings("all") +public class GeneratePledgeModels { + private static final int SIZE_LB = 20; + + private static final int SIZE_UB = 20; + + private static final int SIZE_MUL = 1; + + private static final int SIZE_INC = 5; + + private static int REPS = 1; + + private static final int RUNTIME = 600; + + private static final String DOMAIN = "FamilyTree"; + + private static final boolean QUERIES = false; + + private static final boolean INDIV_WRT = true; + + private static final boolean GLOBAL_WRT = true; + + private static final String q2t = new Function0() { + @Override + public String apply() { + String _xifexpression = null; + if (GeneratePledgeModels.QUERIES) { + _xifexpression = "Y"; + } else { + _xifexpression = "N"; + } + return _xifexpression; + } + }.apply(); + + public static void main(final String[] args) { + try { + new EMFPatternLanguageStandaloneSetup().createInjectorAndDoEMFRegistration(); + Map _extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); + XMIResourceFactoryImpl _xMIResourceFactoryImpl = new XMIResourceFactoryImpl(); + _extensionToFactoryMap.put("xmi", _xMIResourceFactoryImpl); + Map _extensionToFactoryMap_1 = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); + XMIResourceFactoryImpl _xMIResourceFactoryImpl_1 = new XMIResourceFactoryImpl(); + _extensionToFactoryMap_1.put("logicproblem", _xMIResourceFactoryImpl_1); + Map _extensionToFactoryMap_2 = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); + XMIResourceFactoryImpl _xMIResourceFactoryImpl_2 = new XMIResourceFactoryImpl(); + _extensionToFactoryMap_2.put("partialmodel", _xMIResourceFactoryImpl_2); + ReteEngine.class.getClass(); + final Ecore2Logic ecore2Logic = new Ecore2Logic(); + final Logic2Ecore logic2Ecore = new Logic2Ecore(ecore2Logic); + final Viatra2Logic viatra2Logic = new Viatra2Logic(ecore2Logic); + final InstanceModel2Logic instanceModel2Logic = new InstanceModel2Logic(); + long _currentTimeMillis = System.currentTimeMillis(); + final Date date = new Date(_currentTimeMillis); + final SimpleDateFormat format = new SimpleDateFormat("dd-HHmm"); + final String formattedDate = format.format(date); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("inputs/"); + final FileSystemWorkspace inputs = new FileSystemWorkspace(_builder.toString(), ""); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("output/"); + final FileSystemWorkspace dataws = new FileSystemWorkspace(_builder_1.toString(), ""); + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("output/"); + String _plus = (_builder_2.toString() + formattedDate); + StringConcatenation _builder_3 = new StringConcatenation(); + _builder_3.append("/models/"); + String _plus_1 = (_plus + _builder_3); + final FileSystemWorkspace modelsws = new FileSystemWorkspace(_plus_1, ""); + StringConcatenation _builder_4 = new StringConcatenation(); + _builder_4.append("output/"); + String _plus_2 = (_builder_4.toString() + formattedDate); + StringConcatenation _builder_5 = new StringConcatenation(); + _builder_5.append("/"); + String _plus_3 = (_plus_2 + _builder_5); + final FileSystemWorkspace workspace = new FileSystemWorkspace(_plus_3, ""); + StringConcatenation _builder_6 = new StringConcatenation(); + _builder_6.append("output/"); + String _plus_4 = (_builder_6.toString() + GeneratePledgeModels.DOMAIN); + String _plus_5 = (_plus_4 + "-"); + String _plus_6 = (_plus_5 + formattedDate); + StringConcatenation _builder_7 = new StringConcatenation(); + _builder_7.append("/debug/"); + String _plus_7 = (_plus_6 + _builder_7); + final FileSystemWorkspace debug = new FileSystemWorkspace(_plus_7, ""); + workspace.initAndClear(); + modelsws.initAndClear(); + InputOutput.println("Input and output workspaces are created"); + EcoreMetamodelDescriptor metamodel = null; + EList partialModel = null; + ViatraQuerySetDescriptor queries = null; + final String DOMAIN = GeneratePledgeModels.DOMAIN; + if (DOMAIN != null) { + switch (DOMAIN) { + case "Taxation": + metamodel = GeneratePledgeModels.loadMetamodel(TaxationPackage.eINSTANCE); + partialModel = GeneratePledgeModels.loadPartialModel(inputs, "Household.xmi"); + queries = GeneratePledgeModels.loadQueries(metamodel, Case_study_A.instance()); + break; + case "FamilyTree": + metamodel = GeneratePledgeModels.loadMetamodel(FamilytreePackage.eINSTANCE); + partialModel = GeneratePledgeModels.loadPartialModel(inputs, "FamilyTree.xmi"); + queries = GeneratePledgeModels.loadQueries(metamodel, FamilyTreeConstraints.instance()); + break; + default: + { + System.err.println("Unsupported Domain"); + throw new Exception(); + } + } + } else { + { + System.err.println("Unsupported Domain"); + throw new Exception(); + } + } + InputOutput.println("DSL loaded"); + Ecore2LogicConfiguration _ecore2LogicConfiguration = new Ecore2LogicConfiguration(); + final TracedOutput modelGenerationProblem = ecore2Logic.transformMetamodel(metamodel, _ecore2LogicConfiguration); + LogicProblem problem = modelGenerationProblem.getOutput(); + final TracedOutput modelExtensionProblem = instanceModel2Logic.transform(modelGenerationProblem, partialModel); + problem = modelExtensionProblem.getOutput(); + if (GeneratePledgeModels.QUERIES) { + Viatra2LogicConfiguration _viatra2LogicConfiguration = new Viatra2LogicConfiguration(); + final TracedOutput validModelExtensionProblem = viatra2Logic.transformQueries(queries, modelExtensionProblem, _viatra2LogicConfiguration); + problem = validModelExtensionProblem.getOutput(); + } + InputOutput.println("Problem created"); + PrintWriter global_writer = null; + final String header = "domain, queries?,size,model?,timeout,measuredTime,TransformatonTime,SolverTime\n"; + if (GeneratePledgeModels.GLOBAL_WRT) { + URI _workspaceURI = workspace.getWorkspaceURI(); + String _plus_8 = (_workspaceURI + "//_"); + String _plus_9 = (_plus_8 + GeneratePledgeModels.DOMAIN); + String _plus_10 = (_plus_9 + Integer.valueOf(GeneratePledgeModels.SIZE_LB)); + String _plus_11 = (_plus_10 + "to"); + String _plus_12 = (_plus_11 + Integer.valueOf(GeneratePledgeModels.SIZE_UB)); + String _plus_13 = (_plus_12 + "x"); + String _plus_14 = (_plus_13 + Integer.valueOf(GeneratePledgeModels.REPS)); + String _plus_15 = (_plus_14 + "q"); + String _plus_16 = (_plus_15 + GeneratePledgeModels.q2t); + String _plus_17 = (_plus_16 + "-"); + String _plus_18 = (_plus_17 + formattedDate); + String _plus_19 = (_plus_18 + ".csv"); + PrintWriter _printWriter = new PrintWriter(_plus_19); + global_writer = _printWriter; + global_writer.append(header); + } + int NEXT_INC = GeneratePledgeModels.SIZE_INC; + { + int size = GeneratePledgeModels.SIZE_LB; + boolean _while = (size <= GeneratePledgeModels.SIZE_UB); + while (_while) { + { + int _NEXT_INC = NEXT_INC; + NEXT_INC = (_NEXT_INC * GeneratePledgeModels.SIZE_MUL); + PrintWriter indiv_writer = null; + if (GeneratePledgeModels.INDIV_WRT) { + URI _workspaceURI_1 = workspace.getWorkspaceURI(); + String _plus_20 = (_workspaceURI_1 + "//__"); + String _plus_21 = (_plus_20 + GeneratePledgeModels.DOMAIN); + String _plus_22 = (_plus_21 + "Sz"); + String _plus_23 = (_plus_22 + Integer.valueOf(size)); + String _plus_24 = (_plus_23 + "x"); + String _plus_25 = (_plus_24 + Integer.valueOf(GeneratePledgeModels.REPS)); + String _plus_26 = (_plus_25 + "q"); + String _plus_27 = (_plus_26 + GeneratePledgeModels.q2t); + String _plus_28 = (_plus_27 + "-"); + String _plus_29 = (_plus_28 + formattedDate); + String _plus_30 = (_plus_29 + + ".csv"); + PrintWriter _printWriter_1 = new PrintWriter(_plus_30); + indiv_writer = _printWriter_1; + indiv_writer.append(header); + } + InputOutput.println(); + InputOutput.println(((("DOMAIN: " + GeneratePledgeModels.DOMAIN) + ", SIZE=") + Integer.valueOf(size))); + for (int i = 0; (i < GeneratePledgeModels.REPS); i++) { + { + InputOutput.print((("<> : ")); + ViatraReasoner reasoner = new ViatraReasoner(); + final TreeSet knownIntegers = new TreeSet(); + CollectionExtensions.addAll(knownIntegers, Integer.valueOf(0), Integer.valueOf(10), Integer.valueOf(20), Integer.valueOf(30), Integer.valueOf(40), Integer.valueOf(50)); + final TreeSet knownReals = new TreeSet(); + BigDecimal _bigDecimal = new BigDecimal("0.0"); + CollectionExtensions.addAll(knownReals, _bigDecimal); + final TreeSet knownStrings = new TreeSet(); + CollectionExtensions.addAll(knownStrings, "r0", "r1", "r2", "r3", "r4", "r5", "r6"); + final int curSize = size; + ViatraReasonerConfiguration _viatraReasonerConfiguration = new ViatraReasonerConfiguration(); + final Procedure1 _function = (ViatraReasonerConfiguration it) -> { + it.documentationLevel = DocumentationLevel.NONE; + it.runtimeLimit = GeneratePledgeModels.RUNTIME; + it.typeScopes.minNewElements = curSize; + boolean _isEmpty = knownReals.isEmpty(); + boolean _not = (!_isEmpty); + if (_not) { + it.typeScopes.knownReals = knownReals; + } + }; + final ViatraReasonerConfiguration solverConfig = ObjectExtensions.operator_doubleArrow(_viatraReasonerConfiguration, _function); + final long startTime = System.currentTimeMillis(); + LogicResult solution = reasoner.solve(problem, solverConfig, debug); + long _currentTimeMillis_1 = System.currentTimeMillis(); + final long measuredTime = (_currentTimeMillis_1 - startTime); + InputOutput.print("< _class = solution.getClass(); + String _string = Boolean.valueOf(Objects.equal(_class, ModelResultImpl.class)).toString(); + String _plus_31 = ((((((GeneratePledgeModels.DOMAIN + ",") + Boolean.valueOf(GeneratePledgeModels.QUERIES)) + ",") + Integer.valueOf(size)) + ",") + _string); + String _plus_32 = (_plus_31 + + ","); + String _plus_33 = (_plus_32 + Integer.valueOf(GeneratePledgeModels.RUNTIME)); + String _plus_34 = (_plus_33 + ","); + String _plus_35 = (_plus_34 + Double.valueOf((measuredTime / 1000.0))); + String _plus_36 = (_plus_35 + ","); + int _transformationTime = solution.getStatistics().getTransformationTime(); + double _divide = (_transformationTime / 1000.0); + String _plus_37 = (_plus_36 + Double.valueOf(_divide)); + String _plus_38 = (_plus_37 + + ","); + int _solverTime = solution.getStatistics().getSolverTime(); + double _divide_1 = (_solverTime / 1000.0); + String _plus_39 = (_plus_38 + Double.valueOf(_divide_1)); + final String toAddtoCSV = (_plus_39 + "\n"); + if (GeneratePledgeModels.GLOBAL_WRT) { + global_writer.append(toAddtoCSV); + } + if (GeneratePledgeModels.INDIV_WRT) { + indiv_writer.append(toAddtoCSV); + } + InputOutput.println((("->" + Double.valueOf((measuredTime / 1000.0))) + "s")); + try { + if ((solution instanceof ModelResult)) { + String _plus_40 = (Integer.valueOf(size) + "_"); + String _plus_41 = (_plus_40 + Integer.valueOf(i)); + GeneratePledgeModels.writeInterpretation(solution, logic2Ecore, modelsws, _plus_41, reasoner, modelGenerationProblem); + InputOutput.println(" (XMI Success)"); + } + } catch (final Throwable _t) { + if (_t instanceof Exception) { + final Exception e = (Exception)_t; + String _message = e.getMessage(); + String _plus_42 = (" (XMI Error)" + _message); + System.err.println(_plus_42); + } else { + throw Exceptions.sneakyThrow(_t); + } + } + try { + if ((solution instanceof ModelResult)) { + String _plus_40 = (Integer.valueOf(size) + "_"); + String _plus_41 = (_plus_40 + Integer.valueOf(i)); + GeneratePledgeModels.writeRepresentation(solution, modelsws, _plus_41); + InputOutput.println(" (VIZ Success) >>"); + } + } catch (final Throwable _t) { + if (_t instanceof Exception) { + final Exception e = (Exception)_t; + String _message = e.getMessage(); + String _plus_42 = (" (VIZ Error)" + _message); + String _plus_43 = (_plus_42 + ">>"); + System.err.println(_plus_43); + } else { + throw Exceptions.sneakyThrow(_t); + } + } + InputOutput.println(); + final Runtime r = Runtime.getRuntime(); + r.gc(); + r.gc(); + r.gc(); + Thread.sleep(3000); + } + } + if (GeneratePledgeModels.INDIV_WRT) { + indiv_writer.close(); + } + } + int _size = size; + size = (_size + NEXT_INC); + _while = (size <= GeneratePledgeModels.SIZE_UB); + } + } + if (GeneratePledgeModels.GLOBAL_WRT) { + global_writer.close(); + } + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + public static Map getTypeMap(final Map classMap, final EcoreMetamodelDescriptor metamodel, final Ecore2Logic e2l, final Ecore2Logic_Trace trace) { + final HashMap typeMap = new HashMap(); + final Function1 _function = (EClass s) -> { + return s.getName(); + }; + final Map listMap = IterableExtensions.toMap(metamodel.getClasses(), _function); + Set _keySet = classMap.keySet(); + for (final Class elem : _keySet) { + typeMap.put( + e2l.TypeofEClass(trace, + listMap.get(elem.getSimpleName())), classMap.get(elem)); + } + return typeMap; + } + + public static EcoreMetamodelDescriptor loadMetamodel(final EPackage pckg) { + final List classes = IterableExtensions.toList(Iterables.filter(pckg.getEClassifiers(), EClass.class)); + final List enums = IterableExtensions.toList(Iterables.filter(pckg.getEClassifiers(), EEnum.class)); + final Function1> _function = (EEnum it) -> { + return it.getELiterals(); + }; + final List literals = IterableExtensions.toList(Iterables.concat(ListExtensions.>map(enums, _function))); + final Function1> _function_1 = (EClass it) -> { + return it.getEReferences(); + }; + final List references = IterableExtensions.toList(Iterables.concat(ListExtensions.>map(classes, _function_1))); + final Function1> _function_2 = (EClass it) -> { + return it.getEAttributes(); + }; + final List attributes = IterableExtensions.toList(Iterables.concat(ListExtensions.>map(classes, _function_2))); + return new EcoreMetamodelDescriptor(classes, Collections.unmodifiableSet(CollectionLiterals.newHashSet()), false, enums, literals, references, attributes); + } + + public static EList loadPartialModel(final ReasonerWorkspace inputs, final String path) { + EList _xblockexpression = null; + { + Map _extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap(); + XMIResourceFactoryImpl _xMIResourceFactoryImpl = new XMIResourceFactoryImpl(); + _extensionToFactoryMap.put("*", _xMIResourceFactoryImpl); + _xblockexpression = inputs.readModel(EObject.class, path).eResource().getContents(); + } + return _xblockexpression; + } + + public static ViatraQuerySetDescriptor loadQueries(final EcoreMetamodelDescriptor metamodel, final IQueryGroup i) { + final List> patterns = IterableExtensions.>toList(i.getSpecifications()); + final Function1, Boolean> _function = (IQuerySpecification it) -> { + final Function1 _function_1 = (PAnnotation it_1) -> { + String _name = it_1.getName(); + return Boolean.valueOf(Objects.equal(_name, "Constraint")); + }; + return Boolean.valueOf(IterableExtensions.exists(it.getAllAnnotations(), _function_1)); + }; + final Set> wfPatterns = IterableExtensions.>toSet(IterableExtensions.>filter(patterns, _function)); + final Map, EStructuralFeature> derivedFeatures = CollectionLiterals., EStructuralFeature>emptyMap(); + final ViatraQuerySetDescriptor res = new ViatraQuerySetDescriptor(patterns, wfPatterns, derivedFeatures); + return res; + } + + public static void writeInterpretation(final LogicResult solution, final Logic2Ecore logic2Ecore, final ReasonerWorkspace workspace, final String id, final ViatraReasoner reasoner, final TracedOutput mgProb) { + final List interpretations = reasoner.getInterpretations(((ModelResult) solution)); + int _size = interpretations.size(); + ExclusiveRange _doubleDotLessThan = new ExclusiveRange(0, _size, true); + for (final Integer interpIndex : _doubleDotLessThan) { + { + final LogicModelInterpretation interpretation = interpretations.get((interpIndex).intValue()); + final EObject model = logic2Ecore.transformInterpretation(interpretation, mgProb.getTrace()); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("sol-"); + _builder.append(id); + _builder.append("_"); + _builder.append(interpIndex); + _builder.append(".xmi"); + workspace.writeModel(model, _builder.toString()); + } + } + } + + public static void writeRepresentation(final LogicResult solution, final ReasonerWorkspace workspace, final String id) { + final EList representations = solution.getRepresentation(); + int _size = representations.size(); + ExclusiveRange _doubleDotLessThan = new ExclusiveRange(0, _size, true); + for (final Integer representationIndex : _doubleDotLessThan) { + { + final Object representation = representations.get((representationIndex).intValue()); + if ((representation instanceof PartialInterpretation)) { + final String gml = new PartialInterpretation2Gml().transform(((PartialInterpretation)representation)); + StringConcatenation _builder = new StringConcatenation(); + _builder.append("sol-"); + _builder.append(id); + _builder.append("_"); + _builder.append(representationIndex); + _builder.append(".gml"); + workspace.writeText(_builder.toString(), gml); + final PartialInterpretationVisualisation png = new GraphvizVisualiser().visualiseConcretization(((PartialInterpretation)representation)); + StringConcatenation _builder_1 = new StringConcatenation(); + _builder_1.append("sol-"); + _builder_1.append(id); + _builder_1.append("_"); + _builder_1.append(representationIndex); + _builder_1.append(".png"); + png.writeToFile(workspace, _builder_1.toString()); + } else { + StringConcatenation _builder_2 = new StringConcatenation(); + _builder_2.append("sol-"); + _builder_2.append(representationIndex); + _builder_2.append(".txt"); + workspace.writeText(_builder_2.toString(), representation.toString()); + } + } + } + } + + public static String writeStats(final LogicResult solution, final long time, final ViatraReasonerConfiguration config) { + String _xblockexpression = null; + { + final Statistics stats = solution.getStatistics(); + InputOutput.println(" Statistics:"); + Object _xifexpression = null; + if ((config.typeScopes.maxNewElements == 2147483647)) { + _xifexpression = "*"; + } else { + _xifexpression = Integer.valueOf(config.typeScopes.maxNewElements); + } + String _plus = (((" #new nodes : [" + Integer.valueOf(config.typeScopes.minNewElements)) + "..") + _xifexpression); + String _plus_1 = (_plus + "]"); + InputOutput.println(_plus_1); + _xblockexpression = InputOutput.println(((" \"solve\" time: " + Double.valueOf((((double) time) / 1000))) + " s")); + } + return _xblockexpression; + } +} -- cgit v1.2.3-70-g09d2