aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/MODELS2020-CaseStudies/models20.diversity-calculator/src/hu/bme/mit/inf/dslreasoner/diversitycalculator/MeasureInternalDiversity.xtend
blob: 1510eeb807dac8edf5072f1d063792fb3bfeb777 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package hu.bme.mit.inf.dslreasoner.diversitycalculator

import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2LogicConfiguration
import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.Ecore2logicannotationsPackage
import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguagePackage
import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicproblemPackage
import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.Viatra2LogicAnnotationsPackage
import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretation2logic.InstanceModel2PartialInterpretation
import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.neighbourhood.PartialInterpretation2ImmutableTypeLattice
import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationPackage
import hu.bme.mit.inf.dslreasoner.workspace.FileSystemWorkspace
import java.io.File
import java.util.LinkedList
import java.util.List
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
import hu.bme.mit.inf.dslreasoner.ecore2logic.EcoreMetamodelDescriptor

class MeasureInternalDiversity {
		static val partialInterpretation2Logic = new InstanceModel2PartialInterpretation
	static val neiguboirhoodComputer = new PartialInterpretation2ImmutableTypeLattice
	
	static val Ecore2Logic ecore2Logic = new Ecore2Logic
	
	static private def init() {
		LogiclanguagePackage.eINSTANCE.class
		LogicproblemPackage.eINSTANCE.class
		PartialinterpretationPackage.eINSTANCE.class
		Ecore2logicannotationsPackage.eINSTANCE.class
		Viatra2LogicAnnotationsPackage.eINSTANCE.class
		Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl)
	}
	
	
	def static void main(String[] args) {
		init()
	}
	
	def static run(EcoreMetamodelDescriptor metamodel, String path, String scenario) {
		val range = 20
		
		measureDiversity(metamodel,scenario,path,range)
	}
	
	def static void measureDiversity(EcoreMetamodelDescriptor metamodel, String scenario, String path, int depth) {
		val file = new File(path)
		if(file.isDirectory) {
			val subfiles = file.list
			val xmiSubfiles = subfiles.filter[it.endsWith(".xmi")]
			if(!xmiSubfiles.empty) {
				measureDiversity(metamodel, scenario,file,xmiSubfiles.map[new File(path+"/"+it)].toList,path,depth)
			} else {
				for(subfile : subfiles) {
					measureDiversity(metamodel, scenario,path+"/"+subfile,depth)
				}
			}
		} else if(file.isFile) {
			// Do nothing
		}	
	}
	
	def static void measureDiversity(EcoreMetamodelDescriptor metamodel, String scenario, File parent, List<File> files, String path, int depth) {
		val workspace = new FileSystemWorkspace(path,"")
		//val file2Neighbourhood = new HashMap<File,List<?>>
		for(file : files) {
			
			val metamodelTransformationOutput = ecore2Logic.transformMetamodel(metamodel,new Ecore2LogicConfiguration)
			
			val model = workspace.readModel(EObject,file.name)
			val partialModel = partialInterpretation2Logic.transform(metamodelTransformationOutput,model.eResource,false)
			val list = representationList(partialModel,depth)
			try {
				val runIndex = file.name.runIndex
				val modelIndex = file.name.modelIndex
				print('''«scenario»;«runIndex»;«modelIndex»''')
			} catch (Exception e) {
				print('''«scenario»;0;«file.name»''')
			}
			for(i : 0..<list.size) {
				print(''';«list.get(i).keySet.size»''')
			}
			print(";"+(list.last.keySet.size*1.0 /partialModel.newElements.size))
			println
		}
	}
	
	protected def static runIndex(String name) {
		name.split("\\.").head.split('_').get(1)
	}
	protected def static modelIndex(String name) {
		name.split("\\.").head.split('_').get(2)
	}
	
	protected def static  representationList(PartialInterpretation partialModel, int depth) {
		val list = new LinkedList
		for(i : 0..<depth) {
			val neighbourhood = neiguboirhoodComputer.createRepresentation(partialModel,i,0,0)
			//val m = neighbourhood.modelRepresentation
			//println(m)
			list.add(neighbourhood.modelRepresentation)
		}
		return list
	}
}