Fix comparing with zero (added tolerance epsilon), added timestamp
This commit is contained in:
parent
67b60c19df
commit
04795f0a7a
28
ovm/ovm.c
28
ovm/ovm.c
@ -49,10 +49,6 @@ ovm_t* ovm_load(const gchar *filename) {
|
||||
return ovm;
|
||||
}
|
||||
|
||||
static const gchar* cmp_op_strings[] = {
|
||||
"<", "<=", "==", ">=", ">"
|
||||
};
|
||||
|
||||
void ovm_print_c(ovm_t *ovm, const gchar *filename) {
|
||||
guint i;
|
||||
instruction_t *oi = ovm->instructions;
|
||||
@ -81,7 +77,23 @@ void ovm_print_c(ovm_t *ovm, const gchar *filename) {
|
||||
g_string_truncate(str, 0);
|
||||
break;
|
||||
case SOP_CMPZ:
|
||||
g_string_printf(str, "\tovm_status = (v%u.d %s 0.0);\n", USED(instr_sop_r1(oi[i])), cmp_op_strings[instr_sop_cmp(oi[i])]);
|
||||
switch (instr_sop_cmp(oi[i])) {
|
||||
case CMP_LTZ:
|
||||
g_string_printf(str, "\tovm_status = (v%u.d < -eps);\n", USED(instr_sop_r1(oi[i])));
|
||||
break;
|
||||
case CMP_LEZ:
|
||||
g_string_printf(str, "\tovm_status = (v%u.d <= eps);\n", USED(instr_sop_r1(oi[i])));
|
||||
break;
|
||||
case CMP_EQZ:
|
||||
g_string_printf(str, "\tovm_status = (fabs(v%u.d) <= eps);\n", USED(instr_sop_r1(oi[i])));
|
||||
break;
|
||||
case CMP_GEZ:
|
||||
g_string_printf(str, "\tovm_status = (v%u.d > eps);\n", USED(instr_sop_r1(oi[i])));
|
||||
break;
|
||||
case CMP_GTZ:
|
||||
g_string_printf(str, "\tovm_status = (v%u.d >= -eps);\n", USED(instr_sop_r1(oi[i])));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SOP_SQRT:
|
||||
g_string_printf(str, "\tv%u.d = sqrt(v%u.d);\n", USED(i), USED(instr_sop_r1(oi[i])));
|
||||
@ -108,7 +120,7 @@ void ovm_print_c(ovm_t *ovm, const gchar *filename) {
|
||||
g_string_printf(str, "\tv%u.d = v%u.d * v%u.d;\n", USED(i), USED(instr_dop_r1(oi[i])), USED(instr_dop_r2(oi[i])));
|
||||
break;
|
||||
case OP_DIV:
|
||||
g_string_printf(str, "\tv%u.d = (v%u.d == 0.0) ? 0.0 : v%u.d / v%u.d;\n", USED(i), USED(instr_dop_r2(oi[i])), USED(instr_dop_r1(oi[i])), instr_dop_r2(oi[i]));
|
||||
g_string_printf(str, "\tv%u.d = (fabs(v%u.d) < eps) ? 0.0 : v%u.d / v%u.d;\n", USED(i), USED(instr_dop_r2(oi[i])), USED(instr_dop_r1(oi[i])), instr_dop_r2(oi[i]));
|
||||
break;
|
||||
case OP_OUT:
|
||||
g_string_printf(str, "\tout[%u] = v%u.d;\n", instr_dop_r1(oi[i]), USED(instr_dop_r2(oi[i])));
|
||||
@ -132,7 +144,8 @@ void ovm_print_c(ovm_t *ovm, const gchar *filename) {
|
||||
"\n"
|
||||
"typedef union { gdouble d; guint64 i; } double_int;\n"
|
||||
"\n"
|
||||
"static gboolean ovm_status = FALSE;\n"
|
||||
"static gboolean ovm_status;\n"
|
||||
"static const gdouble eps = 1e-300;\n"
|
||||
"\n"
|
||||
"static double_int v0"
|
||||
));
|
||||
@ -150,6 +163,7 @@ void ovm_print_c(ovm_t *ovm, const gchar *filename) {
|
||||
));
|
||||
for (i = 0; i < ovm->used; i++) {
|
||||
if (!usedv[i]) continue;
|
||||
/* g_string_printf(str, "\tv%u.d = %f;\n", i, vi[i]); */
|
||||
g_string_printf(str, "\tv%u.i = G_GUINT64_CONSTANT(%" G_GUINT64_FORMAT "); /* %f */ \n", i, uvi[i], vi[i]);
|
||||
write(f, GSTR_LEN(str));
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ void task_free(task_t *task) {
|
||||
task_t* task_new(gdouble scenario, guint in_size, guint out_size) {
|
||||
task_t *task = g_slice_new(task_t);
|
||||
task->scenario = scenario;
|
||||
task->timestamp = 0;
|
||||
task->in_size = in_size;
|
||||
task->out_size = out_size;
|
||||
task->in = g_slice_alloc0(task->in_size * sizeof(gdouble));
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
typedef struct {
|
||||
gdouble scenario;
|
||||
guint64 timestamp;
|
||||
guint in_size, out_size;
|
||||
gdouble *in, *out;
|
||||
} task_t;
|
||||
@ -19,7 +20,7 @@ void ovm_step(gdouble scenario, gdouble *in, gdouble *out);
|
||||
|
||||
static inline gdouble task_run(task_t *task, task_app_t app) {
|
||||
ovm_init();
|
||||
while (task->out[0] == 0.0) {
|
||||
for ( ; task->out[0] == 0.0 && task->timestamp < 3000000; task->timestamp++) {
|
||||
app(task);
|
||||
ovm_step(task->scenario, task->in, task->out);
|
||||
}
|
||||
|
@ -3,9 +3,9 @@
|
||||
|
||||
static void debug(task_t * task) {
|
||||
gdouble *o = task->out;
|
||||
g_debug(
|
||||
"Score: %5f Fuel: %5f x: %5f y: %5f r: %5f\n",
|
||||
o[0], o[1], o[2], o[3], o[4]);
|
||||
printf(
|
||||
"Step: %9"G_GUINT64_FORMAT" Score: %5f Fuel: %5f x: %5f y: %5f r: %5f\n",
|
||||
task->timestamp, o[0], o[1], o[2], o[3], o[4]);
|
||||
}
|
||||
|
||||
static void run(task_t *task) {
|
||||
@ -19,7 +19,7 @@ int main(int argc, char **argv) {
|
||||
UNUSED(argc);
|
||||
UNUSED(argv);
|
||||
|
||||
task = task_new(1001.0, 4, 5);
|
||||
task = task_new(1002.0, 4, 5);
|
||||
score = task_run(task, run);
|
||||
printf("Final Score: %f\n", score);
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user