1<?php
2// This file is part of BOINC.
3// http://boinc.berkeley.edu
4// Copyright (C) 2010 University of California
5//
6// BOINC is free software; you can redistribute it and/or modify it
7// under the terms of the GNU Lesser General Public License
8// as published by the Free Software Foundation,
9// either version 3 of the License, or (at your option) any later version.
10//
11// BOINC is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14// See the GNU Lesser General Public License for more details.
15//
16// You should have received a copy of the GNU Lesser General Public License
17// along with BOINC.  If not, see <http://www.gnu.org/licenses/>.
18
19// utility for studying the credit system
20
21error_reporting(E_ALL);
22ini_set('display_errors', true);
23ini_set('display_startup_errors', true);
24
25require_once("../inc/util.inc");
26require_once("../inc/util_ops.inc");
27require_once("../inc/boinc_db.inc");
28
29define('COBB_SCALE', 200/86400e9);
30
31function gavid($avid, $appid) {
32    if ($avid < 0) {
33        return $appid*1000000 - $avid;
34    }
35    return $avid;
36}
37
38function show_res($r, $w) {
39    $gavid = gavid($r->app_version_id, $w->appid);
40    $hav = BoincHostAppVersion::lookup($r->hostid, $gavid);
41    $av = BoincAppVersion::lookup_id($r->app_version_id);
42    $raw_credit = $r->elapsed_time*$r->flops_estimate*COBB_SCALE;
43    echo "<hr><pre>
44Result ID: <a href=db_action.php?table=result&id=$r->id>$r->id</a>
45Host: <a href=credit.php?hostid=$r->hostid&avid=$r->app_version_id>$r->hostid</a>
46elapsed_time: $r->elapsed_time
47flops_estimate: ".$r->flops_estimate/1e9."
48app_version_id: $r->app_version_id
49";
50    if ($av) {
51        $host_scale = $av->pfc_avg/$hav->pfc_avg;
52        $av_scale = $av->pfc_scale;
53        echo "app version scale: $av->pfc_scale\n";
54    } else {
55        $host_scale = 1;
56        $av_scale = 1;
57    }
58    echo "host scale: $host_scale
59Credit:
60    Original: $r->claimed_credit
61    Raw: $raw_credit
62    Scaled: ".$raw_credit*$host_scale*$av_scale."
63    Granted: $r->granted_credit
64";
65    if ($hav) {
66        echo "Host app version:
67    PFC avg: $hav->pfc_avg
68";
69    }
70}
71
72function handle_result($resultid) {
73    $r = BoincResult::lookup_id($resultid);
74    $w = BoincWorkunit::lookup_id($r->workunitid);
75    $rs = BoincResult::enum("workunitid=$r->workunitid and validate_state=1");
76    $app_version_ids = array();
77    foreach ($rs as $r) {
78        show_res($r, $w);
79        $app_version_ids[] = $r->app_version_id;
80    }
81    $app_version_ids = array_unique($app_version_ids);
82    foreach ($app_version_ids as $avid) {
83        show_av($avid);
84    }
85}
86
87function show_host_av($host_id, $av_id) {
88    $hav = BoincHostAppVersion::lookup("host_id=$host_id and app_version_id=$av_id");
89    page_head("Host $host_id / app_version $av_id credit");
90    echo "Results";
91    $rs = BoincResult::enum("hostid=$host_id and app_version_id=$av_id and validate_state=1 order by id desc limit 100");
92    start_table();
93    table_header("Workunit", "Elapsed", "Proj FLOPS", "Raw credit", "granted");
94    $n = 0;
95    $total=0;
96    foreach($rs as $r) {
97        $raw_credit = $r->elapsed_time*$r->flops_estimate*COBB_SCALE;
98        $n++;
99        $total += $raw_credit;
100        table_row(
101            "<a href=credit.php?wu_id=$r->workunitid>$r->workunitid</a>",
102            $r->elapsed_time,
103            $r->projected_flops,
104            $raw_credit,
105            $r->granted_credit
106        );
107    }
108
109    start_table();
110    row2("PFC nsamples", $hav->pfc_n);
111    row2("PFC avg", $hav->pfc_avg);
112    row2("Average raw credit", $total/$n);
113    end_table();
114
115    page_tail();
116}
117
118function av_string($av_id) {
119    if ($av_id> 0) {
120        $av = BoincAppVersion::lookup($av_id);
121        $plat = BoincPlatform::lookup_id($av->platformid);
122        $x = "<a href=credit.php?av_id=$av_id>$plat->name $av->plan_class</a>";
123    } else {
124        $x = "Anonymous platform";
125    }
126    return $x;
127}
128
129function show_wu($wu_id) {
130    page_head("Workunit credit");
131    $wu = BoincWorkunit::lookup_id($wu_id);
132    $app = BoincApp::lookup_id($wu->appid);
133    start_table();
134    row2("App", "<a href=credit.php?app_id=$app->id>$app->user_friendly_name</a>");
135    end_table();
136    echo "Results";
137    start_table();
138    table_header("Host", "App version", "Elapsed", "FLOPS est");
139    $results = BoincResult::enum("workunitid=$wu->id and validate_state=1");
140    foreach ($results as $r) {
141        table_row(
142            "<a href=credit.php?host_id=$r->hostid>$r->hostid</a>",
143            av_string($r->app_version_id),
144            $r->elapsed_time,
145            $r->flops_estimate
146        );
147    }
148    end_table();
149    page_tail();
150}
151
152function show_av($av_id) {
153    $av = BoincAppVersion::lookup_id($av_id);
154    $app = BoincApp::lookup_id($av->appid);
155    $plat = BoincPlatform::lookup_id($av->platformid);
156    $av_desc = "$plat->name $av->plan_class";
157    page_head("App version $av_desc credit");
158
159    start_table();
160    row2("PFC samples", $av->pfc_n);
161    row2("PFC average", $av->pfc_avg);
162    row2("PFC scale", $av->pfc_scale);
163    row2("App", $app->user_friendly_name);
164    end_table();
165
166    $results = BoincResult::enum("app_version_id=$av_id and validate_state=1");
167    start_table();
168    table_header("Host/App_version", "Elapsed", "FLOPS est");
169    foreach ($results as $r) {
170        $avs = av_string($r->app_version_id);
171        table_row(
172            "<a href=credit.php?host_id=$r->hostid&a_id=$r->app_version_id> host $r->hostid AV $avs</a>",
173            $r->elapsed_time,
174            $r->flops_estimate
175        );
176    }
177    end_table();
178    page_tail();
179}
180
181function show_appl($app_id) {
182    $app = BoincApp::lookup_id($app_id);
183    page_head("App $app->user_friendly_name credit");
184    $avs = BoincAppVersion::enum("appid=$app_id and deprecated=0");
185    start_table();
186    table_header("platform/class/version", "PFC nsamples", "PFC avg", "PFC scale");
187    $avs = current_versions($avs);
188    foreach ($avs as $av) {
189        $plat = BoincPlatform::lookup_id($av->platformid);
190        table_row(
191            "<a href=credit.php?av_id=$av->id>$plat->user_friendly_name $av->plan_class $av->version_num</a>",
192            $av->pfc_n,
193            $av->pfc_avg,
194            $av->pfc_scale
195        );
196    }
197    end_table();
198    page_tail();
199}
200
201$wu_id = get_int("wu_id", true);
202$host_id = get_int("host_id", true);
203$av_id = get_int("av_id", true);
204$app_id = get_int("app_id", true);
205if ($wu_id) {
206    show_wu($wu_id);
207    exit;
208}
209if ($host_id && $av_id) {
210    show_host_av($host_id, $av_id);
211    exit;
212}
213if ($av_id) {
214    show_av($av_id);
215    exit;
216}
217if ($app_id) {
218    show_appl($app_id);
219    exit;
220}
221
222error_page("no command");
223
224?>
225