Echtzeitsysteme/gips

`->sum(t | t.inta / t.intb)` generates non-compilable code

Opened this issue · 0 comments

Example GIPSL snippet:

package "gips.generic.scheduling"
import "platform:/resource/gips.scheduling.taskmodel/model/Taskmodel.ecore"

config {  
	solver := GLPK [home:="fu", license:="bar"];
	timeLimit := true [value := 60.0];
	randomSeed := true [value := 0];
	presolve := true;
	debugOutput := true;
}

rule runTaskInSlot {
	root: Root {
		-tasks -> t
		-slots -> s
	}
	
	t: Task {
		++ -runningon -> s
	}
	
	s: Slot
	
	# t.^deadline >= s.^index
}

mapping t2s with runTaskInSlot;

constraint -> global {
	0 == classes.Task->sum(t | t.duration / t.deadline)
}

Generated code:

	@Override
	protected double buildConstantRhs() {
		return indexer.getObjectsOfType("Task").stream()
					.map(type -> (Task) type)
					.map(itr_0 -> itr_0.getDuration() / itr_0.getDeadline())
					.reduce(0.0, (sum, value) -> sum + value);
	}

Current workaround: Explicitly convert the first operand to double:

constraint -> global {
	0 == classes.Task->sum(t | 1.0 * t.duration / t.deadline)
}