Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

YadaOneOnOne.tcl

00001 # Copyright (C) 1997-2004 The CDG Team <cdg@nats.informatik.uni-hamburg.de> 00002 # 00003 # This file is free software; as a special exception the author gives 00004 # unlimited permission to copy and/or distribute it, with or without 00005 # modifications, as long as this notice is preserved. 00006 # 00007 # This program is distributed in the hope that it will be useful, but 00008 # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the 00009 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00010 00011 ## ---------------------------------------------------------------------------- 00012 ## YadaOneOnOne - difference between two experiments. 00013 ## \ingroup YadaRunnableDocuments 00014 ## 00015 ## \author Michael Daum 00016 ## $Id: YadaOneOnOne.tcl,v 1.25 2003/02/07 16:55:11 micha Exp $ 00017 ## ---------------------------------------------------------------------------- 00018 class YadaOneOnOne { 00019 inherit YadaRunnableDocument 00020 00021 # variables ---------------------------------------------------------------- 00022 public variable betterAndFasterBackground "green1" 00023 public variable betterAndFasterForeground "black" 00024 public variable betterBackground "green2" 00025 public variable betterButSlowerBackground "green3" 00026 public variable betterButSlowerForeground "black" 00027 public variable betterForeground "black" 00028 public variable fasterBackground "lightblue" 00029 public variable fasterForeground "black" 00030 public variable harderBackground "deepskyblue3" 00031 public variable harderForeground "black" 00032 public variable sameBackground "gray" 00033 public variable sameForeground "black" 00034 public variable slowerBackground "yellow" 00035 public variable slowerForeground "black" 00036 public variable softerBackground "deepskyblue1" 00037 public variable softerForeground "black" 00038 public variable weirdBackground "pink" 00039 public variable weirdForeground "black" 00040 public variable worseAndSlowerBackground "red3" 00041 public variable worseAndSlowerForeground "white" 00042 public variable worseBackground "red1" 00043 public variable worseButFasterBackground "orange" 00044 public variable worseButFasterForeground "black" 00045 public variable worseForeground "white" 00046 00047 private variable _totalWordgraphs 0 00048 private variable _fasterWordgraphs 0 00049 private variable _betterWordgraphs 0 00050 private variable _betterAndFasterWordgraphs 0 00051 private variable _betterButSlowerWordgraphs 0 00052 private variable _softerWordgraphs 0 00053 private variable _harderWordgraphs 0 00054 private variable _sameWordgraphs 0 00055 private variable _worseButFasterWordgraphs 0 00056 private variable _worseAndSlowerWordgraphs 0 00057 private variable _worseWordgraphs 0 00058 private variable _slowerWordgraphs 0 00059 private variable _weirdWordgraphs 0 00060 00061 private variable _totalTime1 0 00062 private variable _score1 0 00063 private variable _totalTime2 0 00064 private variable _score2 0 00065 private variable _noSolutions1 0 00066 private variable _totalSolTime1 0 00067 private variable _totalSoftTime1 0 00068 private variable _noSolutions2 0 00069 private variable _totalSolTime2 0 00070 private variable _totalSoftTime2 0 00071 private variable _noErrors1 0 00072 private variable _noErrors2 0 00073 private variable _totalStructRecall1 0 00074 private variable _totalLexicalRecall1 0 00075 private variable _totalLabelledRecall1 0 00076 private variable _totalStructRecall2 0 00077 private variable _totalLexicalRecall2 0 00078 private variable _totalLabelledRecall2 0 00079 00080 private variable _typeOfColumn ; ## \type TclArray 00081 private variable _scoreOf ; ## \type TclArray 00082 private variable _structHitsOf ; ## \type TclArray 00083 private variable _lexicalHitsOf ; ## \type TclArray 00084 private variable _labelledHitsOf ; ## \type TclArray 00085 private variable _triesOf ; ## \type TclArray 00086 00087 private variable _prevExperimentName1 "" 00088 private variable _prevExperimentName2 "" 00089 00090 # methods ------------------------------------------------------------------ 00091 public method activationHandle {} 00092 public method load {args}; ## \type TclList 00093 public method save {{fileName ""}}; ## \type TclString 00094 public method step {{wordgraph ""}}; ## \type TclString 00095 public method clear {} 00096 public method runall {} 00097 public method run {} 00098 public method selectExperiment {experimentNo {experimentName ""}}; ## \type TclNumber, TclString 00099 00100 constructor {args} {}; ## \type TclList 00101 00102 private method _analyseDocument {document experiment}; ## \type DomDocument, YadaExperiment 00103 private method _judgeRow {row}; ## \type TclNumber 00104 private method _computeStatistics {} 00105 private method _judgeData {measure1a measure1b time1 solutionTime1 softTime1 measure2a measure2b time2 solutionTime2 softTime2}; ## \type TclNumber, TclNumber, TclNumber, TclNumber, TclNumber, TclNumber, TclNumber, TclNumber, TclNumber, TclNumber 00106 private method _getJudgeOfRow {row}; ## \type TclNumber 00107 private method _getWordgraphs {} 00108 private method _getSelectedExperiments {} 00109 private method _getTypeOfColumn {colNo} ; ## \type TclNumber 00110 private method _resetDataOf {wordgraphs}; ## \type TclList 00111 private method _jobConsumer {job}; ## \type YadaJob 00112 private method _getDoneWork {} 00113 private method _getUndoneWork {} 00114 00115 protected method _viewLogfile {} 00116 protected method _viewXmlfile {} 00117 protected method _traceProcess {} 00118 }; 00119 00120 ## ---------------------------------------------------------------------------- 00121 ## constructor 00122 ## ---------------------------------------------------------------------------- 00123 body YadaOneOnOne::constructor {args} { 00124 00125 # reconfigure table 00126 $itk_component(table) configure -rows 300 -cols 18 \ 00127 -rowtagcommand [code $this _judgeRow] 00128 00129 # set types of columns 00130 array set _typeOfColumn { 00131 0 "dictionary" 00132 1 "integer" 00133 2 "real" 00134 3 "integer" 00135 4 "integer" 00136 5 "integer" 00137 6 "integer" 00138 7 "real" 00139 8 "real" 00140 9 "integer" 00141 10 "integer" 00142 11 "integer" 00143 12 "integer" 00144 13 "real" 00145 14 "real" 00146 15 "real" 00147 16 "real" 00148 17 "ascii" 00149 } 00150 00151 # experiments 00152 foreach i {1 2} { 00153 00154 itk_component add experiment${i}BoxLabel { 00155 label $itk_component(heading).experiment${i}BoxLabel \ 00156 -text "Experiment ${i}:" \ 00157 -anchor w 00158 } {} 00159 00160 itk_component add experiment${i}Box { 00161 iwidgets::combobox $itk_component(heading).experiment${i}Box \ 00162 -completion false \ 00163 -borderwidth 2 \ 00164 -margin 4 \ 00165 -selectioncommand [code $this selectExperiment $i] 00166 } {} 00167 00168 itk_component add score${i}Label { 00169 label $itk_component(heading).score${i}Label \ 00170 -text "Score:" \ 00171 -anchor w \ 00172 } {} 00173 00174 itk_component add score${i} { 00175 entry $itk_component(heading).score${i} \ 00176 -borderwidth 2 \ 00177 -state disabled \ 00178 -width 20 00179 } {} 00180 00181 itk_component add totalTime${i}Label { 00182 label $itk_component(heading).totalTime${i}Label \ 00183 -text "Time:" \ 00184 -anchor w 00185 } {} 00186 00187 itk_component add totalTime${i} { 00188 entry $itk_component(heading).totalTime${i} \ 00189 -borderwidth 2 \ 00190 -state disabled \ 00191 -width 20 00192 } {} 00193 00194 itk_component add noSolutions${i}Label { 00195 label $itk_component(heading).noSolutions${i}Label \ 00196 -text "No.Solutions:" \ 00197 -anchor w 00198 } {} 00199 00200 itk_component add noSolutions${i} { 00201 entry $itk_component(heading).noSolutions${i} \ 00202 -textvariable [scope _noSolutions${i}] \ 00203 -borderwidth 2 \ 00204 -state disabled \ 00205 -width 20 00206 } {} 00207 00208 itk_component add noErrors${i}Label { 00209 label $itk_component(heading).noErrors${i}Label \ 00210 -text "No.Errors:" \ 00211 -anchor w 00212 } {} 00213 00214 itk_component add noErrors${i} { 00215 entry $itk_component(heading).noErrors${i} \ 00216 -borderwidth 2 \ 00217 -state disabled \ 00218 -width 20 00219 } {} 00220 00221 itk_component add totalSolTime${i}Label { 00222 label $itk_component(heading).totalSolTime${i}Label \ 00223 -text "Sol.Time:" \ 00224 -anchor w 00225 } {} 00226 00227 itk_component add totalSolTime${i} { 00228 entry $itk_component(heading).totalSolTime${i} \ 00229 -borderwidth 2 \ 00230 -state disabled \ 00231 -width 20 00232 } {} 00233 00234 itk_component add totalSoftTime${i}Label { 00235 label $itk_component(heading).totalSoftTime${i}Label \ 00236 -text "Soft Time:" \ 00237 -anchor w 00238 } {} 00239 00240 itk_component add totalSoftTime${i} { 00241 entry $itk_component(heading).totalSoftTime${i} \ 00242 -borderwidth 2 \ 00243 -state disabled \ 00244 -width 20 00245 } {} 00246 00247 itk_component add totalStructRecall${i}Label { 00248 label $itk_component(heading).totalStructRecall${i}Label \ 00249 -text "Struct.Recall:" \ 00250 -anchor w 00251 } {} 00252 00253 itk_component add totalStructRecall${i} { 00254 entry $itk_component(heading).totalStructRecall${i} \ 00255 -borderwidth 2 \ 00256 -state disabled \ 00257 -width 20 00258 } {} 00259 00260 itk_component add totalLexicalRecall${i}Label { 00261 label $itk_component(heading).totalLexicalRecall${i}Label \ 00262 -text "Lex.Recall:" \ 00263 -anchor w 00264 } {} 00265 00266 itk_component add totalLabelledRecall${i}Label { 00267 label $itk_component(heading).totalLabelledRecall${i}Label \ 00268 -text "Label.Recall:" \ 00269 -anchor w 00270 } {} 00271 00272 itk_component add totalLabelledRecall${i} { 00273 entry $itk_component(heading).totalLabelledRecall${i} \ 00274 -borderwidth 2 \ 00275 -state disabled \ 00276 -width 20 00277 } {} 00278 00279 00280 itk_component add totalLexicalRecall${i} { 00281 entry $itk_component(heading).totalLexicalRecall${i} \ 00282 -borderwidth 2 \ 00283 -state disabled \ 00284 -width 20 00285 } {} 00286 00287 # bindings 00288 set entry [$itk_component(experiment${i}Box) component entry] 00289 bind $entry <Return> [code $this selectExperiment $i] 00290 bind $entry <Up> +[code $this selectExperiment $i] 00291 bind $entry <Down> +[code $this selectExperiment $i] 00292 } 00293 00294 # separator 00295 itk_component add separator { 00296 frame $itk_component(heading).separator \ 00297 -height 2 \ 00298 -borderwidth 2 \ 00299 -relief sunk 00300 } 00301 00302 # 00303 # judge bar 00304 # 00305 itk_component add judgeFrame { 00306 frame $itk_component(heading).judgeFrame 00307 } 00308 00309 itk_component add totalWordgraphs { 00310 iwidgets::entryfield $itk_component(judgeFrame).totalWordgraphs \ 00311 -labeltext "Total:" \ 00312 -textvariable [scope _totalWordgraphs] \ 00313 -labelpos w \ 00314 -borderwidth 2 \ 00315 -state disabled \ 00316 -disabledforeground black \ 00317 -width 5 00318 } {} 00319 00320 itk_component add judgeBar { 00321 YadaJudgeBar $itk_component(judgeFrame).judgeBar \ 00322 -height 15 \ 00323 -borderwidth 2 \ 00324 -relief sunk \ 00325 -betterAndFasterBackground $betterAndFasterBackground \ 00326 -betterBackground $betterBackground \ 00327 -betterButSlowerBackground $betterButSlowerBackground \ 00328 -fasterBackground $fasterBackground \ 00329 -softerBackground $softerBackground \ 00330 -sameBackground $sameBackground \ 00331 -harderBackground $harderBackground \ 00332 -slowerBackground $slowerBackground \ 00333 -worseButFasterBackground $worseButFasterBackground \ 00334 -worseBackground $worseBackground \ 00335 -worseAndSlowerBackground $worseAndSlowerBackground \ 00336 -betterForeground $betterForeground \ 00337 -betterAndFasterForeground $betterAndFasterForeground \ 00338 -betterButSlowerForeground $betterButSlowerForeground \ 00339 -fasterForeground $fasterForeground \ 00340 -softerForeground $softerForeground \ 00341 -sameForeground $sameForeground \ 00342 -harderForeground $harderForeground \ 00343 -slowerForeground $slowerForeground \ 00344 -worseButFasterForeground $worseButFasterForeground \ 00345 -worseAndSlowerForeground $worseAndSlowerForeground \ 00346 -worseForeground $worseForeground \ 00347 -weirdForeground $weirdForeground \ 00348 -weirdBackground $weirdBackground 00349 } {} 00350 00351 # packing 00352 grid columnconfigure $itk_component(heading) 1 -weight 1 00353 grid columnconfigure $itk_component(heading) 2 -pad 5 00354 grid columnconfigure $itk_component(heading) 3 -weight 1 00355 grid columnconfigure $itk_component(heading) 4 -pad 5 00356 grid columnconfigure $itk_component(heading) 5 -weight 1 00357 grid columnconfigure $itk_component(heading) 6 -pad 5 00358 grid columnconfigure $itk_component(heading) 7 -weight 1 00359 grid columnconfigure $itk_component(heading) 8 -pad 5 00360 grid columnconfigure $itk_component(heading) 9 -weight 1 00361 grid columnconfigure $itk_component(heading) 10 -pad 5 00362 grid columnconfigure $itk_component(heading) 11 -weight 1 00363 grid columnconfigure $itk_component(heading) 12 -pad 5 00364 grid columnconfigure $itk_component(heading) 13 -weight 1 00365 grid columnconfigure $itk_component(heading) 14 -pad 5 00366 00367 foreach i {1 2} { 00368 grid $itk_component(experiment${i}BoxLabel) \ 00369 -row 0 -column [expr ($i - 1) * 8] -sticky ew -pady 2 00370 grid $itk_component(experiment${i}Box) \ 00371 -row 0 -column [expr ($i - 1) * 8 + 1] -sticky ew -pady 2 -columnspan 5 00372 00373 grid $itk_component(totalTime${i}Label) \ 00374 -row 1 -column [expr ($i - 1) * 8] -sticky ew -pady 2 00375 grid $itk_component(totalTime${i}) \ 00376 -row 1 -column [expr ($i - 1) * 8 + 1] -sticky ew -pady 2 00377 00378 grid $itk_component(score${i}Label)\ 00379 -row 1 -column [expr ($i - 1) * 8 + 2] -sticky ew -pady 2 00380 grid $itk_component(score${i})\ 00381 -row 1 -column [expr ($i - 1) * 8 + 3] -sticky ew -pady 2 00382 00383 grid $itk_component(totalStructRecall${i}Label) \ 00384 -row 1 -column [expr ($i - 1) * 8 + 4] -sticky ew -pady 2 00385 grid $itk_component(totalStructRecall${i}) \ 00386 -row 1 -column [expr ($i - 1) * 8 + 5] -sticky ew -pady 2 00387 00388 grid $itk_component(totalSolTime${i}Label) \ 00389 -row 2 -column [expr ($i - 1) * 8 ] -sticky ew -pady 2 00390 grid $itk_component(totalSolTime${i}) \ 00391 -row 2 -column [expr ($i - 1) * 8 + 1] -sticky ew -pady 2 00392 00393 grid $itk_component(noErrors${i}Label) \ 00394 -row 2 -column [expr ($i - 1) * 8 + 2] -sticky ew -pady 2 00395 grid $itk_component(noErrors${i}) \ 00396 -row 2 -column [expr ($i - 1) * 8 + 3] -sticky ew -pady 2 00397 00398 grid $itk_component(totalLabelledRecall${i}Label) \ 00399 -row 2 -column [expr ($i - 1) * 8 + 4] -sticky ew -pady 2 00400 grid $itk_component(totalLabelledRecall${i}) \ 00401 -row 2 -column [expr ($i - 1) * 8 + 5] -sticky ew -pady 2 00402 00403 grid $itk_component(totalSoftTime${i}Label) \ 00404 -row 3 -column [expr ($i - 1) * 8 ] -sticky ew -pady 2 00405 grid $itk_component(totalSoftTime${i}) \ 00406 -row 3 -column [expr ($i - 1) * 8 + 1] -sticky ew -pady 2 00407 00408 grid $itk_component(noSolutions${i}Label) \ 00409 -row 3 -column [expr ($i - 1) * 8 + 2] -sticky ew -pady 2 00410 grid $itk_component(noSolutions${i}) \ 00411 -row 3 -column [expr ($i - 1) * 8 + 3] -sticky ew -pady 2 00412 00413 grid $itk_component(totalLexicalRecall${i}Label) \ 00414 -row 3 -column [expr ($i - 1) * 8 + 4] -sticky ew -pady 2 00415 grid $itk_component(totalLexicalRecall${i}) \ 00416 -row 3 -column [expr ($i - 1) * 8 + 5] -sticky ew -pady 2 00417 00418 } 00419 00420 grid $itk_component(separator) -sticky ew -row 4 -column 0 -pady 10 -columnspan 14 00421 grid $itk_component(judgeFrame) -sticky ew -row 7 -column 0 -pady 2 -columnspan 14 00422 00423 grid columnconfigure $itk_component(judgeFrame) 1 -weight 1 00424 00425 grid $itk_component(totalWordgraphs) -sticky w -row 0 -column 0 -pady 2 00426 grid $itk_component(judgeBar) -sticky ew -row 0 -column 1 -pady 2 00427 00428 eval itk_initialize $args 00429 .main registerDocument $this 00430 } 00431 00432 ## ---------------------------------------------------------------------------- 00433 ## _judgeRow 00434 ## ---------------------------------------------------------------------------- 00435 body YadaOneOnOne::_judgeRow {row} { 00436 set judge [_getJudgeOfRow $row] 00437 set wordgraph [$itk_component(table) getCell $row,0] 00438 00439 if {$judge == "" || $_doneWordgraph($wordgraph) != 3} { 00440 if {[expr $row % 2]} { 00441 return "default" 00442 } else { 00443 return "colored" 00444 } 00445 } 00446 00447 return $judge 00448 } 00449 00450 00451 ## ---------------------------------------------------------------------------- 00452 ## clear 00453 ## ---------------------------------------------------------------------------- 00454 body YadaOneOnOne::clear {} { 00455 chain ;# call YadaRunnableDocument::clear 00456 00457 # reset the table 00458 set table $itk_component(table) 00459 $table setCell \ 00460 0,0 "wordgraph" \ 00461 0,1 "values" \ 00462 0,2 "score" \ 00463 0,3 "errors" \ 00464 0,4 "time" \ 00465 0,5 "sol.time" \ 00466 0,6 "soft time" \ 00467 0,7 "lex.recall" \ 00468 0,8 "score" \ 00469 0,9 "errors" \ 00470 0,10 "time" \ 00471 0,11 "sol.time" \ 00472 0,12 "soft time" \ 00473 0,13 "lex.recall" \ 00474 0,14 "speed up" \ 00475 0,15 "sol.speed up" \ 00476 0,16 "soft speed up" \ 00477 0,17 "judge" 00478 00479 00480 $table tag config default -anchor e 00481 $table tag config colored -bg gray80 -anchor e 00482 $table tag config better -bg $betterBackground -fg $betterForeground -anchor e -relief flat 00483 $table tag config betterAndFaster -bg $betterAndFasterBackground -fg $betterAndFasterForeground -anchor e -relief flat 00484 $table tag config betterButSlower -bg $betterButSlowerBackground -fg $betterButSlowerForeground -anchor e -relief flat 00485 $table tag config faster -bg $fasterBackground -fg $fasterForeground -anchor e -relief flat 00486 $table tag config softer -bg $softerBackground -fg $softerForeground -anchor e -relief flat 00487 $table tag config harder -bg $harderBackground -fg $harderForeground -anchor e -relief flat 00488 $table tag config worseButFaster -bg $worseButFasterBackground -fg $worseButFasterForeground -anchor e -relief flat 00489 $table tag config worseAndSlower -bg $worseAndSlowerBackground -fg $worseAndSlowerForeground -anchor e -relief flat 00490 $table tag config worse -bg $worseBackground -fg $worseForeground -anchor e -relief flat 00491 $table tag config slower -bg $slowerBackground -fg $slowerForeground -anchor e -relief flat 00492 $table tag config same -bg $sameBackground -fg $sameForeground -anchor e -relief flat 00493 $table tag config weird -bg $weirdBackground -fg $weirdForeground -anchor e -relief flat 00494 00495 $table tag config sel -fg "" -bg "" -relief raised -bd 1 00496 $table tag config active -anchor w -fg black -bg gray -relief sunk -bd 1 00497 $table tag config title -font {Helvetica -12} -bg #a3a3a3 -fg white 00498 $table tag config runner -fg red3 -bg #a3a3a3 00499 $table tag config judge -anchor w -bg "" -fg "" 00500 $table tag raise runner title 00501 00502 $table width 0 15 1 5 00503 00504 # reset scores of selected wordgraphs 00505 _resetDataOf "[_getActiveWordgraphs]" 00506 00507 _computeStatistics 00508 00509 } 00510 00511 ## ---------------------------------------------------------------------------- 00512 ## load 00513 ## ---------------------------------------------------------------------------- 00514 body YadaOneOnOne::load {args} { 00515 00516 set table $itk_component(table) 00517 set rmax [$table cget -rows] 00518 set wordgraphsInTable [$table getCell 0,0 $rmax,0] 00519 #$table configure -rowtagcommand "" 00520 00521 # build the list of all available data 00522 if {[llength $args] == 0} { 00523 set activeWordgraphs [_getActiveWordgraphs] 00524 } else { 00525 set activeWordgraphs $args 00526 } 00527 set allWordgraphs "" 00528 set experiments [_getSelectedExperiments] 00529 if {[llength $experiments] != 2} { 00530 return 00531 } 00532 set experiment1 [lindex $experiments 0] 00533 set experiment2 [lindex $experiments 1] 00534 00535 foreach wordgraph $activeWordgraphs { 00536 if {$_doneWordgraph($wordgraph) == 3} { 00537 continue 00538 } 00539 00540 set file1 [$experiment1 getXmlFileName $wordgraph] 00541 set file2 [$experiment2 getXmlFileName $wordgraph] 00542 if {![file exists $file1]} { 00543 set file1 "" 00544 } 00545 if {![file exists $file2]} { 00546 set file2 "" 00547 } 00548 set allFiles($wordgraph,1) $file1 00549 set allFiles($wordgraph,2) $file2 00550 if {$file1 != "" || $file2 != ""} { 00551 lappend allWordgraphs $wordgraph 00552 } 00553 } 00554 00555 # load all xml files 00556 set noLoadedFiles 0 00557 foreach wordgraph $allWordgraphs { 00558 00559 # did we press the break button 00560 if {$_gotBreak} { 00561 unbreakProcess 00562 print "WARNING: interrupted loading\n" 00563 break 00564 } 00565 00566 # load data for both experiments 00567 foreach i {1 2} { 00568 if {($_doneWordgraph($wordgraph) & $i) == $i} { 00569 continue 00570 } 00571 set file $allFiles($wordgraph,$i) 00572 if {$file == ""} { 00573 set _doneWordgraph($wordgraph) [expr $_doneWordgraph($wordgraph) & ~$i] 00574 continue 00575 } 00576 set _doneWordgraph($wordgraph) [expr $_doneWordgraph($wordgraph) | $i] 00577 00578 # say what we do 00579 print "INFO: loading file `$file'\n" 00580 00581 # analyse the file 00582 set fd [open "|zcat $file" r] 00583 set data [read $fd] 00584 close $fd 00585 if {[catch { 00586 set document [dom parse $data] 00587 _analyseDocument $document [subst \$experiment$i] 00588 } errMsg ]} { 00589 print "ERROR: invalid xml file\n" 00590 print "$errMsg\n$::errorInfo" 00591 } 00592 catch { 00593 $document delete 00594 set document "" 00595 } 00596 00597 incr noLoadedFiles 00598 update 00599 } 00600 } 00601 00602 # draw statistics 00603 $itk_component(judgeBar) draw \ 00604 $_fasterWordgraphs $_betterWordgraphs \ 00605 $_betterAndFasterWordgraphs $_betterButSlowerWordgraphs $_softerWordgraphs \ 00606 $_harderWordgraphs $_sameWordgraphs $_worseButFasterWordgraphs \ 00607 $_worseAndSlowerWordgraphs $_worseWordgraphs $_slowerWordgraphs \ 00608 $_weirdWordgraphs 00609 00610 print "INFO: loaded $noLoadedFiles files\n" 00611 #$table configure -rowtagcommand [code $this _judgeRow] 00612 resortRows 00613 _computeStatistics 00614 .main printStatus "" 00615 $table selection clear all 00616 } 00617 00618 ## ---------------------------------------------------------------------------- 00619 ## save 00620 ## ---------------------------------------------------------------------------- 00621 body YadaOneOnOne::save {{fileName ""}} { 00622 return 00623 00624 if {$fileName == "" } { 00625 set types { 00626 {"Xml logfile" {.xml.gz}} 00627 {"CDG logfile" {.log.gz}} 00628 } 00629 set fileName [tk_getSaveFile -filetypes $types -parent .] 00630 if {$fileName == ""} { 00631 return 00632 } 00633 } 00634 00635 } 00636 00637 ## ---------------------------------------------------------------------------- 00638 ## _computeStatistics 00639 ## ---------------------------------------------------------------------------- 00640 body YadaOneOnOne::_computeStatistics {} { 00641 chain 00642 00643 set table $itk_component(table) 00644 set rmax [$table cget -rows] 00645 set cmax [$table cget -cols] 00646 00647 set _totalWordgraphs 0 00648 set _fasterWordgraphs 0 00649 set _betterWordgraphs 0 00650 set _betterAndFasterWordgraphs 0 00651 set _betterButSlowerWordgraphs 0 00652 set _softerWordgraphs 0 00653 set _harderWordgraphs 0 00654 set _sameWordgraphs 0 00655 set _worseWordgraphs 0 00656 set _worseButFasterWordgraphs 0 00657 set _worseAndSlowerWordgraphs 0 00658 set _slowerWordgraphs 0 00659 set _weirdWordgraphs 0 00660 set _noErrors1 0 00661 set _noErrors2 0 00662 set _noSolutions1 0 00663 set _noSolutions2 0 00664 set _totalSolTime1 0 00665 set _totalSolTime2 0 00666 set _totalSoftTime1 0 00667 set _totalSoftTime2 0 00668 set _score1 0.0 00669 set _score2 0.0 00670 set _totalTime1 0 00671 set _totalTime2 0 00672 set _totalStructRecall1 0 00673 set _totalLexicalRecall1 0 00674 set _totalLabelledRecall1 0 00675 set _totalStructRecall2 0 00676 set _totalLexicalRecall2 0 00677 set _totalLabelledRecall2 0 00678 set totalTries1 0 00679 set totalStructHits1 0 00680 set totalLexicalHits1 0 00681 set totalLabelledHits1 0 00682 set totalTries2 0 00683 set totalStructHits2 0 00684 set totalLexicalHits2 0 00685 set totalLabelledHits2 0 00686 00687 for {set row 1} {$row < $rmax} {incr row} { 00688 00689 set dataRow [$table getCell $row,0 $row,$cmax] 00690 set noValues [lindex $dataRow 1] 00691 if {$noValues == ""} { 00692 continue 00693 } 00694 00695 set wordgraph [lindex $dataRow 0] 00696 set noErrors1 [lindex $dataRow 3] 00697 set time1 [lindex $dataRow 4] 00698 set solutionTime1 [lindex $dataRow 5] 00699 set softTime1 [lindex $dataRow 6] 00700 set noErrors2 [lindex $dataRow 9] 00701 set time2 [lindex $dataRow 10] 00702 set solutionTime2 [lindex $dataRow 11] 00703 set softTime2 [lindex $dataRow 12] 00704 set speedUp [lindex $dataRow 14] 00705 set solSpeedUp [lindex $dataRow 15] 00706 set softSpeedUp [lindex $dataRow 16] 00707 set judge [lindex $dataRow 17] 00708 00709 if {$_doneWordgraph($wordgraph) == 3} { 00710 incr _totalWordgraphs 00711 } 00712 incr _noErrors1 $noErrors1 00713 incr _noErrors2 $noErrors2 00714 incr _totalTime1 $time1 00715 incr _totalTime2 $time2 00716 incr _totalSolTime1 $solutionTime1 00717 incr _totalSoftTime1 $softTime1 00718 incr _totalSolTime2 $solutionTime2 00719 incr _totalSoftTime2 $softTime2 00720 00721 set _score1 [expr $_score1 + $_scoreOf($wordgraph,1)] 00722 if {$_scoreOf($wordgraph,1) > 0.0} { 00723 incr _noSolutions1 00724 } 00725 set _score2 [expr $_score2 + $_scoreOf($wordgraph,2)] 00726 if {$_scoreOf($wordgraph,2) > 0.0} { 00727 incr _noSolutions2 00728 } 00729 00730 incr totalTries1 $_triesOf($wordgraph,1) 00731 incr totalStructHits1 $_structHitsOf($wordgraph,1) 00732 incr totalLexicalHits1 $_lexicalHitsOf($wordgraph,1) 00733 incr totalLabelledHits1 $_labelledHitsOf($wordgraph,1) 00734 incr totalTries2 $_triesOf($wordgraph,2) 00735 incr totalStructHits2 $_structHitsOf($wordgraph,2) 00736 incr totalLexicalHits2 $_lexicalHitsOf($wordgraph,2) 00737 incr totalLabelledHits2 $_labelledHitsOf($wordgraph,2) 00738 00739 if {$judge != ""} { 00740 incr _${judge}Wordgraphs 00741 } 00742 } 00743 00744 if {$totalTries1 > 0} { 00745 set _totalStructRecall1 [expr $totalStructHits1 * 100.0 / $totalTries1 ] 00746 set _totalLexicalRecall1 [expr $totalLexicalHits1 * 100.0 / $totalTries1 ] 00747 set _totalLabelledRecall1 [expr $totalLabelledHits1 * 100.0 / $totalTries1 ] 00748 } 00749 if {$totalTries2 > 0} { 00750 set _totalStructRecall2 [expr $totalStructHits2 * 100.0 / $totalTries2 ] 00751 set _totalLexicalRecall2 [expr $totalLexicalHits2 * 100.0 / $totalTries2 ] 00752 set _totalLabelledRecall2 [expr $totalLabelledHits2 * 100.0 / $totalTries2 ] 00753 } 00754 00755 # show statistics 00756 foreach i {1 2} { 00757 set noSolutions [subst \$_noSolutions${i}] 00758 set totalTime [subst \$_totalTime${i}] 00759 set totalSolTime [subst \$_totalSolTime${i}] 00760 set totalSoftTime [subst \$_totalSoftTime${i}] 00761 set score [subst \$_score${i}] 00762 set noErrors [subst \$_noErrors${i}] 00763 set totalStructRecall [subst \$_totalStructRecall${i}] 00764 set totalLexicalRecall [subst \$_totalLexicalRecall${i}] 00765 set totalLabelledRecall [subst \$_totalLabelledRecall${i}] 00766 00767 $itk_component(totalTime${i}) configure -state normal 00768 $itk_component(totalSolTime${i}) configure -state normal 00769 $itk_component(totalSoftTime${i}) configure -state normal 00770 $itk_component(score${i}) configure -state normal 00771 $itk_component(noErrors${i}) configure -state normal 00772 $itk_component(totalStructRecall${i}) configure -state normal 00773 $itk_component(totalLexicalRecall${i}) configure -state normal 00774 $itk_component(totalLabelledRecall${i}) configure -state normal 00775 00776 $itk_component(totalTime${i}) delete 0 end 00777 $itk_component(totalSolTime${i}) delete 0 end 00778 $itk_component(totalSoftTime${i}) delete 0 end 00779 $itk_component(score${i}) delete 0 end 00780 $itk_component(noErrors${i}) delete 0 end 00781 $itk_component(totalStructRecall${i}) delete 0 end 00782 $itk_component(totalLexicalRecall${i}) delete 0 end 00783 $itk_component(totalLabelledRecall${i}) delete 0 end 00784 00785 $itk_component(score${i}) insert 0 [format "%.4f" $score] 00786 $itk_component(noErrors${i}) insert 0 $noErrors 00787 $itk_component(totalTime${i}) insert 0 "[timeToString $totalTime]" 00788 $itk_component(totalSolTime${i}) insert 0 "[timeToString $totalSolTime]" 00789 $itk_component(totalSoftTime${i}) insert 0 "[timeToString $totalSoftTime]" 00790 $itk_component(totalStructRecall${i}) insert 0 [format "%.4f%%" $totalStructRecall] 00791 $itk_component(totalLexicalRecall${i}) insert 0 [format "%.4f%%" $totalLexicalRecall] 00792 $itk_component(totalLabelledRecall${i}) insert 0 [format "%.4f%%" $totalLabelledRecall] 00793 00794 $itk_component(totalTime${i}) configure -state disabled 00795 $itk_component(totalSolTime${i}) configure -state disabled 00796 $itk_component(totalSoftTime${i}) configure -state disabled 00797 $itk_component(score${i}) configure -state disabled 00798 $itk_component(noErrors${i}) configure -state disabled 00799 $itk_component(totalStructRecall${i}) configure -state disabled 00800 $itk_component(totalLexicalRecall${i}) configure -state disabled 00801 $itk_component(totalLabelledRecall${i}) configure -state disabled 00802 } 00803 00804 # redraw the judge canvas 00805 $itk_component(judgeBar) draw \ 00806 $_fasterWordgraphs $_betterWordgraphs \ 00807 $_betterAndFasterWordgraphs $_betterButSlowerWordgraphs $_softerWordgraphs \ 00808 $_harderWordgraphs $_sameWordgraphs $_worseButFasterWordgraphs \ 00809 $_worseAndSlowerWordgraphs $_worseWordgraphs $_slowerWordgraphs \ 00810 $_weirdWordgraphs 00811 00812 } 00813 00814 ## ---------------------------------------------------------------------------- 00815 ## selectExperiment 00816 ## ---------------------------------------------------------------------------- 00817 body YadaOneOnOne::selectExperiment {experimentNo {experimentName ""}} { 00818 set box $itk_component(experiment${experimentNo}Box) 00819 if {$experimentName == ""} { 00820 set experimentName [$box get] 00821 if {$experimentName == ""} { 00822 set experimentName "<none>" 00823 } 00824 } 00825 00826 set prevExperimentName [subst \$_prevExperimentName${experimentNo}] 00827 if {$prevExperimentName != $experimentName} { 00828 set _prevExperimentName${experimentNo} $experimentName 00829 foreach wordgraph [array names _doneWordgraph] { 00830 unset _doneWordgraph($wordgraph) 00831 } 00832 clear 00833 $box clear entry 00834 $box insert entry 0 "$experimentName" 00835 00836 } 00837 00838 set listOfEntries [[$box component list] get 0 end] 00839 set index [lsearch $listOfEntries $experimentName] 00840 00841 if {$index < 0} { 00842 selectExperiment $experimentNo "<none>" 00843 } else { 00844 $box selection set $index $index 00845 } 00846 } 00847 00848 ## ---------------------------------------------------------------------------- 00849 ## activationHandle 00850 ## ---------------------------------------------------------------------------- 00851 body YadaOneOnOne::activationHandle {} { 00852 chain ;# call YadaRunnableDocument::activationHandle 00853 00854 set experimentNames [.main getActiveExperiments] 00855 00856 foreach i {1 2} { 00857 00858 # get the previous selection 00859 set box $itk_component(experiment${i}Box) 00860 set experimentName [$box get] 00861 00862 # default experiments to choose 00863 if {$experimentName == ""} { 00864 set experimentName "<none>" 00865 } 00866 00867 set listOfEntries [[$box component list] get 0 end] 00868 if {$listOfEntries != $experimentNames} { 00869 $box clear list 00870 eval $box insert list end $experimentNames 00871 $box insert entry 0 "$experimentName" 00872 } 00873 } 00874 } 00875 00876 ## ---------------------------------------------------------------------------- 00877 ## _judgeData 00878 ## ---------------------------------------------------------------------------- 00879 body YadaOneOnOne::_judgeData {measure1a measure1b time1 solutionTime1 softTime1 measure2a measure2b time2 solutionTime2 softTime2} { 00880 00881 set significance [.main getSignificance] 00882 00883 # is there an annotation? if not then 00884 if {$measure1a == 0 && $measure2a == 0} { 00885 # ... use scores 00886 set measure1 $measure1b 00887 set measure2 $measure2b 00888 } else { 00889 # ... otherwise use recall 00890 set measure1 $measure1a 00891 set measure2 $measure2a 00892 } 00893 00894 # compare properties 00895 set measureDiff [expr $measure1 - $measure2 ] 00896 set speedUp [_computeSpeedup $time1 $time2] 00897 set solSpeedUp [_computeSpeedup $solutionTime1 $solutionTime2] 00898 set softSpeedUp [_computeSpeedup $softTime1 $softTime2] 00899 00900 # judge 00901 if {$measureDiff > 1e-5} { 00902 if {$solutionTime2 != 0.0} { ;# does experiment 2 give us anything 00903 if {$speedUp < [expr 1.0 / $significance]} { 00904 set judge "betterButSlower" 00905 } elseif {$speedUp > $significance} { 00906 set judge "betterAndFaster" 00907 } else { 00908 set judge "better" 00909 } 00910 } else { 00911 set judge "better" 00912 } 00913 } elseif {$measureDiff < -1e-5} { 00914 if {$solutionTime1 != 0.0} { ;# does experiment 1 give us anything 00915 if {$speedUp > $significance} { 00916 set judge "worseButFaster" 00917 } elseif {$speedUp < [expr 1.0 / $significance]} { 00918 set judge "worseAndSlower" 00919 } else { 00920 set judge "worse" 00921 } 00922 } else { 00923 set judge "worse" 00924 } 00925 } elseif {$speedUp < [expr 1.0 / $significance]} { 00926 set judge "slower" 00927 } elseif {$speedUp > $significance} { 00928 set judge "faster" 00929 } elseif {$solSpeedUp > $significance} { 00930 set judge "softer" 00931 } elseif {$solSpeedUp < [expr 1.0 / $significance]} { 00932 set judge "harder" 00933 } elseif {$softSpeedUp > $significance} { 00934 set judge "softer" 00935 } elseif {$softSpeedUp < [expr 1.0 / $significance]} { 00936 set judge "harder" 00937 } else { 00938 set judge "same" 00939 } 00940 00941 # weirdness check, this relys on measure1b and measure2b to be scores 00942 # measure a: recall 00943 # measure b: score 00944 if {[.main getWeirdness]} { 00945 if {( 00946 $measure1a == 100.0 && 00947 $measure2a < [expr $measure1a - 1e-10] && 00948 $measure1b <= $measure2b 00949 ) || ( 00950 $measure2a == 100.0 && 00951 $measure1a < [expr $measure2a - 1e-10] && 00952 $measure2b <= $measure1b 00953 )} { 00954 set judge "weird" 00955 } 00956 } else { 00957 if {( 00958 $measure2b != 0.0 && 00959 $measure2a < [expr $measure1a - 1e-10] && 00960 $measure1b <= $measure2b 00961 ) || ( 00962 $measure1b != 0.0 && 00963 $measure1a < [expr $measure2a - 1e-10] && 00964 $measure2b <= $measure1b 00965 )} { 00966 set judge "weird" 00967 } 00968 } 00969 00970 return $judge 00971 } 00972 00973 ## ---------------------------------------------------------------------------- 00974 ## _getSelectedExperiments 00975 ## ---------------------------------------------------------------------------- 00976 body YadaOneOnOne::_getSelectedExperiments {} { 00977 00978 set experiments "" 00979 set experimentName [$itk_component(experiment1Box) get] 00980 if {$experimentName != "" && $experimentName != "<none>"} { 00981 lappend experiments [.main getExperiment $experimentName] 00982 } 00983 00984 set experimentName [$itk_component(experiment2Box) get] 00985 if {$experimentName != "" && $experimentName != "<none>"} { 00986 lappend experiments [.main getExperiment $experimentName] 00987 } 00988 00989 return $experiments 00990 } 00991 00992 ## ---------------------------------------------------------------------------- 00993 ## _getWordgraphs 00994 ## ---------------------------------------------------------------------------- 00995 body YadaOneOnOne::_getWordgraphs {} { 00996 00997 set experiments [_getSelectedExperiments] 00998 if {[llength $experiments] != 2} { 00999 return "" 01000 } 01001 01002 set experiment1 [lindex $experiments 0] 01003 set experiment2 [lindex $experiments 1] 01004 01005 # shortcut for two experiments using the same grammar 01006 if {[$experiment1 cget -grammarName] == [$experiment2 cget -grammarName]} { 01007 return [.main getWordgraphsOfExperiment [$experiment1 cget -name]] 01008 } 01009 01010 # compute intersection of the used wordgraphs 01011 set wordgraphs1 [.main getWordgraphsOfExperiment [$experiment1 cget -name]] 01012 set wordgraphs2 [.main getWordgraphsOfExperiment [$experiment2 cget -name]] 01013 01014 set commonWordgraphs "" 01015 foreach wordgraph $wordgraphs1 { 01016 if {[lsearch $wordgraphs2 $wordgraph] >=0} { 01017 lappend commonWordgraphs $wordgraph 01018 } 01019 } 01020 01021 return $commonWordgraphs 01022 } 01023 01024 ## ---------------------------------------------------------------------------- 01025 ## _getJudge 01026 ## ---------------------------------------------------------------------------- 01027 body YadaOneOnOne::_getJudgeOfRow {row} { 01028 set cmax [$itk_component(table) cget -cols] 01029 return [$itk_component(table) getCell $row,$cmax] 01030 } 01031 01032 ## ---------------------------------------------------------------------------- 01033 ## _getTypeOfColumn 01034 ## ---------------------------------------------------------------------------- 01035 body YadaOneOnOne::_getTypeOfColumn {colNo} { 01036 return $_typeOfColumn($colNo) 01037 } 01038 01039 ## ---------------------------------------------------------------------------- 01040 ## _resetDataOf 01041 ## ---------------------------------------------------------------------------- 01042 body YadaOneOnOne::_resetDataOf {wordgraphs} { 01043 chain $wordgraphs 01044 01045 foreach wordgraph $wordgraphs { 01046 foreach experimentNo {1 2} { 01047 set _scoreOf($wordgraph,$experimentNo) 0.0 01048 set _structHitsOf($wordgraph,$experimentNo) 0 01049 set _lexicalHitsOf($wordgraph,$experimentNo) 0 01050 set _labelledHitsOf($wordgraph,$experimentNo) 0 01051 set _triesOf($wordgraph,$experimentNo) 0 01052 } 01053 } 01054 } 01055 01056 ## ---------------------------------------------------------------------------- 01057 ## step 01058 ## ---------------------------------------------------------------------------- 01059 body YadaOneOnOne::step {{wordgraph ""}} { 01060 01061 if {$wordgraph == ""} { 01062 set wordgraph [lindex [_getActiveWordgraphs] 0] 01063 if {$wordgraph == ""} { 01064 return 0 01065 } 01066 } 01067 01068 # check and load 01069 set experiments [_getSelectedExperiments] 01070 if {[llength $experiments] != 2} { 01071 return 0 01072 } 01073 set experiment1 [lindex $experiments 0] 01074 set experiment2 [lindex $experiments 1] 01075 01076 set file1 [$experiment1 getXmlFileName $wordgraph] 01077 set file2 [$experiment2 getXmlFileName $wordgraph] 01078 01079 set machine1 [.main getMachine [$experiment1 cget -machineName]] 01080 set machine2 [.main getMachine [$experiment2 cget -machineName]] 01081 01082 if {[file exists $file1] || [file exists $file2]} { 01083 load $wordgraph 01084 } 01085 01086 # construct the job 01087 if {![file exists $file1]} { 01088 set job1 [YadaJob ::#auto \ 01089 -wordgraphName $wordgraph \ 01090 -experiment $experiment1 \ 01091 -runner $this \ 01092 -machine $machine1 \ 01093 -consumerCommand [code $this _jobConsumer]] 01094 _registerJob $job1 01095 $machine1 queueJob $job1 01096 } 01097 if {![file exists $file2]} { 01098 set job2 [YadaJob ::#auto \ 01099 -wordgraphName $wordgraph \ 01100 -experiment $experiment2 \ 01101 -runner $this \ 01102 -machine $machine2 \ 01103 -consumerCommand [code $this _jobConsumer]] 01104 _registerJob $job2 01105 $machine2 queueJob $job2 01106 } 01107 01108 # start the job 01109 if {$machine1 != $machine2} { 01110 $machine1 startJob 01111 } 01112 $machine2 startJob 01113 01114 # wait 01115 set _isRunning 1 01116 while {$_isRunning} { 01117 vwait [scope _isRunning] 01118 } 01119 01120 # finish message 01121 if {$_gotBreak} { 01122 printMessage "interrupted job(s)" 01123 unbreakJob 01124 } else { 01125 printMessage "finished job(s)" 01126 } 01127 01128 return 1 01129 } 01130 01131 ## ---------------------------------------------------------------------------- 01132 ## run 01133 ## ---------------------------------------------------------------------------- 01134 body YadaOneOnOne::run {} { 01135 set activeWordgraphs [_getActiveWordgraphs] 01136 01137 # get the current experiments 01138 foreach experiment [_getSelectedExperiments] { 01139 01140 # check and load 01141 .main printStatus "... checking experiment '[$experiment cget -name]'" 01142 $experiment check 01143 load 01144 .main printStatus "" 01145 if {[$experiment cget -isComplete]} { 01146 continue 01147 } 01148 01149 # construct all jobs 01150 set machine [.main getMachine [$experiment cget -machineName]] 01151 foreach wordgraph $activeWordgraphs { 01152 set job [YadaJob ::#auto \ 01153 -wordgraphName $wordgraph \ 01154 -experiment $experiment \ 01155 -runner $this \ 01156 -machine $machine \ 01157 -consumerCommand [code $this _jobConsumer]] 01158 _registerJob $job 01159 01160 # queue jobs of the same wordgraph 01161 lappend jobsOfWordgraph($wordgraph) $job 01162 } 01163 } 01164 01165 foreach wordgraph [lsort -dictionary [array names jobsOfWordgraph]] { 01166 set jobs $jobsOfWordgraph($wordgraph) 01167 foreach job $jobs { 01168 set machine [$job cget -machine] 01169 $machine queueJob $job 01170 set machines($machine) "horst" 01171 } 01172 } 01173 01174 foreach $machine [array names machines] { 01175 $machine startJob 01176 } 01177 01178 # wait 01179 set _isRunning 1 01180 while {$_isRunning} { 01181 vwait [scope _isRunning] 01182 } 01183 01184 # finish message 01185 if {$_gotBreak} { 01186 printMessage "interrupted job(s)" 01187 unbreakJob 01188 } else { 01189 printMessage "finished job(s)" 01190 } 01191 } 01192 01193 ## ---------------------------------------------------------------------------- 01194 ## runall 01195 ## ---------------------------------------------------------------------------- 01196 body YadaOneOnOne::runall {} { 01197 set refExperimentName [$itk_component(experiment1Box) get] 01198 01199 # need a ref experiment to run all 01200 if {$refExperimentName == "" || $refExperimentName == "<none>"} { 01201 printMessage "ERROR: need a reference experiment to run all other experiments" error 01202 return 01203 } 01204 01205 set experimentNames [[$itk_component(experiment2Box) component list] get 0 end] 01206 set refExperiment [.main getExperiment $refExperimentName] 01207 01208 # construct possible jobs 01209 set experiments "" 01210 set refExperimentGrammarName [$refExperiment cget -grammarName] 01211 foreach experimentName $experimentNames { 01212 set experiment [.main getExperiment $experimentName] 01213 if {[$experiment cget -grammarName] != $refExperimentGrammarName || 01214 $experimentName == "<none>" || 01215 $experimentName == "" || 01216 $experimentName == $refExperimentName || 01217 ![$experiment cget -isActive]} { 01218 continue 01219 } 01220 01221 # force experiment checking 01222 .main printStatus "... checking experiment `$experimentName'" 01223 if {[$experiment check]} { 01224 continue ;# is complete 01225 } 01226 01227 # construct jobs 01228 lappend experiments $experiment 01229 set noJobs 0 01230 set grammar [.main getGrammar [$experiment cget -grammarName]] 01231 set machine [.main getMachine [$experiment cget -machineName]] 01232 foreach wordgraph [$grammar getSelection] { 01233 set xmlFile [$experiment getXmlFileName $wordgraph] 01234 # dont recompute existing data 01235 if {[file exists $xmlFile]} { 01236 continue 01237 } 01238 01239 set job [YadaJob ::#auto \ 01240 -wordgraphName $wordgraph \ 01241 -experiment $experiment \ 01242 -runner $this \ 01243 -machine $machine \ 01244 -consumerCommand [code $this _jobConsumer]] 01245 _registerJob $job 01246 incr noJobs 01247 } 01248 01249 print "INFO: $experimentName needs $noJobs jobs\n" 01250 } 01251 01252 # confirm batch of jobs 01253 if {![askRunall]} { 01254 foreach experiment [array names _currentJobs] { 01255 foreach job $_currentJobs($experiment) { 01256 _unregisterJob $job 01257 itcl::delete object $job 01258 update ;# this loop could be time consuming 01259 } 01260 } 01261 return 01262 } 01263 01264 # do it 01265 set _timer [clock seconds] 01266 foreach experiment $experiments { 01267 01268 # select experiment 01269 selectExperiment 2 [$experiment cget -name] 01270 load 01271 if {[$experiment cget -isComplete]} { 01272 foreach job $_currentJobs($experiment) { 01273 _unregisterJob $job 01274 itcl::delete object $job 01275 } 01276 continue 01277 } 01278 01279 # queue jobs of the current experiment 01280 foreach job $_currentJobs($experiment) { 01281 set machine [$job cget -machine] 01282 $machine queueJob $job 01283 } 01284 01285 # start 01286 $machine startJob 01287 01288 # wait 01289 set _isRunning 1 01290 while {$_isRunning} { 01291 vwait [scope _isRunning] 01292 } 01293 01294 # escape 01295 if {$_gotBreak} { 01296 break 01297 } 01298 } 01299 01300 # finish message 01301 if {$_gotBreak} { 01302 printMessage "interrupted job(s)" 01303 unbreakJob 01304 } else { 01305 printMessage "finished job(s)" 01306 } 01307 01308 } 01309 01310 01311 ## ---------------------------------------------------------------------------- 01312 ## _jobConsumer 01313 ## ---------------------------------------------------------------------------- 01314 body YadaOneOnOne::_jobConsumer {job} { 01315 $job setState "consuming" 01316 set wordgraph [$job cget -wordgraphName] 01317 set experiment [$job cget -experiment] 01318 set machine [$job cget -machine] 01319 set experiments [_getSelectedExperiments] 01320 set experiment1 [lindex $experiments 0] 01321 set experiment2 [lindex $experiments 1] 01322 01323 01324 # remove the job from the list of current once 01325 unmarkWordgraph $wordgraph 01326 _unregisterJob $job 01327 $machine stopJob $job 01328 01329 # refresh the statistics 01330 if {$experiment == $experiment1} { 01331 set _doneWordgraph($wordgraph) [expr $_doneWordgraph($wordgraph) | 1] 01332 } elseif {$experiment == $experiment2} { 01333 set _doneWordgraph($wordgraph) [expr $_doneWordgraph($wordgraph) | 2] 01334 } else { 01335 # never reach 01336 error "error consuming foreign experiment '$experiment',\nknown experiments are '$experiment1', '$experiment2'" 01337 } 01338 01339 # analyse the new data 01340 set xmlFile [$experiment getXmlFileName $wordgraph] 01341 print "INFO: loading `$xmlFile'\n" 01342 set fd [open "|zcat $xmlFile" r] 01343 set data [read $fd] 01344 close $fd 01345 01346 if {[catch { 01347 set document [dom parse $data] 01348 _analyseDocument $document $experiment 01349 } errMsg ]} { 01350 print "ERROR: invalid xml file\n" 01351 print "$errMsg\n$::errorInfo" 01352 } 01353 catch { 01354 $document delete 01355 set document "" 01356 } 01357 01358 # start a new job 01359 if {!$_gotBreak} { 01360 if {[$machine startJob]} { 01361 return 01362 } 01363 } 01364 01365 # detect finish 01366 if {$_isRunning} { 01367 if {(![info exists _currentJobs($experiment1)] || 01368 [llength $_currentJobs($experiment1)] == 0) 01369 && 01370 (![info exists _currentJobs($experiment2)] || 01371 [llength $_currentJobs($experiment2)] == 0)} { 01372 set _isRunning 0 ;# signal vwait 01373 } 01374 } 01375 } 01376 01377 ## ---------------------------------------------------------------------------- 01378 ## _analyseDocument 01379 ## ---------------------------------------------------------------------------- 01380 body YadaOneOnOne::_analyseDocument {document experiment} { 01381 01382 # default analysis 01383 YadaRunnableDocument::_analyseDocument $document $experiment 01384 01385 # the wordgraph is needed at least 01386 set wordgraph $_analyseResult(wordgraph) 01387 if {$wordgraph == ""} { 01388 print "ERROR: no information available in this run\n" 01389 return 01390 } 01391 01392 # compute derived data 01393 set row [_getRowOfWordgraph $wordgraph] 01394 set dataRow [$itk_component(table) getCell $row,3 $row,13] 01395 set noErrors1 [lindex $dataRow 0] 01396 set time1 [lindex $dataRow 1] 01397 set solutionTime1 [lindex $dataRow 2] 01398 set softTime1 [lindex $dataRow 3] 01399 set noErrors2 [lindex $dataRow 6] 01400 set time2 [lindex $dataRow 7] 01401 set solutionTime2 [lindex $dataRow 8] 01402 set softTime2 [lindex $dataRow 9] 01403 01404 if {$_triesOf($wordgraph,1) == 0} { 01405 set lexicalRecall1 0 01406 } else { 01407 set lexicalRecall1 [expr $_lexicalHitsOf($wordgraph,1) * 100.0 / $_triesOf($wordgraph,1)] 01408 } 01409 if {$_triesOf($wordgraph,2) == 0} { 01410 set lexicalRecall2 0 01411 } else { 01412 set lexicalRecall2 [expr $_lexicalHitsOf($wordgraph,2) * 100.0 / $_triesOf($wordgraph,2)] 01413 } 01414 01415 # save score and edge data 01416 if {[$itk_component(experiment1Box) get] == [$experiment cget -name]} { 01417 set experimentNo 1 01418 } else { 01419 set experimentNo 2 01420 } 01421 set _scoreOf($wordgraph,$experimentNo) $_analyseResult(score) 01422 set _structHitsOf($wordgraph,$experimentNo) $_analyseResult(structHits) 01423 set _lexicalHitsOf($wordgraph,$experimentNo) $_analyseResult(lexicalHits) 01424 set _labelledHitsOf($wordgraph,$experimentNo) $_analyseResult(labelledHits) 01425 set _triesOf($wordgraph,$experimentNo) $_analyseResult(tries) 01426 01427 # overwrite the given experiment data 01428 set score1 $_scoreOf($wordgraph,1) 01429 set score2 $_scoreOf($wordgraph,2) 01430 set time${experimentNo} $_analyseResult(totalTime) 01431 set solutionTime${experimentNo} $_analyseResult(solutionTime) 01432 set softTime${experimentNo} $_analyseResult(softTime) 01433 set noErrors${experimentNo} [expr $_analyseResult(tries) - $_analyseResult(lexicalHits) ] 01434 set lexicalRecall${experimentNo} [expr $_analyseResult(lexicalHits) * 100.0 / $_analyseResult(tries)] 01435 01436 if {($_doneWordgraph($wordgraph) & 1) == 1} { 01437 if {($_doneWordgraph($wordgraph) & 2) == 2} { 01438 set speedUp [_computeSpeedup $time1 $time2] 01439 set solSpeedUp [_computeSpeedup $solutionTime1 $solutionTime2] 01440 set softSpeedUp [_computeSpeedup $softTime1 $softTime2] 01441 set judge [_judgeData \ 01442 $lexicalRecall1 $score1 $time1 $solutionTime1 $softTime1 \ 01443 $lexicalRecall2 $score2 $time2 $solutionTime2 $softTime2] 01444 if {$judge == "weird"} { 01445 print "ERROR: wordgraph '$wordgraph' is weird: score1=$score1 score2=$score2 lexicalRecall1=$lexicalRecall1 lexicalRecall2=$lexicalRecall2\n" 01446 } 01447 } else { 01448 set noErrors2 0 01449 set time2 0 01450 set solutionTime2 0 01451 set softTime2 0 01452 set lexicalRecall2 0 01453 set speedUp 1.0 01454 set solSpeedUp 1.0 01455 set softSpeedUp 1.0 01456 set judge "" 01457 } 01458 } else { 01459 set noErrors1 0 01460 set time1 0 01461 set solutionTime1 0 01462 set softTime1 0 01463 set lexicalRecall1 0 01464 set speedUp 1.0 01465 set solSpeedUp 1.0 01466 set softSpeedUp 1.0 01467 set judge "" 01468 } 01469 01470 # add the collected data to the table 01471 _insertData $wordgraph \ 01472 $_analyseResult(noValues) \ 01473 [format "%4.3e" $score1] \ 01474 $noErrors1 \ 01475 $time1 \ 01476 $solutionTime1 \ 01477 $softTime1 \ 01478 [format "%3.2f" $lexicalRecall1] \ 01479 [format "%4.3e" $score2] \ 01480 $noErrors2 \ 01481 $time2 \ 01482 $solutionTime2 \ 01483 $softTime2 \ 01484 [format "%3.2f" $lexicalRecall2] \ 01485 [format "%.2g" $speedUp] \ 01486 [format "%.2g" $solSpeedUp] \ 01487 [format "%.2g" $softSpeedUp] \ 01488 $judge 01489 } 01490 01491 ## ---------------------------------------------------------------------------- 01492 ## _getDoneWork 01493 ## ---------------------------------------------------------------------------- 01494 body YadaOneOnOne::_getDoneWork {} { 01495 set result "" 01496 foreach {wordgraph experimentNo} [array names _doneWordgraph] { 01497 if {$_doneWordgraph($wordgraph) == 3} { 01498 lappend result $wordgraph 01499 } 01500 } 01501 01502 return $result 01503 } 01504 01505 ## ---------------------------------------------------------------------------- 01506 ## _getUndoneWork 01507 ## ---------------------------------------------------------------------------- 01508 body YadaOneOnOne::_getUndoneWork {} { 01509 set result "" 01510 01511 foreach wordgraph [array names _doneWordgraph] { 01512 if {$_doneWordgraph($wordgraph) != 3} { 01513 lappend result $wordgraph 01514 } 01515 } 01516 01517 return $result 01518 } 01519 01520 ## ---------------------------------------------------------------------------- 01521 ## _viewLogfile: wrapper to YadaRunnableDocument::_viewLogfile 01522 ## ---------------------------------------------------------------------------- 01523 body YadaOneOnOne::_viewLogfile {} { 01524 chain [_getSelectedExperiments] 01525 } 01526 01527 ## ---------------------------------------------------------------------------- 01528 ## _viewXmlfile: wrapper to YadaRunnableDocument::_viewXmlfile 01529 ## ---------------------------------------------------------------------------- 01530 body YadaOneOnOne::_viewXmlfile {} { 01531 chain [_getSelectedExperiments] 01532 } 01533 01534 ## ---------------------------------------------------------------------------- 01535 ## _traceProcess 01536 ## ---------------------------------------------------------------------------- 01537 body YadaOneOnOne::_traceProcess {} { 01538 # TODO 01539 }

YADA 2.0-alpha (20 Oct 2004)