aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/cplex/CbcCpsMain.xtend
blob: 1a07e26ec95d46462ba6608efa27062758a6b4bd (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
package hu.bme.mit.inf.dslreasoner.domains.cps.cplex

import hu.bme.mit.inf.dslreasoner.domains.cps.CpsPackage
import hu.bme.mit.inf.dslreasoner.domains.cps.generator.CpsGenerator
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.FileReader
import java.io.FileWriter
import java.util.concurrent.TimeUnit
import java.util.regex.Pattern
import org.eclipse.emf.ecore.EPackage
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl

class CbcCpsMain {
	static val PROBLEM_FILE = "problem.lp"
	static val SOLUTION_FILE = "solution.txt"
	static val VALUE_REGEX = Pattern.compile("Optimal - objective value\\s*([0-9]+(\\.[0-9]+)?)")

	private new() {
		new IllegalStateException("This is a static utility class and should not be instantiated directly.")
	}

	public static def void main(String[] args) {
		Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
			new XMIResourceFactoryImpl)
		EPackage.Registry.INSTANCE.put(CpsPackage.eNS_URI, CpsPackage.eINSTANCE)
		val generator = new CpsGenerator(1, 4, 1)
		val problem = generator.generateCpsProblem
		val toLp = new CpsToLpTranslator(problem, 10, true)
		val lp = toLp.lpProblem
		val writer = new BufferedWriter(new FileWriter(PROBLEM_FILE))
		try {
			writer.append(lp)
		} finally {
			writer.close
		}
		val process = new ProcessBuilder().inheritIO.command("cbc", PROBLEM_FILE, "solve", "solu", SOLUTION_FILE).start
		if (!process.waitFor(120, TimeUnit.SECONDS)) {
			System.err.println("Timeout reached")
			process.destroyForcibly
			System.exit(-1)
		}
		if (process.exitValue != 0) {
			System.err.println("Unexpected exit value " + process.exitValue)
			System.exit(-1)
		}
		val reader = new BufferedReader(new FileReader(SOLUTION_FILE))
		var double value = Double.NaN
		try {
			var String line
			while ((line = reader.readLine) !== null) {
				println(line)
				val matcher = VALUE_REGEX.matcher(line)
				if (matcher.matches) {
					value = Double.parseDouble(matcher.group(1))
				}
			}
		} finally {
			reader.close
		}
		val applicationCost = problem.requests.flatMap[requirements.map[count]].reduce[p1, p2|p1 + p2] * 5
		val cost = applicationCost + value
		println
		println("Cost: " + cost)
	}
}