wiki:BossaExampleTwo

Version 1 (modified by davea, 16 years ago) (diff)

--

Example two: replication

function job_issued($job, $inst, $user) {
    $insts = $job->get_instances();
    if (count($insts) > 1) {
        $job->set_priority(0);
    }
}
function job_finished($job, $inst) {
    $response = null;
    if (get_str('submit', true)) {
        $response->have_ellipse = 0;
    } else {
        $response->have_ellipse = 1;
        $response->cx = get_int('pic_x');
        $response->cy = get_int('pic_y');
    }
    $inst->update_info($response);

    // see if job is done
    //
    $insts = $job->get_finished_instances();
    $n = count($insts);

    $results = null;
    foreach ($insts as $inst) {
        $results[] = $inst->get_info();
    }
    for ($i=0; $i<$n-1; $i++) {
        $r1 = $results[$i];
        for ($j=$i+1; $j<$n; $j++) {
            $r2 = $results[$j];
            if (compatible($r1, $r2)) {
                $job->update_state(BOSSA_JOB_DONE);
                return;
            }
        }
    }
    if ($n >= 10) {
        $job->update_state(BOSSA_JOB_INCONCLUSIVE);
        return;
    }
}

// two results are compatible if neither found an ellipse,
// or they both did and centers are within 20 pixels
//
function compatible($r1, $r2) {
    if ($r1->have_ellipse) {
        if ($r2->have_ellipse) {
            $dx = ($r1->cx - $r2->cx);
            $dy = ($r1->cy - $r2->cy);
            $dsq = $dx*$dx + $dy*$dy;
            return ($dsq < 400);
        } else return false;
    } else {
        return !$r2->have_ellipse;
    }
}