Index: openacs-4/packages/accounts-finance/README.md =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/README.md,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/README.md 14 Nov 2014 18:20:15 -0000 1.1 @@ -0,0 +1,51 @@ +accounts-finance +================ + +Finance Package provides some tools for forecasting and reporting + +The lastest version of the code is available at site: + http://github.com/xdcpm/accounts-finance + +introduction +------------ + +Finance package provides a library of procedures for use with financial accounting +and related topics, including long-term debt, fixed assets, and forecasting. +It allows tcl procedures to be used in a web-based publishing environment. +It is not tied to vertical web applications, such as OpenACS ecommerce package. + +license +------- +Copyright (c) 2014 Benjamin Brink +po box 20, Marylhurst, OR 97036-0020 usa +email: tekbasse@yahoo.com + +Finance Package is open source and published under the GNU General Public License, +consistent with the OpenACS system license: http://www.gnu.org/licenses/gpl.html +A local copy is available at accounts-finance/www/doc/LICENSE.html + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +features +-------- + +To be listed. + +See account-finance's procedure library via /api-doc/ on +a site running OpenACS with account-finance installed. + + + + + Index: openacs-4/packages/accounts-finance/accounts-finance.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/accounts-finance.info,v diff -u -r1.2 -r1.3 --- openacs-4/packages/accounts-finance/accounts-finance.info 14 Jul 2010 23:13:49 -0000 1.2 +++ openacs-4/packages/accounts-finance/accounts-finance.info 14 Nov 2014 18:20:15 -0000 1.3 @@ -6,21 +6,32 @@ Finances f f + f + t - - Benjamin Brink + + Benjamin Brink OpenACS community Finance package provides limited set of tools for long-term debts, fixed assets, forecasting. - Dekka Corp of Oregon + 2014-11-05 Finance package provides some tools for long-term debts, fixed assets, capital, stock holding, dividends, forecasting and reporting. Integrates with general-ledger etc. - 0 + Gnu GPLv3 + http://xdcpm.org/doc/accounts-finance/LICENSE.html + 1 + Accounts Finance - + + + + - + + + + Index: openacs-4/packages/accounts-finance/lib/pretti-menu1.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-menu1.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-menu1.adp 14 Nov 2014 18:20:15 -0000 1.1 @@ -0,0 +1,3 @@ + +@menu_html;noquote@ + Index: openacs-4/packages/accounts-finance/lib/pretti-menu1.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-menu1.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-menu1.tcl 14 Nov 2014 18:20:15 -0000 1.1 @@ -0,0 +1,114 @@ +# accounts-finance/lib/pretti-menu1.tcl +# requires: mode form_action_url +# optional: instance_id app_name +# table_tid table_flags + +# generic header for static .adp pages +if { ![info exists instance_id] } { + set instance_id [ad_conn package_id] +} +if { ![info exists table_tid] } { + set table_tid "" +} + +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] +if { $read_p } { + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + + set menu_list [list [list $app_name ""]] + + if { $write_p } { + set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + set delete_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege delete] + if { ![info exists form_action_url] } { + set form_action_url app + } + + lappend menu_list [list new mode=n] + } else { + set admin_p 0 + set delete_p 0 + if { ![info exists app_name] } { + set app_name "App" + } + } + + switch -exact -- $mode { + e { + set mode_name "#accounts-finance.edit#" + } + n { + # new....... creates new, blank context (form) + ns_log Notice "accounts-finance/lib/pretti-menu1.tcl.314: mode = new" + set mode_name "#accounts-finance.new#" + } + c { + # process... compute/process and write output as a new table, present post_calc results + ns_log Notice "accounts-finance/lib/pretti-menu1.tcl.342: mode = process" + set mode_name "#accounts-finance.process#" + } + r { + # review.... show processd output + ns_log Notice "accounts-finance/lib/pretti-menu1.tcl.351: mode = review" + } + v { + # view table(s) (standard, html page document/report) + ns_log Notice "accounts-finance/lib/pretti-menu1.tcl.358: mode = $mode ie. view table" + set mode_name "#accounts-finance.view#" + if { $table_tid ne "" && [qf_is_natural_number $table_tid] && $write_p } { + lappend menu_list [list edit "table_tid=${table_tid}&mode=e"] + set menu_e_p 1 + } else { + set menu_e_p 0 + } + if { $table_tid ne "" && !$menu_e_p && $write_p } { + + lappend menu_list [list edit "table_tid=${table_tid}&mode=e"] + } + # if table is a scenario (meets minimum process requirements), add a process button to menu: + if { [qf_is_natural_number $table_tid] && [info exists table_flags] && $table_flags eq "p1" } { + lappend menu_list [list process "table_tid=${table_tid}&mode=c"] + } + } + default { + # default includes v,p + # present...... presents a list of contexts/tables to choose from + ns_log Notice "accounts-finance/lib/pretti-menu1.tcl.392: mode = $mode ie. default" + } + } + # end of switches + + set menu_html "" + + set form_id [qf_form action $form_action_url method post id 20140417 hash_check 1] + foreach item_list $menu_list { + set label [lindex $item_list 0] + set url [lindex $item_list 1] + set url_list [split $url "&="] + set name1 "" + set name2 "" + foreach {val1 val2} $url_list { + # buttons reverse the use of name and value for mode and next_mode + if { $val1 eq "mode" } { + set value "#accounts-finance.${label}#" + set name1 $val2 + } elseif { $val1 eq "next_mode" } { + set value "#accounts-finance.${label}#" + set name2 $val2 + } else { + set form_input_arr($val1) $val2 + } + } + if { $name1 ne "" } { + set name "z${name1}${name2}" + qf_input form_id $form_id type submit value $value name $name class btn + } + # append menu_html "${label} " + } + foreach {name value} [array get form_input_arr] { + qf_input form_id $form_id type hidden value $value name $name label "" + } + qf_close form_id $form_id + set menu_html [qf_read form_id $form_id] +} Index: openacs-4/packages/accounts-finance/lib/pretti-menu2.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-menu2.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-menu2.adp 14 Nov 2014 18:20:15 -0000 1.1 @@ -0,0 +1,7 @@ + +@menu_html;noquote@ + + +

#accounts-finance.active_processes#

+@jobs_html;noquote@ +
Index: openacs-4/packages/accounts-finance/lib/pretti-menu2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-menu2.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-menu2.tcl 14 Nov 2014 18:20:15 -0000 1.1 @@ -0,0 +1,253 @@ +# based on +# accounts-finance/lib/pretti-menu2.tcl +# requires: mode form_action_url +# optional: instance_id app_name +# table_tid table_flags + +# generic header for static .adp pages +if { ![info exists instance_id] } { + set instance_id [ad_conn package_id] +} +if { ![info exists table_flags] } { + set table_tid "" + set table_flags "" + +} + +if { ![info exists trashed_p] } { + set trashed_p 0 +} + +if { ![info exists user_created_p] } { + set user_created_p 0 +} + +if { ![info exists app_name] } { + set app_name "App" +} + +if { ![info exists read_p] || ![info exists write_p] || ![info exists admin_p] || ![info exists delete_p] } { + set user_id [ad_conn user_id] + set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] + if { $read_p } { + set create_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege create] + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + if { $write_p } { + set delete_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege delete] + if { $delete_p } { + set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + } else { + set admin_p 0 + } + } else { + set admin_p 0 + set delete_p 0 + } + } else { + set create_p 0 + set write_p 0 + set admin_p 0 + set delete_p 0 + } +} + +set menu_html "" +set menu_list [list [list $app_name ""]] + +if { $write_p || ( $user_created_p && $create_p ) } { + #set select_label "#accounts-finance.select#" + #set untrash_label "#accounts-finance.untrash#" + #set trash_label "#accounts-finance.trash#" + #set delete_label "#accounts-finance.delete#" + #set standardize_label "#accounts-finance.standardize#" + #set sort_by_Y_ascending_label "#accounts-finance.sort_by_Y_ascending#" + if { ![info exists form_action_url] } { + set form_action_url app + } + if { $write_p || $create_p } { + lappend menu_list [list new mode=n] + } + switch -exact -- $mode { + e { + set mode_name "#accounts-finance.edit#" + } + n { + # new....... creates new, blank context (form) + ns_log Notice "accounts-finance/lib/pretti-menu2.tcl.314: mode = new" + set mode_name "#accounts-finance.new#" + } + c { + # process... compute/process and write output as a new table, present post_calc results + ns_log Notice "accounts-finance/lib/pretti-menu2.tcl.342: mode = process" + set mode_name "#accounts-finance.process#" + } + r { + # review.... show processd output + ns_log Notice "accounts-finance/lib/pretti-menu2.tcl.351: mode = review" + } + v { + # view table(s) (standard, html page document/report) + ns_log Notice "accounts-finance/lib/pretti-menu2.tcl.358: mode = $mode ie. view table" + set mode_name "#accounts-finance.view#" + set tid_is_num_p [qf_is_natural_number $table_tid] + # no actions against a trashed item + if { !$trashed_p } { + + # edit button + if { $tid_is_num_p && ( $write_p || $user_created_p ) } { + lappend menu_list [list "edit" "table_tid=${table_tid}&mode=e"] + } + # if table is a scenario (meets minimum process requirements), add a process button to menu: + if { $tid_is_num_p && [info exists table_flags] && $table_flags eq "p1" && $write_p } { + lappend menu_list [list "process" "table_tid=${table_tid}&mode=c"] + } + # split button + if { $tid_is_num_p && [info exists table_flags] && ( $table_flags eq "p2" || $table_flags eq "p3" ) && ( $write_p || $user_created_p ) } { + # add a multiselect button with choice of table column_names + # delay creating the multi-select until the button is made + lappend menu_list [list "split" "table_tid=${table_tid}&mode=s"] + } + # standardize (sort y) button + if { $tid_is_num_p && [info exists table_flags] && $table_flags eq "dc" && ( $write_p || $user_created_p ) } { + # sorts column y in ascending order + # delay creating the multi-select until the button is made + lappend menu_list [list "sort_by_Y_ascending" "table_tid=${table_tid}&mode=y"] + } + + } + + if { ( $write_p || $user_created_p ) } { + if { $trashed_p || ( [info exists trash_folder_p] && $trash_folder_p ) } { + #append active_link " \[${untrash_label}\]" + #qf_input type submit value $untrash_label name "zt" class btn + lappend menu_list [list "untrash" "table_tid=${table_tid}&mode=t"] + if { $admin_p } { + lappend menu_list [list "delete" "table_tid=${table_tid}&mode=d"] + } + } else { + #append active_link " \[${trash_label}\]" + #qf_input type submit value $trash_label name "zt" class btn + lappend menu_list [list "trash" "table_tid=${table_tid}&mode=t"] + } + } + } + default { + if { ![info exists user_id] } { + set user_id [ad_conn user_id] + } + # Update user regarding any scheduled jobs + set jobs_html "" + set jobs_lists [acc_fin::schedule_list $user_id $instance_id] + if { [llength $jobs_lists ] > 0 } { + #lists includes: id,proc_name,proc_args,user_id,instance_id,priority,order_time,started_time,completed_time,process_seconds. + # sort by priority + set jobs_sorted_lists [lsort -real -index 5 -increasing $jobs_lists] + set display_jobs_lists [list ] + set title_jobs_list [list "#accounts-finance.ID#" "#accounts-finance.proc_name#" "#accounts-finance.priority#" "#accounts-finance.order_time#" "#accounts-finance.started_time#"] + lappend display_jobs_lists $title_jobs_list + set priority 0 + foreach job_list $jobs_sorted_lists { + set new_job_list [lrange $job_list 0 1] + lappend new_job_list $priority + lappend new_job_list [lindex $job_list 6] + lappend new_job_list [lindex $job_list 7] + lappend display_jobs_lists $new_job_list + incr priority + } + set table_tag_atts_list [list border 1 celpadding 3 cellspacing 0] + set jobs_html [qss_list_of_lists_to_html_table $display_jobs_lists $table_tag_atts_list] + } + # default includes v,p + # present...... presents a list of contexts/tables to choose from + ns_log Notice "accounts-finance/lib/pretti-menu2.tcl.392: mode = $mode ie. default" + if { $write_p } { + if { $trashed_p || ( [info exists trash_folder_p] && $trash_folder_p ) } { + #append active_link " \[${untrash_label}\]" + #qf_input type submit value $untrash_label name "zt" class btn + lappend menu_list [list "untrash" "table_tid=${table_tid}&mode=t"] + if { $delete_p || $admin_p } { + lappend menu_list [list "delete" "table_tid=${table_tid}&mode=d"] + } + } else { + lappend menu_list [list "trash" "table_tid=${table_tid}&mode=t"] + } + } + } + } + # end of switches + + + set form_id [qf_form action $form_action_url method post id 20140417 hash_check 1] + foreach item_list $menu_list { + set label [lindex $item_list 0] + set url [lindex $item_list 1] + set url_list [split $url "&="] + set name1 "" + set name2 "" + foreach {val1 val2} $url_list { + # buttons reverse the use of name and value for mode and next_mode + if { $val1 eq "mode" } { + set value "#accounts-finance.${label}#" + set name1 $val2 + } elseif { $val1 eq "next_mode" } { + set value "#accounts-finance.${label}#" + set name2 $val2 + } else { + set form_input_arr($val1) $val2 + } + } + if { $name1 ne "" } { + set name "z${name1}${name2}" + + if { $name1 eq "s" } { + # add a multiselect per "split" menu item + set table_lol [qss_table_read $table_tid $instance_id] + set column_list [lindex $table_lol 0] + set req_name_list [acc_fin::pretti_columns_list $table_flags 0] + # remove required column_names, because each of those lines should be unique.. + set special_names_list [list name description label] + foreach req_name $req_name_list { + set req_idx [lsearch -exact $column_list $req_name] + set special_idx [lsearch -exact $special_names_list $req_name] + if { $req_idx > -1 && $special_idx == -1 } { + # remove name + set column_list [lreplace $column_list $req_idx $req_idx] + } + } + if { [llength $column_list] > 0 } { + # create list for qf_choice + set col_qf_list [list ] + foreach col_name $column_list { + lappend col_qf_list [list label $col_name value $col_name] + } + qf_append html "   (" + qf_input form_id $form_id type submit value $value name $name class btn + qf_append html " Δ" + qf_choice form_id $form_id type select name column_name value $col_qf_list + qf_append html ")   " + } + } else { + qf_input form_id $form_id type submit value $value name $name class btn + if { $name1 eq "n" && $mode eq "p" } { + qf_append html "   (DC " + qf_input form_id $form_id type input value "" name table_name label "Name" title "new distribution curve table name" size 6 + qf_input form_id $form_id type input value "" name minimum label "O" title "optimistic" size 3 + qf_input form_id $form_id type input value "" name median label "M" title "most likely" size 3 + qf_input form_id $form_id type input value "" name maximum label "P" title "pessimistic" size 3 + qf_input form_id $form_id type input value "" name count label "N" title "number of points" size 2 + qf_append html ")   " + } + } + } + # append menu_html "${label} " + } + foreach {name value} [array get form_input_arr] { + qf_input form_id $form_id type hidden value $value name $name label "" + } + if { [info exists trash_folder_p] } { + qf_input form_id $form_id type hidden value $trash_folder_p name trash_folder_p label "" + } + # don't close the form, because another template may add input tags. + #qf_close form_id $form_id + set menu_html [qf_read form_id $form_id] +} Index: openacs-4/packages/accounts-finance/lib/pretti-one-view.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-one-view.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-one-view.adp 14 Nov 2014 18:20:15 -0000 1.1 @@ -0,0 +1,30 @@ + +

@table_title@

+ +
+

PIE chart

+ @table_title@ +
+
+ +
+

Cobbler chart

+ @table_title@ +
+
+
name: @table_name@
+    tid: @table_tid@
+  
+ + @table_html;noquote@ + +

+ @table_comments;noquote@ +

+ + +

Legend

+ +
+ +
Index: openacs-4/packages/accounts-finance/lib/pretti-one-view.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-one-view.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-one-view.tcl 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,45 @@ +# requires instance_id table_tid +# optional user_id + +#set package_id [ad_conn package_id] +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] + +if { [qf_is_natural_number $table_tid] } { + set table_stats_list [qss_table_stats $table_tid] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + set table_name [lindex $table_stats_list 0] + set table_title [lindex $table_stats_list 1] + set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + # set table_html "

${table_title} (${table_name})

\n" + set table_lists [qss_table_read $table_tid] + set table_text [qss_lists_to_text $table_lists] + set table_tag_atts_list [list border 1 cellpadding 3 cellspacing 0] + if { $table_flags eq "p4" } { + set table_html [acc_fin::pretti_table_to_html $table_lists $table_comments] + } else { + if { $table_flags eq "dc" } { + # pie chart + set pie_filename [acc_fin::pretti_pie_filename $table_id] + set pie_html [acc_fin::pretti_html_view $pie_filename] + # cobbler chart + set cob_filename [acc_fin::pretti_cobbler_filename $table_id] + set cob_html [acc_fin::cobbler_html_view $cob_filename] + + } + set table_html [qss_list_of_lists_to_html_table $table_lists $table_tag_atts_list] + # append table_html "

${table_comments}

" + set table_log_messages_list [acc_fin::pretti_log_read $table_tid 3 $user_id $instance_id] + if { [llength $table_log_messages_list] > 0 } { + set message_html "

Most Recent Activity Log

" + append table_comments $message_html + } + } +} Index: openacs-4/packages/accounts-finance/lib/pretti-one-view3.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-one-view3.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-one-view3.adp 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,35 @@ + +

@table_title@

+ + +
+

Pie chart

+ pie chart view +
+
+ + +
+

Cobbler chart

+ cobbler chart view +
+
+ +
name: @table_name@
+    tid: @table_tid@
+  
+ + @table_html;noquote@ + +

+ @table_comments;noquote@ +

+ + @log_html;noquote@ + + +

Legend

+ +
+ +
Index: openacs-4/packages/accounts-finance/lib/pretti-one-view3.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-one-view3.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-one-view3.tcl 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,48 @@ +# accounts-finance/lib/pretti-one-view2.tcl + +# requires instance_id table_tid +# optional user_id +# This is a variation of accounts-finance/lib/pretti-one-view.tcl +# Does not depend on graphicsmagick + +#set package_id [ad_conn package_id] +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] +set log_html "" +if { [qf_is_natural_number $table_tid] } { + set table_stats_list [qss_table_stats $table_tid] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + set table_name [lindex $table_stats_list 0] + set table_title [lindex $table_stats_list 1] + set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + # set table_html "

${table_title} (${table_name})

\n" + set table_lists [qss_table_read $table_tid] + set table_text [qss_lists_to_text $table_lists] + set table_tag_atts_list [list border 1 cellpadding 3 cellspacing 0] + if { $table_flags eq "p4" } { + set table_html [acc_fin::pretti_table_to_html $table_lists $table_comments] + } else { + if { $table_flags eq "dc" } { + + # cobbler chart + set cob_filename [acc_fin::pretti_cobbler_filename $table_tid] + set cob_html [acc_fin::cobbler_html_view $cob_filename] + set pie_filename [acc_fin::pretti_pie_filename $table_tid] + set pie_html [acc_fin::pie_html_view $pie_filename] + } + set table_html [qss_list_of_lists_to_html_table $table_lists $table_tag_atts_list] + # append table_html "

${table_comments}

" + set table_log_messages_list [acc_fin::pretti_log_read $table_tid 3 $user_id $instance_id] + if { [llength $table_log_messages_list] > 0 } { + set message_html "

Most Recent Activity Log

" + set log_html $message_html + } + } +} Index: openacs-4/packages/accounts-finance/lib/pretti-p4-legend.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-p4-legend.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-p4-legend.adp 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1 @@ +@legend_html;noquote@ Index: openacs-4/packages/accounts-finance/lib/pretti-p4-legend.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-p4-legend.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-p4-legend.tcl 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,66 @@ +set legend_html "" + + set on_cp_list [list 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1] + set on_sig_list [list 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0] +set popularity_list [list 0 8 7 6 5 4 3 2 1 8 7 6 5 4 3 2 1 0] +set max_act_count_per_track [f::lmax $popularity_list ] +set cols [llength $on_cp_list] +#set color_cp_mask_idx 3 +#set color_sig_mask_idx 5 + +# .. +set legend_color0_list [list ] +set legend_color1_list [list ] +set legend_grey0_list [list ] +set legend_grey1_list [list ] + +for {set odd_row_p 1} {$odd_row_p > -1} {incr odd_row_p -1} { + set param_list [list ] + for {set i 0} {$i < $cols} {incr i} { + set on_cp_p [lindex $on_cp_list $i] + set on_a_sig_path_p [lindex $on_sig_list $i] + set popularity [lindex $popularity_list $i] + set colorhex [acc_fin::pretti_color_chooser $on_cp_p $on_a_sig_path_p $odd_row_p $popularity $max_act_count_per_track 100 0 ] + set cell $colorhex + set popularity_pct [expr { int( 1000. * $popularity / $max_act_count_per_track ) / 10. } ] + switch -exact -- $on_cp_p { + -1 { + lappend param_list " inactive " + } + 0 { + lappend param_list "sig:${on_a_sig_path_p} p%${popularity_pct}" + } + 1 { + lappend param_list " cp " + } + } + lappend legend_color${odd_row_p}_list $colorhex + if { [info exists grey($colorhex) ] } { + lappend legend_grey${odd_row_p}_list $grey($colorhex) + } else { + set grey($colorhex) [acc_fin::gray_from_color $colorhex] + lappend legend_grey${odd_row_p}_list $grey($colorhex) + } + } + lappend legend_content_list $param_list +} + +set legend_table_list [list $legend_color1_list $legend_color0_list $legend_grey1_list $legend_grey0_list ] + +set css_list [list] +foreach legend_row_list $legend_table_list { + set css_row_list [list ] + foreach color $legend_row_list { + set css "background-color: #$color;" + set greycol [acc_fin::gray_from_color $color] + if { [string range $greycol 0 0] < 6 } { + append css " color: #ffffff;" + } + set attr_list [list style $css] + lappend css_row_list $attr_list + } + lappend css_list $css_row_list +} +lappend legend_content_list [lindex $legend_content_list 0] [lindex $legend_content_list 1] +#set legend_html [qss_list_of_lists_to_html_table $legend_table_list [list style "border-style: solid; border-width: 1px; border-color: #999999;"] $css_list] +set legend_html [qss_list_of_lists_to_html_table $legend_content_list [list style "border-style: solid; border-width: 1px; border-color: #999999;"] $css_list] Index: openacs-4/packages/accounts-finance/lib/pretti-view.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-view.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-view.adp 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,13 @@ + + +

#accounts-finance.tables#

+@table_stats_html;noquote@ + +
+ + + +

#accounts-finance.trashed# #accounts-finance.tables#

+@table_trashed_html;noquote@ + +
Index: openacs-4/packages/accounts-finance/lib/pretti-view.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-view.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-view.tcl 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,145 @@ +# accounts-finance/lib/pretti-view.tcl +# requires: instance_id form_action_attr + +if { [info exists app_url] } { + set form_action_attr "app" +} + +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] + +# presents a list of contexts/tables to choose from + +if { $read_p } { + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + if { $write_p } { + set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + set delete_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege delete] + } else { + set admin_p 0 + set delete_p 0 + } + # show tables + # sort by template_id, columns, and table_type (flags) + + set table_ids_list [qss_tables $instance_id] + set table_stats_lists [list ] + set table_trashed_lists [list ] + set cell_formating_list [list ] + set tables_stats_lists [list ] + + # get the entire list, to sort it before processing + foreach table_id $table_ids_list { + set stats_mod_list [list $table_id] + set stats_orig_list [qss_table_stats $table_id] + foreach stat $stats_orig_list { + lappend stats_mod_list $stat + } + # table_id, name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + lappend tables_stats_lists $stats_mod_list + } + + set tables_stats_lists [lsort -index 6 -real $tables_stats_lists] + set select_label "#accounts-finance.select#" + set untrash_label "#accounts-finance.untrash#" + set trash_label "#accounts-finance.trash#" + set delete_label "#accounts-finance.delete#" + set table_titles_list [list "#accounts-finance.ID#" "#accounts-finance.Name#" "#accounts-finance.title#" "#accounts-finance.actions#" "#accounts-finance.comments#" "#accounts-finance.cells#" "#accounts-finance.rows#" "#accounts-finance.columns#" "#accounts-finance.type#" "#accounts-finance.last_modified#"] + array set table_types_list [list "p1" "#accounts-finance.scenario#" \ + "p2" "#accounts-finance.activity#" \ + "p3" "#accounts-finance.task#" \ + "p4" "#accounts-finance.PRETTI_rows#" \ + "p5" "#accounts-finance.PRETTI_cells#" ] + # table_id, name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + + foreach stats_orig_list $tables_stats_lists { + set stats_list [lrange $stats_orig_list 0 5] + set table_id [lindex $stats_list 0] + set name [lindex $stats_list 1] + set title [lindex $stats_list 2] + set table_template_id [lindex $stats_orig_list 6] + set table_flags [lindex $stats_orig_list 7] + set trashed_p [lindex $stats_orig_list 8] + set last_modified [lindex $stats_orig_list 10] + if { $last_modified ne "" } { + set last_modified [lc_time_fmt $last_modified "%x %X"] + set last_modified [lc_time_system_to_conn $last_modified ] + } + set table_user_id [lindex $stats_orig_list 12] + # adding average col. length + set denominator [expr { [lindex $stats_list 5] } ] + if { $denominator > 0 } { + set col_length [expr { [lindex $stats_list 4] / ( [lindex $stats_list 5] * 1. ) } ] + } else { + set col_length 0. + } + if { [qss_tid_from_name $name $instance_id $user_id] eq $table_id } { + # create a link out of name + set name_link "${name}" + set stats_list [lreplace $stats_list 1 1 $name_link] + } else { + set tid_link "${table_id}" + set stats_list [lreplace $stats_list 0 0 $tid_link] + # make a link out of table_id + } + lappend stats_list $col_length + + # convert table row for use with html + # change name to an active link + # set table_ref_name table_tid + + # each $active_link becomes a separate form.. + if { $write_p } { + + set form_id [qf_form action $form_action_attr method post id 20140420-[random] hash_check 1] + + ## if using name_link, comment out this next line: + qf_input type submit value $select_label name "zv" class btn + + qf_input type hidden value $table_id name table_tid + if { ( $admin_p || $table_user_id == $user_id ) && $trashed_p == 1 } { + #append active_link " \[${untrash_label}\]" + qf_input type submit value $untrash_label name "zt" class btn + } elseif { $table_user_id == $user_id || $admin_p } { + #append active_link " \[${trash_label}\]" + qf_input type submit value $trash_label name "zt" class btn + } + if { $delete_p && $trashed_p == 1 } { + #append active_link " \[${delete_label}\]" + qf_input type submit value $delete_label name "zd" class btn + } + qf_close form_id $form_id + set active_link [qf_read form_id $form_id] + #set stats_list [lreplace $stats_list 1 1 $name_link] + set stats_list [linsert $stats_list 3 $active_link] + } + + lappend stats_list $table_flags $last_modified + if { $trashed_p == 1 } { + lappend table_trashed_lists $stats_list + } else { + lappend table_stats_lists $stats_list + } + + } + + # sort for now. Later, just get table_tables with same template_id + set table_stats_sorted_lists $table_stats_lists + set table_stats_sorted_lists [linsert $table_stats_sorted_lists 0 $table_titles_list ] + set table_tag_atts_list [list border 1 cellspacing 0 cellpadding 3] + set table_stats_html [qss_list_of_lists_to_html_table $table_stats_sorted_lists $table_tag_atts_list $cell_formating_list] + + + # trashed + if { [llength $table_trashed_lists] > 0 && $write_p } { + set table_trashed_sorted_lists $table_trashed_lists + set table_trashed_sorted_lists [linsert $table_trashed_sorted_lists 0 $table_titles_list ] + set table_tag_atts_list [list border 1 cellspacing 0 cellpadding 3] + + #set table_trashed_html "

#accounts-finance.trashed# #accounts-finance.tables#

\n" + set table_trashed_html [qss_list_of_lists_to_html_table $table_trashed_sorted_lists $table_tag_atts_list $cell_formating_list] + # append table_stats_html $table_trashed_html + } + + +} Index: openacs-4/packages/accounts-finance/lib/pretti-view2.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-view2.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-view2.adp 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,13 @@ + + +

#accounts-finance.tables#

+@table_stats_html;noquote@ + +
+ + + +

#accounts-finance.trashed# #accounts-finance.tables#

+@table_trashed_html;noquote@ + +
Index: openacs-4/packages/accounts-finance/lib/pretti-view2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/lib/pretti-view2.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/lib/pretti-view2.tcl 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,167 @@ +# accounts-finance/lib/pretti-view.tcl +# requires: instance_id form_action_attr + +if { ![info exists app_url] } { + set form_action_attr "app" +} +if { ![info exists trash_folder_p] } { + set trash_folder_p 0 +} + +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] + +# presents a list of contexts/tables to choose from + +if { $read_p } { + set create_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege create] + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + if { $write_p } { + set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + set delete_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege delete] + } else { + set admin_p 0 + set delete_p 0 + } + # show tables + # sort by template_id, columns, and table_type (flags) + + set table_ids_list [qss_tables $instance_id] + set table_stats_lists [list ] + set table_trashed_lists [list ] + set cell_formating_list [list ] + set tables_stats_lists [list ] + + # get the entire list, to sort it before processing + foreach table_id $table_ids_list { + set stats_mod_list [list $table_id] + set stats_orig_list [qss_table_stats $table_id] + foreach stat $stats_orig_list { + lappend stats_mod_list $stat + } + # table_id, name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + lappend tables_stats_lists $stats_mod_list + } + + set tables_stats_lists [lsort -index 6 -real $tables_stats_lists] + set select_label "#accounts-finance.select#" + set untrash_label "#accounts-finance.untrash#" + set trash_label "#accounts-finance.trash#" + set delete_label "#accounts-finance.delete#" + set table_titles_list [list "#accounts-finance.ID#" "#accounts-finance.Name#" "#accounts-finance.title#" "#accounts-finance.actions#" "#accounts-finance.comments#" "#accounts-finance.cells#" "#accounts-finance.rows#" "#accounts-finance.columns#" "#accounts-finance.type#" "#accounts-finance.last_modified#"] + array set table_types_list [list "p1" "#accounts-finance.scenario#" \ + "p2" "#accounts-finance.activity#" \ + "p3" "#accounts-finance.task#" \ + "p4" "#accounts-finance.PRETTI_rows#" \ + "p5" "#accounts-finance.PRETTI_cells#" ] + # table_id, name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + set tid_i 0 + foreach stats_orig_list $tables_stats_lists { + set stats_list [lrange $stats_orig_list 0 5] + set table_id [lindex $stats_list 0] + set name [lindex $stats_list 1] + set title [lindex $stats_list 2] + set table_template_id [lindex $stats_orig_list 6] + set table_flags [lindex $stats_orig_list 7] + set trashed_p [lindex $stats_orig_list 8] + set last_modified [lindex $stats_orig_list 10] + if { $last_modified ne "" } { + set last_modified [lc_time_fmt $last_modified "%x %X"] + set last_modified [lc_time_system_to_conn $last_modified ] + } + set table_user_id [lindex $stats_orig_list 12] + # adding average col. length + set denominator [expr { [lindex $stats_list 5] } ] + if { $denominator > 0 } { + set col_length [expr { [lindex $stats_list 4] / ( [lindex $stats_list 5] * 1. ) } ] + } else { + set col_length 0. + } + if { [qss_tid_from_name $name $instance_id $user_id] eq $table_id } { + # create a link out of name + set name_link "${name}" + set stats_list [lreplace $stats_list 1 1 $name_link] + } else { + set tid_link "${table_id}" + set stats_list [lreplace $stats_list 0 0 $tid_link] + # make a link out of table_id + } + lappend stats_list $col_length + + # convert table row for use with html + # change name to an active link + # set table_ref_name table_tid + + # each $active_link becomes a separate form.. + if { $write_p || ( $table_user_id == $user_id && $create_p ) } { + # by using accounts-finance/lib/pretti-menu2 to create form, each row doesn't need a separate form. + # Instead, the buttons are added to pretti-menu2 + + # To retain ability for a user to trash their own creations, user based versions are trashed under view-one + + #set form_id [qf_form action $form_action_attr method post id 20140420-[random] hash_check 1] + + ## if using name_link, comment out this next line: + #qf_input type submit value $select_label name "zv" class btn + + set active_link [qf_input type checkbox value $table_id name tid_${tid_i}] + incr tid_i +# if { ( $admin_p || $table_user_id == $user_id ) && $trashed_p == 1 } { + #append active_link " \[${untrash_label}\]" +# qf_input type submit value $untrash_label name "zt" class btn +# } elseif { $table_user_id == $user_id || $admin_p } { + #append active_link " \[${trash_label}\]" +# qf_input type submit value $trash_label name "zt" class btn +# } +# if { $delete_p && $trashed_p == 1 } { + #append active_link " \[${delete_label}\]" +# qf_input type submit value $delete_label name "zd" class btn +# } +# qf_close form_id $form_id +# set active_link [qf_read form_id $form_id] + + } else { + set active_link "" + } + #set stats_list [lreplace $stats_list 1 1 $name_link] + set stats_list [linsert $stats_list 3 $active_link] + + lappend stats_list $table_flags $last_modified + if { $trashed_p == 1 } { + lappend table_trashed_lists $stats_list + } else { + lappend table_stats_lists $stats_list + } + + } + + set table_trashed_len [llength $table_trashed_lists] + + if { !$trash_folder_p } { + # sort for now. Later, just get table_tables with same template_id? + set table_stats_sorted_lists $table_stats_lists + set table_stats_sorted_lists [linsert $table_stats_sorted_lists 0 $table_titles_list ] + + if { $table_trashed_len > 0 && ( $create_p || $write_p ) } { + #add the trash folder link + set trash_row [list "" "${trash_label}" "" "" "" "" "" "" "" [lc_time_system_to_conn [clock format [clock seconds] -format "%Y-%m-%d %r"]]] + lappend table_stats_sorted_lists $trash_row + } + + set table_tag_atts_list [list border 1 cellspacing 0 cellpadding 3] + set table_stats_html [qss_list_of_lists_to_html_table $table_stats_sorted_lists $table_tag_atts_list $cell_formating_list] + } + + # trashed + if { $trash_folder_p && $table_trashed_len && ( $create_p || $write_p ) } { + set table_trashed_sorted_lists $table_trashed_lists + set table_trashed_sorted_lists [linsert $table_trashed_sorted_lists 0 $table_titles_list ] + set table_tag_atts_list [list border 1 cellspacing 0 cellpadding 3] + + #set table_trashed_html "

#accounts-finance.trashed# #accounts-finance.tables#

\n" + set table_trashed_html [qss_list_of_lists_to_html_table $table_trashed_sorted_lists $table_tag_atts_list $cell_formating_list] + # append table_stats_html $table_trashed_html + } + + +} Index: openacs-4/packages/accounts-finance/tcl/accounts-finance-scheduled-init.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/accounts-finance-scheduled-init.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/accounts-finance-scheduled-init.tcl 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,16 @@ +# accounts-finance/tcl/accounts-finance-scheduled-init.tcl + +# Schedule recurring procedures + +# @creation-date 2014-09-12 + + +# Scheduled proc scheduling: +# Nightly pi time + 1 = 4:14am + +#ns_schedule_daily -thread 4 14 acc_fin::proc... + +# once every 1/3 minute. +set frequent_base [expr 13 * 1] + +ad_schedule_proc -thread t $frequent_base acc_fin::schedule_do Index: openacs-4/packages/accounts-finance/tcl/accounts-finance-scheduled-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/accounts-finance-scheduled-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/accounts-finance-scheduled-procs.tcl 14 Nov 2014 18:20:16 -0000 1.1 @@ -0,0 +1,288 @@ +# accounts-finance/tcl/accounts-finance-scheduled-procs.tcl +ad_library { + + Scheduled procedures for accounts-finance package. + @creation-date 2014-09-12 + +} + +namespace eval acc_fin {} + +#TABLE qaf_sched_proc_stack +# id integer primary key, +# -- assumes procedure is only scheduled/called once +# proc_name varchar(40), +# proc_args text, +# -- proc_args is just a log of values. Values actually come from qaf_sched_proc_args +# proc_out text, +# user_id integer, +# instance_id integer, +# priority integer, +# order_time timestamptz, +# started_time timestamptz, +# completed_time timestamptz, +# process_seconds integer + +# TABLE qaf_sched_proc_args +# stack_id integer +# arg_number integer +# arg_value text + + +# set id [db_nextval qaf_sched_id_seq] + +ad_proc -private acc_fin::schedule_do { + +} { + Process any scheduled procedures. Future batches are suspended until this process reports batch complete. +} { + set cycle_time 13 + incr cycle_time -1 + set success_p 0 + set batch_lists [db_list_of_lists qaf_sched_proc_stack_read_adm_p0_s { select id,proc_name,user_id,instance_id, priority, order_time, started_time from qaf_sched_proc_stack where completed_time is null order by started_time asc, priority asc , order_time asc } ] + set batch_lists_len [llength $batch_lists] + set dur_sum 0 + set first_started_time [lindex [lindex $batch_lists 0] 6] + # set debug_p to 0 to reduce repeated log noise: + set debug_p 1 + if { $debug_p } { + ns_log Notice "acc_fin::schedule_do.39: first_started_time '${first_started_time}' batch_lists_len ${batch_lists_len}" + } + if { $first_started_time eq "" } { + if { $batch_lists_len > 0 } { + set bi 0 + # if loop nears cycle_time, quit and let next cycle reprioritize with any new jobs + while { $bi < $batch_lists_len && $dur_sum < $cycle_time } { + set sched_list [lindex $batch_lists $bi] + # set proc_list lindex combo from sched_list + lassign $sched_list id proc_name user_id instance_id priority order_time started_time + # package_id can vary with each entry + + set allowed_procs [parameter::get -parameter ScheduledProcsAllowed -package_id $instance_id] + # added comma and period to "split" to screen external/private references and poorly formatted lists + set allowed_procs_list [split $allowed_procs " ,."] + set success_p [expr { [lsearch -exact $allowed_procs_list $proc_name] > -1 } ] + if { $success_p } { + if { $proc_name ne "" } { + ns_log Notice "acc_fin::schedule_do.54 evaluating id $id" + set nowts [dt_systime -gmt 1] + set start_sec [clock seconds] + # tell the system I am working on it. + set success_p 1 + db_dml qaf_sched_proc_stack_started { + update qaf_sched_proc_stack set started_time =:nowts where id =:id + } + + set proc_list [list $proc_name] + set args_lists [db_list_of_lists qaf_sched_proc_args_read_s { select arg_value, arg_number from qaf_sched_proc_args where stack_id =:id order by arg_number asc} ] + foreach arg_list $args_lists { + set arg_value [lindex $arg_list 0] + lappend proc_list $arg_value + } + #ns_log Notice "acc_fin::schedule_do.69: id $id to Eval: '${proc_list}' list len [llength $proc_list]." + if { [catch { set calc_value [eval $proc_list] } this_err_text] } { + ns_log Warning "acc_fin::schedule_do.71: id $id Eval '${proc_list}' errored with ${this_err_text}." + # don't time an error. This provides a way to manually identify errors via sql sort + set nowts [dt_systime -gmt 1] + set success_p 0 + db_dml qaf_sched_proc_stack_write { + update qaf_sched_proc_stack set proc_out =:this_err_text, completed_time=:nowts where id = :id + } + if { $proc_name eq "acc_fin::scenario_prettify" } { + # inform user of error + set scenario_tid [lindex [lindex $args_lists 0] 0] + acc_fin::pretti_log_create $scenario_tid "#accounts-finance.process#" "error" "id ${id} Message: ${this_err_text}" $user_id $instance_id + } + } else { + set dur_sec [expr { [clock seconds] - $start_sec } ] + # part of while loop so that remaining processes are re-prioritized with any new ones: + set dur_sum [expr { $dur_sum + $dur_sec } ] + set nowts [dt_systime -gmt 1] + set success_p 1 + db_dml qaf_sched_proc_stack_write { + update qaf_sched_proc_stack set proc_out =:calc_value, completed_time=:nowts, process_seconds=:dur_sec where id = :id } + ns_log Notice "acc_fin::schedule_do.83: id $id completed in circa ${dur_sec} seconds." + } + # Alert user that job is done? + # util_user_message doesn't accept user_id instance_id, only session_id + # We don't have session_id available.. and it may have changed or not exist.. + # Email? that would create too many alerts for lots of quick jobs. + # auth::sync::job::* api does this. + # Create another package for user conveniences like active alerts.. + # maybe hook into util_user_message after querying users.n_sessions or something.. + } + } else { + ns_log Warning "acc_fin::schedule_do.87: id $id proc_name '${proc_name}' attempted but not allowed. user_id ${user_id} instance_id ${instance_id}" + } + # next batch index + incr bi + } + } else { + # if do is idle, delete some (limit 100 or so) used args in qaf_sched_proc_args. Ids may have more than 1 arg.. + if { $debug_p } { + ns_log Notice "acc_fin::schedule_do.91: Idle. Entering passive maintenance mode. deleting up to 60 used args, if any." + } + set success_p 1 + db_dml qaf_sched_proc_args_delete { delete from qaf_sched_proc_args + where stack_id in ( select id from qaf_sched_proc_stack where process_seconds is not null order by id limit 60 ) + } + } + } else { + ns_log Notice "acc_fin::schedule_do.97: Previous acc_fin::schedule_do still processing. Stopping." + # the previous acc_fin::schedule_do is still working. Don't clobber. Quit. + set success_p 1 + } + if { $debug_p || !$success_p } { + ns_log Notice "acc_fin::schedule_do.99: returning success_p ${success_p}" + } + return $success_p +} + +ad_proc -private acc_fin::schedule_add { + proc_name + proc_args_list + user_id + instance_id + priority +} { + Adds a process to be "batched" in a process stack separate from page rendering. +} { + # check proc_name against allowd ones. + set session_package_id [ad_conn package_id] + # We assume user has permission.. but qualify by verifying that instance_id is either user_id or package_id + if { $instance_id eq $user_id || $instance_id eq $session_package_id } { + set allowed_procs [parameter::get -parameter ScheduledProcsAllowed -package_id $session_package_id] + # added comma and period to "split" to screen external/private references and poorly formatted lists + set allowed_procs_list [split $allowed_procs " ,."] + set success_p [expr { [lsearch -exact $allowed_procs_list $proc_name] > -1 } ] + if { $success_p } { + set id [db_nextval qaf_sched_id_seq] + set ii 0 + db_transaction { + set proc_args_txt [join $proc_args_list "\t"] + set nowts [dt_systime -gmt 1] + db_dml qaf_sched_proc_stack_create { insert into qaf_sched_proc_stack + (id, proc_name, proc_args, user_id, instance_id, priority, order_time) + values (:id,:proc_name,:proc_args_txt,:user_id,:session_package_id,:priority,:nowts) + + } + foreach proc_arg $proc_args_list { + db_dml qaf_sched_proc_args_create { + insert into qaf_sched_proc_args + (stack_id, arg_number, arg_value) + values (:id,:ii,:proc_arg) + } + incr ii + } + } on_error { + set success_p 0 + ns_log Warning "acc_fin::schedule_add.90 failed for id '$id' ii '$ii' user_id ${user_id} instance_id ${instance_id} proc_args_list '${proc_args_list}'" + ns_log Warning "acc_fin::schedule_add.91 failed proc_name '${proc_name}' with message: ${errmsg}" + } + } + } else { + ns_log Warning "acc_fin::schedule_add.127 failed user_id ${user_id} session_package_id ${session_package_id} instance_id not valid: ${instance_id}" + set success_p 0 + } + return $success_p +} + +ad_proc -private acc_fin::schedule_trash { + sched_id + user_id + instance_id +} { + Removes an incomplete process from the process stack by noting it as completed. +} { + # There is no delete for acc_fin::schedule + + # noting a process as completed in the stack keeps the proc api simple + # Theoretically, one could create an untrash (reschedule) proc for this also.. + set session_user_id [ad_conn user_id] + set session_package_id [ad_conn package_id] + set success_p 0 + #set create_p [permission::permission_p -party_id $session_user_id -object_id $session_package_id -privilege create] + #set write_p [permission::permission_p -party_id $session_user_id -object_id $session_package_id -privilege write] + # keep permissions simple for now + set admin_p [permission::permission_p -party_id $session_user_id -object_id $session_package_id -privilege admin] + # always allows a user to stop their own processes. + if { $admin_p || ($session_user_id eq $user_id && ( $session_package_id eq $instance_id || $session_user_id eq $session_package_id ) ) } { + set nowts [dt_systime -gmt 1] + set proc_out "Process unscheduled by user_id $session_user_id." + set success_p [db_dml qaf_sched_proc_stack_trash { update qaf_sched_proc_stack + set proc_out=:proc_out, started_time=:nowts, completed_time=:nowts where sched_id=:sched_id and user_id=:user_id and instance_id=:instance_id and proc_out is null and started_time is null and completed_time is null } ] + } + return $success_p +} + +ad_proc -private acc_fin::schedule_read { + sched_id + user_id + instance_id +} { + Returns a list containing process status and results as: id,proc_name,proc_args,proc_out,user_id,instance_id, priority, order_time, started_time, completed_time, process_seconds. Otherwise returns an empty list. +} { + set session_user_id [ad_conn user_id] + set session_package_id [ad_conn package_id] + set admin_p [permission::permission_p -party_id $session_user_id -object_id $session_package_id -privilege admin] + set process_stats_list [list ] + if { $admin_p || ($session_user_id eq $user_id && ( $session_package_id eq $instance_id || $session_user_id eq $session_package_id ) ) } { + set process_stats_list [db_list_of_lists qaf_sched_proc_stack_read { select id,proc_name,proc_args,proc_out,user_id,instance_id, priority, order_time, started_time, completed_time, process_seconds from qaf_sched_proc_stack where id =:sched_id and user_id=:user_id and instance_id=:instance_id } ] + } + return $process_stats_list +} + +ad_proc -private acc_fin::schedule_list { + user_id + instance_id + {processed_p "0"} + {n_items "all"} + {m_offset "0"} + {sort_by "order_time"} + {sort_type "asc"} +} { + Returns a list of active processes in stack ie. to be processed or in process; ordered by order_time. + List of lists includes: id,proc_name,proc_args,user_id,instance_id,priority,order_time,started_time,completed_time,process_seconds. + If processed_p = 1, includes stack history, otherwise completed_time is blank. + List can be segmented by n items offset by m. +} { + set process_stats_list [list ] + + if { [ns_conn isconnected] && [qf_is_natural_number $user_id] && $user_id > 0 } { + set session_user_id [ad_conn user_id] + set session_package_id [ad_conn package_id] + set admin_p [permission::permission_p -party_id $session_user_id -object_id $session_package_id -privilege admin] + } + + if { $admin_p || ($session_user_id eq $user_id && ( $session_package_id eq $instance_id || $session_user_id eq $session_package_id ) ) } { + + if { ![qf_is_natural_number $m_offset]} { + set m_offset 0 + } + if { ![qf_is_natural_number $n_items] } { + set n_items "all" + } + set fields_list [list id proc_name proc_args user_id instance_id priority order_time started_time completed_time process_seconds] + if { [lsearch -exact $fields_list $sort_by] == -1 } { + set sort_by "order_time" + set sort_type "asc" + } elseif { $sort_type ne "asc" && $sort_type ne "desc" } { + set sort_type "asc" + } + + if { $admin_p } { + if { $processed_p } { + set process_stats_list [db_list_of_lists qaf_sched_proc_stack_read_adm_p1 " select id,proc_name,proc_args,user_id,instance_id, priority, order_time, started_time, completed_time, process_seconds from qaf_sched_proc_stack order where instance_id=:instance_id by $sort_by $sort_type limit $n_items offset :m_offset " ] + } else { + set process_stats_list [db_list_of_lists qaf_sched_proc_stack_read_adm_p0 " select id,proc_name,proc_args,user_id,instance_id, priority, order_time, started_time, completed_time, process_seconds from qaf_sched_proc_stack where completed_time is null order by $sort_by $sort_type limit $n_items offset :m_offset " ] + } + } else { + if { $processed_p } { + set process_stats_list [db_list_of_lists qaf_sched_proc_stack_read_user_p1 " select id,proc_name,proc_args,user_id,instance_id, priority, order_time, started_time, completed_time, process_seconds from qaf_sched_proc_stack where id =:sched_id and user_id=:user_id and ( instance_id=:instance_id or instance_id=:user_id) order by $sort_by $sort_type limit $n_items offset :m_offset " ] + } else { + set process_stats_list [db_list_of_lists qaf_sched_proc_stack_read_user_p0 " select id,proc_name,proc_args,user_id,instance_id, priority, order_time, started_time, completed_time, process_seconds from qaf_sched_proc_stack where completed_time is null and id =:sched_id and user_id=:user_id and ( instance_id=:instance_id or instance_id=:user_id) order by $sort_by $sort_type limit $n_items offset :m_offset " ] + } + } + } + return $process_stats_list +} Index: openacs-4/packages/accounts-finance/tcl/distribution-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/distribution-procs.tcl,v diff -u -r1.1 -r1.2 --- openacs-4/packages/accounts-finance/tcl/distribution-procs.tcl 15 Jun 2012 22:24:45 -0000 1.1 +++ openacs-4/packages/accounts-finance/tcl/distribution-procs.tcl 14 Nov 2014 18:20:16 -0000 1.2 @@ -7,6 +7,147 @@ namespace eval acc_fin {} +ad_proc -public qaf_distribution_normalize { + distribution_lol + {x_p "1"} + {y_p "0"} +} { + Normalizes x to 1, or y to 1, or if both x_p and y_p are 1, the area under curve to 1. distribution_lol is a list of lists of x y. +} { + if { $x_p ne "0" } { + set x_p 1 + } + if { $y_p ne "1" } { + set y_p 0 + } + if { $x_p ||$y_p } { + set d_new_lol [list ] + if { $x_p } { + # normalize x to 1 + set x_list [list ] + foreach row $distribution_lol { + lappend x_list [lindex $row 0] + + } + set denom [f::sum $x_list ] + foreach row $distribution_lol { + set row2_list [list [expr { [lindex $row 0] / ( 1. * $denom ) } ] [lindex $row 1]] + lappend d_new_lol $row2_list + } + } elseif { $y_p } { + # normalize y to 1 + set y_list [list ] + foreach row $distribution_lol { + lappend y_list [lindex $row 1] + } + set denom [f::sum $y_list ] + foreach row $distribution_lol { + row2_list [list [lindex $row 0] [expr { [lindex $row 1] / ( 1. * $denom ) } ]] + lappend d_new_lol $row2_list + } + } + if { $x_p && $y_p } { + # x has been normalized to 1, now adjust y so that area under curve is 1 + # assumes area with each point is x * y + set xy_list [list ] + foreach row $d_new_lol { + lappend xy_list [expr { 1. * [lindex $row 0] * [lindex $row 1] } ] + } + set denom [expr { 1. * [f::sum $xy_list ] } ] + set d2_new_lol [list ] + foreach row $d_new_lol { + set row3_list [list [lindex $row 0] [expr { [lindex $row 1] / $denom } ] ] + lappend d2_new_lol $row3_list + } + } else { + set d2_new_lol $d_new_lol + } + + } else { + set d2_new_lol $distribution_lol + } + return $d2_new_lol +} + + +ad_proc -public qaf_y_of_x_dist_curve { + p + y_x_lol + {interpolate_p 0} +} { + returns y where p is in the range of x ie y(p,x). Where p is some probability between 0 and 1. + Assumes y_x_lol is an ordered list of lists representing a curve. Set interpolate_p to 1 + to interpolate when p is between two discrete points that represent a continuous curve. if first row contains labels x and y as labels, + these positions will be used to extract data from remaining rows. a pair y,x is assumed +} { + #ns_log Notice "qaf_y_of_x_dist_curve.82: *****************************************************************" + ns_log Notice "qaf_y_of_x_dist_curve.83: p $p interpolate_p $interpolate_p " + set p [expr { $p + 0. } ] + set first_row_list [lindex $y_x_lol 0] + set x_idx [lsearch -exact $first_row_list "x"] + set y_idx [lsearch -exact $first_row_list "y"] + if { $y_idx == -1 || $x_idx == -1 } { + set x_idx 1 + set y_idx 0 + set data_row_1 0 + } else { + set data_row_1 1 + } + + # normalize x to 1.. first extract x list + set x_list [list ] + foreach y_x [lrange $y_x_lol $data_row_1 end] { + lappend x_list [lindex $y_x $x_idx] + } + #ns_log Notice "qaf_y_of_x_dist_curve.102: y_x_lol length [llength $y_x_lol] y_x_lol $y_x_lol " + ns_log Notice "qaf_y_of_x_dist_curve.103: x_list length [llength $x_list] x_list $x_list" + set x_sum [f::sum $x_list] + set x_len [llength $x_list] + set loop_limit [expr { $x_len + 1 } ] + # normalize p to range of x + set p_normalized [expr { $p * $x_sum * 1. } ] + + #ns_log Notice "qaf_y_of_x_dist_curve.104: x_sum '$x_sum' p '$p' p_normalized '$p_normalized' y_idx '$y_idx' x_idx '$x_idx' data_row_1 '$data_row_1'" + # determine y @ x + + set i 0 + set p_idx $i + set p_test 0. + while { $p_test < $p_normalized && $i < $loop_limit } { + set x [lindex $x_list $i] + # ns_log Notice "qaf_y_of_x_dist_curve.117: i '$i' x '$x' p_test '$p_test'" + if { $x ne "" } { + set p_test [expr { $p_test + $x } ] + set p_idx $i + } + incr i + } + # $p_idx is the index point in x_list where p is in the range of p_idx + set y_x_i [expr { $data_row_1 + $p_idx } ] + set row_list [lindex $y_x_lol $y_x_i] + #ns_log Notice "qaf_y_of_x_dist_curve.120: i $i p_test $p_test x '$x' row_list '$row_list' y_x_i '$y_x_i'" + if { $interpolate_p && $p_test != $p_normalized } { + # point(i) is p(x2,y2) + set x2 [lindex $row_list $x_idx] + set y2 [lindex $row_list $y_idx] + # point(i-1) is p(x1,y1) + set y_x_i_1 [expr { $y_x_i - 1 } ] + set row_list [lindex $y_x_lol $y_x_i_1] + set x1 [lindex $row_list $x_idx] + set y1 [lindex $row_list $y_idx] + set y [qal_interpolatep1p2_at_x $x1 $y1 $x2 $y2 $p_normalized 1] + + } else { + set y [lindex $row_list $y_idx] + if { $y ne "" } { + set y [expr { $y + 0. } ] + } + } + + #ns_log Notice "qaf_y_of_x_dist_curve.141: y $y" + return $y +} + ad_proc -public qaf_distribution_points_create { distribution_p_list {number_of_points ""} @@ -19,27 +160,27 @@ } { set amount_p [expr { [string length $min_sum_of_outputs] > 0 } ] set count_p [expr { [string length $number_of_points] > 0 } ] - + # count_max is the number of discrete numbers set count_max [llength $distribution_p_list] set curve_error 0 # build support arrays set area(-1) 0 set count 0 set total_pct 0 -#ns_log Notice "qaf_distribution_points_create: y_col '$y_col' x_col '$x_col'" -#ns_log Notice "qaf_distribution_points_create: distribution_p_list $distribution_p_list" + #ns_log Notice "qaf_distribution_points_create: y_col '$y_col' x_col '$x_col'" + #ns_log Notice "qaf_distribution_points_create: distribution_p_list $distribution_p_list" foreach row $distribution_p_list { set yvalue [lindex $row $y_col] set frequency [lindex $row $x_col] # p_val(index) discrete values set p_val($count) $yvalue # area(index) is the area under the distribution curve to the left of the sale amt -#ns_log Notice "qaf_distribution_points_create: yvalue '$yvalue' frequency '$frequency'" + #ns_log Notice "qaf_distribution_points_create: yvalue '$yvalue' frequency '$frequency'" # total_pct adds all the rcp amounts to confirm it is 100% # frequency must be a number if { [ad_var_type_check_number_p $frequency] } { -# ns_log Notice "qaf_distribution_points_create: frequency $frequency" + # ns_log Notice "qaf_distribution_points_create: frequency $frequency" set area($count) [expr { $area([expr { $count - 1 } ]) + $frequency } ] set total_pct [expr { $total_pct + $frequency } ] } else { @@ -51,7 +192,7 @@ # distribution is not 100% represented # recalculate distribution to 100% representation # ie. divide each frequency by the total -#ns_log Notice "qaf_distribution_points_create: distribution_p_list $distribution_p_list" + #ns_log Notice "qaf_distribution_points_create: distribution_p_list $distribution_p_list" set area(-1) 0 set count 0 set total_check 0. @@ -69,7 +210,7 @@ } set total_pct $total_check } - + # initial set conditions set data_sum 0. set point_count 0 @@ -79,11 +220,11 @@ # every case assumes to reach target while { ( $amount_p && ( $data_sum < $min_sum_of_outputs ) ) || ( $count_p && ($point_count < $number_of_points ) ) } { - set point_seed [expr { rand() } ] + set point_seed [random ] set count 0 # We have area under a normalized curve, let's find interval while { $point_seed > $area($count) } { - incr count + incr count } if { $count > $count_max } { @@ -146,4 +287,289 @@ } return $distribution_list -} \ No newline at end of file +} + +ad_proc -public qaf_std_normal_distribution { + {n_points "24"} + {std_dev_count "2"} + {labels_p "0"} +} { + Returns a standard normal distribution curve as a table list according to + http://en.wikipedia.org/wiki/Normal_distribution#Standard_normal_distribution + where median = 0, and standard deviaiton = 1 + but formatted as a cobbler's distribution curve, where: + x refers to probability (area) instead of standard deviation. + y refers to deviation along x-axis (x_dev) + f_of_x refers to probability at any point y + Anything beyond std_dev standard deviations is at limit p= 0 or p= 1. + if labels_p == 1, returns a column with notes for min, med, max +} { + # remember the curve for future calls, to save having to build the curve each time, if this is buried in a loop etc. + # the base curve is "standard normal distribution" per http://en.wikipedia.org/wiki/Normal_distribution#Standard_normal_distribution + upvar 1 __probability_dc_lol_arr pdc_lol_arr + + # eps = 2.22044604925e-016 = Smallest number such that 1+eps != 1 from: http://wiki.tcl.tk/15256 + set eps 2.22044604925e-016 + #set pi 3.14159265358979 + set pi [expr { atan2( 0. , -1. ) } ] + #set e 2.718281828459 see exp() + set sqrt_2pi [expr { sqrt( 2. * $pi ) } ] + set sqrt_2 [expr { sqrt( 2. ) } ] + + set pdc_lol_arr_exists_p [array exists pdc_lol_arr] + set pdc_lists_len 0 + set half_n_points [expr { int( $n_points / 2. ) } ] + if { [expr { $n_points / 2. } ] == $half_n_points } { + # npoints are even. Median is an important central point. + # Since there is an even number of points, add one + incr $n_points + } + set std_dev_count [expr { $std_dev_count + 0. } ] + if { $pdc_lol_arr_exists_p } { + set pdc_lists_exists_p [info exists pdc_lol_arr(${n_points}) ] + if { $pdc_lists_exists_p } { + set pdc_lists_len [llength $pdc_lol_arr(${n_points}) ] + } + } + if { $pdc_lists_len < $n_points } { + # build or re-build list + # x = deviation from normal. mean = 0, standard deviation = 1, where pow( std_dev, 2.) = variance, sigma = standard deviation + # http://en.wikipedia.org/wiki/Probability_density_function + # p = + # y = f(x) = exp( -0.5 * pow( $x , 2.) ) ) / $sqrt_2pi + # a = area left of x intersect + # Since standard deviation = 1 and this curve starts at -2 sigma to 2 sigma: + # A tail has half_n_points over a range of 2. + set x_step [f::max $eps [expr { $std_dev_count / $half_n_points } ]] + + # Since left and right tail are symmetric, build one tail, alter to get other side + set tail_bar_count [expr { $half_n_points - 1 } ] + set x_prev 0. + set y_at_median [expr { exp( -0.5 * pow( 0. , 2. ) ) / $sqrt_2pi } ] + set y_prev $y_at_median + # First step is a half step to calc y in middle of each segment. + set tail_a_from_median [expr { $y_prev * $x_step / 2. } ] + set tail_x_list [list $x_prev] + set tail_y_list [list $y_prev] + set tail_delta_a_list [list 0.] + set tail_a_from_median_list [list $tail_a_from_median] + + # make a base tail starting at median and extending outward + for {set x [expr { 0. + $x_step } ] } {$x <= $std_dev_count } { set x [expr { $x + $x_step } ] } { + set y [expr { exp( -0.5 * pow( $x , 2. ) ) / $sqrt_2pi } ] + set a_delta [f::max $eps [expr { $x_step * $y } ] ] + set tail_a_from_median [expr { $tail_a_from_median + $a_delta } ] + lappend tail_x_list $x + lappend tail_y_list $y + lappend tail_delta_a_list $a_delta + lappend tail_a_from_median_list $tail_a_from_median + } + ns_log Notice "qaf_std_normal_distribution.347: llength [llength $tail_x_list] tail_x_list $tail_x_list" + ns_log Notice "qaf_std_normal_distribution.348: llength [llength $tail_y_list] tail_y_list $tail_y_list" + ns_log Notice "qaf_std_normal_distribution.349: llength [llength $tail_delta_a_list] tail_delta_a_list $tail_delta_a_list" + ns_log Notice "qaf_std_normal_distribution.350: llength [llength $tail_a_from_median_list] tail_a_from_median_list $tail_a_from_median_list" + # build curve from two tails. + + # left tail, a = 0 to 0.5 (or whatever $a_from_median is), standard deviation= -2 to 0 + # add any missing tail to the left tail end (minimum point) + set a_prev [expr { 0.5 - $tail_a_from_median } ] + # math check + if { $a_prev < 0. } { + ns_log Warning "qaf_std_normal_distribution.357: tail area exceeds 0.5. This shouldn't happen." + } + + + if { $labels_p } { + set title_row [list x_dev y x a label] + } else { + set title_row [list x_dev y x a] + } + set pdc_lists [list ] + lappend pdc_lists $title_row + + set tail_end [llength $tail_x_list] + incr tail_end -1 + set area2left $a_prev + #set label "optimistic / minimum i = ${tail_end}" + set label "optimistic / minimum" + for { set i $tail_end } { $i > 0 } { incr i -1 } { + # x_dev = deviation from median on x. + set x_dev [expr { -1. * [lindex $tail_x_list $i] } ] + set y [lindex $tail_y_list $i] + set x [lindex $tail_delta_a_list $i] + set area2left [expr { $area2left + $x } ] + set curve_row [list $x_dev $y $x $area2left] + if { $labels_p } { + lappend curve_row $label + #set label "i+1 = $i" + set label "" + } + lappend pdc_lists $curve_row + } + + # build the middle point + set i 0 + # some values hardcoded to i=1 + # set median_x_dev 0. + set x_dev 0. + set y $y_at_median + set x [f::max $eps [expr { $x_step * $y } ]] + # set x_dev [expr { -1. * [lindex $tail_x_list 1] } ] + # set y [lindex $tail_y_list 1] + # set x [lindex $tail_delta_a_list 1] + set area2left [expr { $area2left + $x } ] + set curve_row [list $x_dev $y $x $area2left ] + if { $labels_p } { + set label "most likely / median" + lappend curve_row $label + } + lappend pdc_lists $curve_row + + # build right tail + for { set i 1 } { $i < $tail_end } { incr i } { + # x_dev = deviation from median on x. + set x_dev [lindex $tail_x_list $i] + set y [lindex $tail_y_list $i] + set x [lindex $tail_delta_a_list $i] + set area2left [expr { $area2left + $x } ] + set curve_row [list $x_dev $y $x $area2left] + if { $labels_p } { + #set label "i = $i" + set label "" + lappend curve_row $label + } + lappend pdc_lists $curve_row + } + + # build the last, rightmost point + set x_dev [lindex $tail_x_list $tail_end] + set y [lindex $tail_y_list $tail_end] + #set x [lindex $tail_delta_a_list $tail_end] + set x [f::max $eps [expr { 1.0 - $area2left } ]] + #set area2left [expr { $area2left + $x } ] + # increase tail area to normalize area under curve at 1 + set area2left 1.0 + set curve_row [list $x_dev $y $x $area2left] + if { $labels_p } { + lappend curve_row "pessimistic / maximum" + } + lappend pdc_lists $curve_row + + set pdc_lol_arr(${n_points}) $pdc_lists + } + return $pdc_lol_arr(${n_points}) +} + +ad_proc -public qaf_table_column_convert { + table_list_of_lists + {col_ref_from "C"} + {min_point_from ""} + {med_point_from "0"} + {max_point_from "100"} + {col_ref_to "f"} + {min_point_to ""} + {med_point_to "32"} + {max_point_to "212"} +} { + Converts column from one unit to another column in a different unit of a supplied list_of_lists table. + Default values convert from Celsius to Fahrenheit. Creates a new column. + An existing column col_ref_to name will have an underscore and number appended. In case of error, returns an empty list. + Conversion only requires 2 points. Median and either max or min for both ranges. If all three points are supplied, + separate conversion calaculations occurr for the range below med vs. above med value in + order to accomodate transformations of two different tail scales in statistical calculations. +} { + ns_log Notice "qaf_table_column_convert.468: col_ref_from $col_ref_from min_point_from $min_point_from med_point_from $med_point_from max_point_from $max_point_from" + ns_log Notice "qaf_table_column_convert.469: col_ref_to $col_ref_to min_point_to $min_point_to med_point_to $med_point_to max_point_to $max_point_to" + set return_table_lol [list ] + regsub -nocase -all -- {[^a-z0-9\_\-]} $col_ref_from {_} col_ref_from + regsub -nocase -all -- {[^a-z0-9\_\-]} $col_ref_to {_} col_ref_to + if { $col_ref_from ne "" && $col_ref_to ne "" } { + set titles_row_list [lindex $table_list_of_lists 0] + set from_idx [lsearch -exact $titles_row_list $col_ref_from] + set to_idx [lsearch -exact $titles_row_list $col_ref_to] + if { $from_idx > -1 } { + # "from" column exists + set data_rows_lists [lrange $table_list_of_lists 1 end] + if { [qf_is_decimal $med_point_from] && [qf_is_decimal $med_point_to] } { + if { [qf_is_decimal $min_point_from ] && [qf_is_decimal $min_point_to ] } { + set k1 [expr { ( $med_point_to - $min_point_to ) / ( $med_point_from - $min_point_from ) } ] + set case1_p 1 + # low range + } else { + set case1_p 0 + } + if { [qf_is_decimal $max_point_from ] && [qf_is_decimal $max_point_to] } { + set k2 [expr { ( $max_point_to - $med_point_to ) / ( $max_point_from - $med_point_from ) } ] + set case2_p 1 + # high range + } else { + set case2_p 0 + } + ns_log Notice "qaf_table_column_convert.493. case1_p ${case1_p} case2_p ${case2_p}" + if { $to_idx > -1 && ( $case1_p || $case2_p) } { + # "to" column exists + set poss_prev_to_list [lsearch -all -regexp -inline $titles_row_list {.+_[0-9]+$}] + set last_to_title [lindex end [lsort [lsearch -all -glob -inline $poss_prev_to_list "${col_ref_to}_*"]]] + set last_to_num 0 + if { $last_to_title ne "" } { + regexp {.+_([0-9]+)$} $last_to_title scratch last_to_num + } + incr last_to_num + set prev_to_title "${col_ref_to}_${last_to_num}" + ns_log Notice "qaf_table_column_convert.504: changing existing column name '${col_ref_to}' to '${prev_to_title}'" + set titles_row_list [lreplace $titles_row_list $to_idx $to_idx $prev_to_title ] + } + lappend titles_row_list $col_ref_to + lappend return_table_lol $titles_row_list + if { $case1_p && $case2_p } { + foreach row_list $data_rows_lists { + set old [lindex $row_list $from_idx] + set new "" + if { [qf_is_decimal $old ] } { + if { $old < $med_point_from } { + # case 1 + set new [expr { $old * $k1 + $med_point_to } ] + } else { + # case 2 + set new [expr { $old * $k2 + $med_point_to } ] + } + } + set new_row_list $row_list + lappend new_row_list $new + lappend return_table_lol $new_row_list + } + } elseif { $case1_p } { + foreach row_list $data_rows_lists { + set old [lindex $row_list $from_idx] + set new "" + if { [qaf_is_decmial $old ] } { + set new [expr { $old * $k1 + $med_point_to } ] + } + set new_row_list $row_list + lappend new_row_list $new + lappend return_table_lol $new_row_list + } + } elseif { $case2_p } { + foreach row_list $data_rows_lists { + set old [lindex $row_list $from_idx] + set new "" + if { [qaf_is_decmial $old ] } { + set new [expr { $old * $k2 + $med_point_to } ] + } + set new_row_list $row_list + lappend new_row_list $new + lappend return_table_lol $new_row_list + } + } + } else { + ns_log Notice "qaf_table_column_convert.548. Either med_point_from '${med_point_from}' or med_point_to ${med_point_to}' is not a required number." + } + } else { + ns_log Notice "qaf_table_column_convert.549. col_ref_from is not a reference in table. Returned empty table." + } + } else { + ns_log Notice "qaf_table_column_convert.550. col_ref_from and col_ref_to are blank. Returned empty table." + } + ns_log Notice "qaf_table_column_convert.551. return_table_lol $return_table_lol" + return $return_table_lol +} Index: openacs-4/packages/accounts-finance/tcl/energy-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/energy-procs.tcl,v diff -u -r1.3 -r1.4 --- openacs-4/packages/accounts-finance/tcl/energy-procs.tcl 26 Jun 2010 20:11:41 -0000 1.3 +++ openacs-4/packages/accounts-finance/tcl/energy-procs.tcl 14 Nov 2014 18:20:16 -0000 1.4 @@ -39,3 +39,4 @@ set revenue [expr { $energy_output * $ppa_rate * pow( 1. + $ppa_escalation , $year - 1. ) } ] return $revenue } + Index: openacs-4/packages/accounts-finance/tcl/filter-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/filter-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/filter-procs.tcl 14 Nov 2014 18:20:17 -0000 1.1 @@ -0,0 +1,49 @@ +ad_library { + + filter routines used for statistical smoothing of data etc + @creation-date 1 Jan 2014 + @cvs-id $Id: +} + +namespace eval acc_fin {} + +ad_proc -public acc_fin::smoothing_filter { + filter_list + data_list +} { + Returns the data_list as a list of numbers smoothed by geometric averaging of n-terms in sequence.. For example, if filter_list contains 1 2 4, then for each data list item, the nth term will be recalculated using the geometric average of 4*nth term + 2 * (n-1) term + 1 * (n - 2). The first n-1 terms will have partial averaging, since the filter cannot extend before the first term. +} { + + # make some procs that generate N term filters ie number series lists. + # binary expansion: (1-x)(1-2*x) ? + # Fibonacci + # power of 2 expans. 10^a(n)+1 + # 100*e/(x+1)) round(271.8/(x+1)) + # or term_count / ( x + 1/term_count ) + set invese_p2_list [list 1 1 1 1 2 2 2 3 4 6 11 144] + # Graph vs. actual data. and check best fit... + set inverse_prop_list [list 272 136 91 68 54 45 39 34 30 27 25 23 21 19 18 17 16 ] + set inverse_p_rev_list [list 16 17 18 19 21 23 25 27 30 34 39 45 54 68 91 136 272 ] + set binary_expan_list [list 1 1 2 4 8 16 32 64 128 256 512 1024 2048] + set fibonnacci_list [list 1 1 2 3 5 8 13 21 34 55 89 144 ] + set sums_of_all_previous_list [list 1 2 3 6 12 24 48 96 192 384 768 1536 ] + + return filtered_data_list +} + +ad_proc -public acc_fin::shuffle_list { + a_list +} { + Shuffles a list. +} { +# Algorithm/Code extracted from wiki.tcl.tk/941 version shuffle10a on 20 May 2014. + randomInit [clock clicks] + set len [llength $a_list] + while { $len > 0 } { + set n_idx [expr { int( $len * [random] ) } ] + set tmp [lindex $a_list $n_idx] + lset a_list $n_idx [lindex $a_list [incr len -1]] + lset a_list $len $tmp + } + return $a_list +} Index: openacs-4/packages/accounts-finance/tcl/math-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/math-procs.tcl,v diff -u -r1.1 -r1.2 --- openacs-4/packages/accounts-finance/tcl/math-procs.tcl 15 Jun 2012 22:24:45 -0000 1.1 +++ openacs-4/packages/accounts-finance/tcl/math-procs.tcl 14 Nov 2014 18:20:17 -0000 1.2 @@ -7,28 +7,58 @@ namespace eval acc_fin {} -ad_proc -public interpolatep1p2_at_x { +ad_proc -public qaf_interpolatep1p2_at_x { p1_x - P1_y + p1_y p2_x p2_y p3_x + {avg_p "0"} } { - returns y value of third point (p3), given cartesion points p1(x,y), p2(x,y) + returns y value of third point (p3), given cartesion points p1(x,y), p2(x,y). if avg_p == 1, returns the average of p1_y and p2_y instead of returning an empty string. + The average is useful for some point interpretations. } { # interpolate, y=mx+b, slope = Dy/Dx = m, b = y axis intercept if { $p2_x != $p1_x } { + # Classic math way: set m [expr { ($p2_y - $p1_y) / ($p2_x - $p1_x) }] if { $p2_x != 0 } { set b [expr { $p2_y / ( $m * $p2_x ) } ] } else { $p1_y != 0 } { set b [expr { $p1_y / ( $m * $p1_x ) } ] } set p3_y [expr { ( $m * $p3_x ) + $b } ] +# This might work, but haven't completely tested.. would be faster if it does. +# set delta_x31_pct [expr { ( $p3_x - $p1_x ) / ( $p2_x - $p1_x ) } ] +# set p3_y [expr { $delta_x31_pct * ( $p2_y - $p1_y ) } ] } else { # vertical line. - set p3_y "" + if { $avg_p } { + set p3_y [expr { ( $p1_y + $p2_y ) / 2. } ] + } else { + set p3_y "" + } } return $p3_y } - \ No newline at end of file + +ad_proc -public qaf_round_to_decimals { + number + {exponent "0"} +} { + Rounds a number to n decimal places. +} { + set magnitude [expr { pow( 10. , $exponent ) } ] + set rounded [expr { round( $number * $magnitude ) / $magnitude } ] + return $rounded +} + +ad_proc -public qaf_round_to_precision { + number + {precision "1"} +} { + Rounds a number to a precision value. This is handy especially for exact monetary change when the smallest unit is not decimal, 0.05 for example. +} { + # copy of dt_round_to_precision from acs-datetime + return [expr { $precision * round( double($number) / $precision ) } ] +} Index: openacs-4/packages/accounts-finance/tcl/modeling-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/modeling-procs.tcl,v diff -u -r1.23 -r1.24 --- openacs-4/packages/accounts-finance/tcl/modeling-procs.tcl 6 Sep 2010 11:01:41 -0000 1.23 +++ openacs-4/packages/accounts-finance/tcl/modeling-procs.tcl 14 Nov 2014 18:20:17 -0000 1.24 @@ -7,6 +7,10 @@ namespace eval acc_fin {} +# add double( ) to any variable that needs 17 digit precision +# see http://wiki.tcl.tk/1650 which recommends going all the way: set ::tcl_precision 17 +# but that is not in the context of a server. + ad_proc -private acc_fin::qaf_id_new { } { returns a unique id from qaf_id_sequence Index: openacs-4/packages/accounts-finance/tcl/number-progression-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/number-progression-procs.tcl,v diff -u -r1.1 -r1.2 --- openacs-4/packages/accounts-finance/tcl/number-progression-procs.tcl 15 Jun 2012 22:24:45 -0000 1.1 +++ openacs-4/packages/accounts-finance/tcl/number-progression-procs.tcl 14 Nov 2014 18:20:17 -0000 1.2 @@ -39,6 +39,7 @@ set harmonic_number [expr { 1. / $denominator } ] lappend harmonic_list $harmonic_number } - } + } + ns_log Notice "qaf_harmonic_terms: len of list [llength $harmonic_list] harmonic_list $harmonic_list" return $harmonic_list } Index: openacs-4/packages/accounts-finance/tcl/perm-combo-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/perm-combo-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/perm-combo-procs.tcl 14 Nov 2014 18:20:17 -0000 1.1 @@ -0,0 +1,85 @@ +ad_library { + + routines used in permutations and combinations + @creation-date 6 Sep 2014 + @cvs-id $Id: +} + +namespace eval acc_fin {} + +ad_proc -public acc_fin::frombase { + base + number +} { + Returns number a base n whole number into decimal, where n < 36. +} { + set error_p 0 + # original by Richard Suchenwirth 2002-07-07 retrieved from http://wiki.tcl.tk/3662 on 2014-09-09 + # In the Tcl chatroom, Michael Schlenker reported: + # set negative [expr {$number != [set number [expr {abs($number)}]]}] + # is about five times faster if negative, and a bit faster if positive + # than + # set negative [regexp ^-(.+) $number -> number] + set negative [expr { $number != [set number [expr { abs( $number ) } ] ] } ] + set digits "0123456789abcdefghijklmnopqrstuvwxyz" + set res 0 + foreach digit [split $number ""] { + set decimal_value [string first $digit $digits] + if { $decimal_value > -1 && $decimal_value < $base } { + set res [expr { $res * $base + $decimal_value } ] + } else { + set error_p 1 + ns_log Notice "acc_fin::frombase.29: bad digit ${decimal_value} for base ${base}" + } + } + if { $negative } { + set res -$res + } + if { !$error_p } { + return $res + } else { + return "" + } +} + + +ad_proc -public acc_fin::base { + base + number +} { + Returns number in base of $base +} { + # original by Richard Suchenwirth 2002-07-07 retrieved from http://wiki.tcl.tk/3662 on 2014-09-09 + # In the Tcl chatroom, Michael Schlenker reported: + # set negative [expr {$number != [set number [expr {abs($number)}]]}] + # is about five times faster if negative, and a bit faster if positive + # than + # set negative [regexp ^-(.+) $number -> number] + set negative [expr { $number != [set number [expr { abs( $number ) } ] ] } ] + set digits "0123456789abcdefghijklmnopqrstuvwxyz" + set res "" + set base [expr { int( round( $base ) ) } ] + set number [expr { int( round( $number ) ) } ] + set i 0 + while { $number && $i < 36 } { + set digit [expr {$number % $base} ] + set res "[string range $digits $digit $digit]$res" + set number [expr {$number / $base} ] + incr i + } + if { $negative } { + set res -$res + } + return $res +} + +ad_proc -public acc_fin::convert_number { + number + base_from + base_to +} { + Converts a number of most any base upto 36 to any other base upto 36. +} { + # inspired from Michael A. Cleverly's proc convert_number at http://wiki.tcl.tk/1067 retrieved 2014-09-19 + return [acc_fin::base $base_to [acc_fin::frombase $base_from $number]] +} Index: openacs-4/packages/accounts-finance/tcl/pretti-example-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/pretti-example-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/pretti-example-procs.tcl 14 Nov 2014 18:20:17 -0000 1.1 @@ -0,0 +1,1304 @@ +ad_library { + + PRETTI example data used for Project Reporting Evaluation and Track Task Interpretation + @creation-date 8 May 2014 + @cvs-id $Id: + @Copyright (c) 2014 Benjamin Brink + @license GNU General Public License 3, see project home or http://www.gnu.org/licenses/gpl-3.0.en.html + @project home: http://github.com/tekbasse/accounts-finance + @address: po box 20, Marylhurst, OR 97036-0020 usa + @email: kappa@dekka.com + + PRETTI examples and test data generator procs. + +} + +namespace eval acc_fin {} + +ad_proc -private acc_fin::example_table { + {table_ref ""} +} { + Returns a list of 3 items. index 0 is table title; index 1 is table description, index 2 is table in data entry format, commas between columns, spaces between multiple items in same row and column; +} { + set ret_list "" + switch -exact $table_ref { + p10a { + # goes with p20a + set ret_list [list [list name value] [list activity_table_name "PRETTI Example 1"] [list time_est_short 5 ] [list time_est_median 8] [list time_est_long 12] [list time_probability_point 0.5]] + } + p10b { + # goes with p20b + set ret_list [list [list name value] [list activity_table_name "WikipediaPERTchart"]] + } + p10c { + # goes with p20c + set ret_list [list [list name value] [list activity_table_name "Fedora Release Life Cycle"]] + } + p10d { + # goes with p20d + set ret_list [list [list name value] [list activity_table_name "Fedora 20 Doc Workflow"]] } + p10e { + # goes with p20e + set ret_list [list [list name value] [list activity_table_name "Fedora 20 network analysis from Project Schedule (draft)"]] } + p10f { + # goes with p20f + set ret_list [list [list name value] [list activity_table_name "Example 6"]] } + p20a { + set ret_list [list "Wikipedia PERT" "This is an example from PERT entry of Wikipedia. See entry for details: http://en.wikipedia.org/wiki/Program_Evaluation_and_Review_Technique" "activity_ref,time_est_short,time_est_med,time_est_long,time_ext,dependent_tasks +A,2,4,6,4.0, +B,3,5,9,5.33, +C,4,5,7,5.17,A +D,4,6,10,6.33,A +E,4,5,7,5.17,B C +F,3,4,8,4.5,D +G,3,5,8,5.17,E" ] + } + p20b { + set ret_list [list "Wikipedia PERT chart" "This is an example rendered from a chart image in the PERT entry of Wikipedia. See image for details: http://en.wikipedia.org/wiki/File:Pert_chart_colored.svg" "activity_ref,time_est_median,dependent_tasks,color +10,0,,grey +E,3,30,blue +A,3,10,green +B,4,10,green +20,0,B,grey +30,0,A,grey +D,1,30,blue +40,0,D,grey +F,3,40,brown +C,3,20,brown +50,0,F E C,grey +"] } + p20c { + set ret_list [list "Fedora Release Life Cycle tasks" "This is an example rendered from a Release Life Cycle page in the open source Fedora Project's wiki retrieved from https://fedoraproject.org/wiki/Fedora_Release_Life_Cycle on 26 September 2014" "activity_ref,dependent_tasks,time_est_median,description +planning_development,,90,Planning and Development +development,planning_development,90,Development +branch_alpha,development,14,Branch and build Alpha base +bodhi_cycling,branch_alpha,72,Bodhi maintenance release cycling \(494d overall) +translations,branch_alpha,72,Translations accepted this release \(279d overall) +alpha_testing,branch_alpha,23,Alpha testing cycle +alpha_cycles,alpha_testing,14,Alpha release candidate cycles +alpha_release,alpha_cycles,7,Alpha release +beta_testing,alpha_release,7,Beta testing cycle +beta_cycles,beta_testing,14,Beta release candidate cycles +beta_release,beta_cycles,7,Beta release +final_cycles,beta_release,14,Final release candidate cycles +final_release,final_cycles,5,GA \(Final) release"] } + p20d { + set ret_list [list "Fedora Doc Workflow" "This is an example rendered from a Documentation Workflow page in the open source Fedora Project's wiki retrieved from https://fedoraproject.org/wiki/Docs_Project_workflow on 26 September 2014" "activity_ref,dependent_tasks,time_est_median +collect_input,, +write_wiki,collect_input, +wiki,collect_input write_wiki, +review_wiki,wiki, +write_xml,wiki collect_input, +git,write_xml, +review_xml,git, +publish,git, +package_docs,git, +push_to_fedora,package_docs,"] } + p20e { + set ret_list [list "Fedora 20 Project task detail chart (draft)" "This draft example is an incomplete, third attempt at manually converting a task schedule from an example in the open source TaskJuggler Project examples at http://www.taskjuggler.org/examples.html Dependencies are not clearly, consistently defined in the schedule. Attempting a network analysis using the schedule makes this self evident. Example file retrieved from http://www.taskjuggler.org/tj3/examples/Fedora-20/f-20.tjp on 2014-09-22." "name,activity_ref,description,dependent_tasks,time_est_median,flags +1,first_day,First Day of Development,,,hidden +2,PlanningPhase_start,Planning Phase start,,,key pm roadmap +x2,PlanningPhase_end,Planning Phase end,,,key pm roadmap +3,start_features_cal,Start/Accept Feature Submission,PlanningPhase_start,25,key pm roadmap +4,rawhide_spins,Prep/Start Nightly Spins Compose Based on Rawhide,PlanningPhase_start,5,spins +5,file_ticket,File ticket with RHT Eng-ops for Fedora 17 EOL bugzilla closure 10days after last release,PlanningPhase_start,10,pm +6,fedora17_eol,RHT Eng-Ops Fedora 17 EOL auto closure 4wks after last release,PlanningPhase_start,20,pm key +7,clean_market_wiki,Cleanup Marketing wiki from previous releases,start_features_cal,5,marketing +8,cycle_market_wiki,Cycle Marketing wiki pages for current release,start_features_cal,5,marketing +9,bug_trackers,Create Tracker Bugs,PlanningPhase_start,,pm +10,design_concept,Conceptual Design Phase,PlanningPhase_start,30,design +11,wallpaper_design,Wallpaper Design for Alpha,design_concept,35,design +12,supplement_wallpaper_start,Supplemental Wallpaper Process,PlanningPhase_start,,design +x12,supplement_wallpaper_end,Supplemental Wallpaper Process,package_supplemental_wallpaper,,design +13,supplement_wallpaper_submit,Supplemental Wallpaper Submission Period,PlanningPhase_start,82, +14,decide_supplement_wallpaper,Select Official Supplemental Wallpaper,supplement_wallpaper_submit,, +15,supplement_license_review,Verify Supplemental Wallpaper Licenses,decide_supplement_wallpaper,10, +16,package_supplemental_wallpaper,Package Supplemental Wallpaper,supplement_license_review,2, +17,DevelopmentPhase_start,Development Phase,,, +x17,DevelopmentPhase_end,Development Phase,develop,, +18,devel_start,Start Development,,,devel +19,develop,Packaging and Development \(precedes Alpha),,70,devel proto +20,TestingPhase_start,Testing Phase start,,, +x20,TestingPhase_end,Testing Phase end,,, +21,alpha_start,Alpha Release start,TestingPhase_start,, +24,alpha_blocker1,Alpha Blocker Meeting alpha 1,alpha_start,5,releng quality devel blocker pm +26,alpha_blocker2,Alpha Blocker Meeting alpha 2,alpha_blocker1,5,releng quality devel blocker pm +27,daily_alpha_blocker,Daily Review and Notification of Open Alpha Blocker Bugs,alpha_blocker2,4,releng quality devel pm blocker +29,alpha_blocker3,Alpha Blocker Meeting alpha 3,alpha_blocker2,5,releng quality devel pm blocker +31,alpha_blocker4,Alpha Blocker Meeting 4,alpha_blocker3,5,releng quality devel pm blocker +32,alpha_blocker5,Alpha Blocker Meeting alpha 5,alpha_blocker4,5,releng quality devel pm blocker +34,alpha_deadline_remind,Remind Alpha Deadline in 1 week,feature_freeze alpha_deadline,6,hidden pm +35,feature_freeze,Feature Freeze \(Testable/Complete),,,releng quality pm proto devel key marketing roadmap fpl +37,spins_freeze,Spins Freeze--All Spins Identified,,,releng quality pm proto devel key marketing spins fpl +38,talking_points,Create Talking Points,feature_freeze,5,marketing +39,feature_profiles,Feature Profiles,talking_points,20,marketing +40,branch_rawhide,Branch Fedora from Rawhide,,,releng devel pm proto key roadmap fpl +41,bugzilla_descrption,Reflect supported versions in Bugzilla product description,,,pm +42,rawhide_rebase,Rebase Rawhide bugs to Fedora,,,pm +44,feature_check_remind,Request Feature Status Updates and Remind Submit Deadline,,,devel pm +45,alpha_releng_tickets,File All Release Engineering Tickets for Alpha,,3,releng +46,feature_submit_remind_2_weeks,Feature Submission Deadline Two Weeks away,,6,devel pm +47,spins_wiki_update,Update All Spins Wiki Pages From Previous Releases,,,spins +48,feature_submit_remind_1_week,Feature Submission Deadline One Week away,,11,devel pm +49,alpha_installer_build1,Submit Installer Build for QA Compose,feature_submit_remind_1_week,1,devel +50,qa_alpha_compose1,Create Installable Images for QA testing #1,feature_submit_remind_1_week,2,releng +51,alpha_rawhide_install1,Pre-Alpha Rawhide Acceptance Test Plan #1,qa_alpha_compose1,6,quality +53,feature_submission_deadline,Feature Submission Deadline,,,releng quality pm proto devel key roadmap fpl +54,feature_submission_deadline_announce,Announce Feature Submission Closed,,,pm +55,spins_submission_deadline,Custom Spins Submission Deadline,,,pm proto key spins fpl +56,warn_rawhide_rebase,Rawhide Rebase Warning to Package Maintainers,,,pm +57,ticket_rawhide_rebase,File Rawhide Rebase ticket with RHT Eng-ops,,,pm +58,alpha_installer_build2,Submit Installer Build for QA Compose,feature_submission_deadline,2,devel +59,qa_alpha_compose2,Create Installable Images for QA testing 2,feature_submission_deadline,3,releng +60,alpha_rawhide_install2,Pre-Alpha Rawhide Acceptance Test Plan 2,qa_alpha_compose2,5,quality +61,alpha_installer_build3,Submit Installer Build for QA Compose,qa_alpha_compose2,4,devel +62,qa_alpha_compose3,Create Installable Images for QA testing 3,alpha_rawhide_install2,,releng +63,alpha_rawhide_install3,Pre-Alpha Rawhide Acceptance Test Plan 3,qa_alpha_compose3,5,quality +64,feature_incomplete_nag,Remind lt 85pct complete Feature Owners,feature_freeze,1,pm +65,feature_incomplete_fesco,Deliver Incomplete Features to FESCo,feature_freeze,6,pm +66,alpha_deadline,Alpha Change Deadline,develop,,releng quality pm devel key roadmap proto blocker spins +67,alpha_deadline_announce,Announce Alpha Change Deadline Reached,alpha_deadline,,pm +68,alpha_infrastructure_freeze,Alpha Infrastructure Change Freeze,alpha_deadline,10,infrastructure +69,alpha_spins_ks,Build spin-kickstarts package from master,alpha_deadline,,spins +70,orphan,Orphan Rawhide Packages,feature_freeze,,releng devel +71,finalize_alpha_wallpaper,Finalize Alpha Wallpaper,wallpaper_design,3,design pm +72,alpha_wallpaper_deadline,Alpha Wallpaper Deadline,finalize_alpha_wallpaper,,design +73,blog_alpha_wallpaper,Blog About Alpha Wallpaper,finalize_alpha_wallpaper,,design +74,package_alpha_wallpaper,Package Alpha Wallpaper,finalize_alpha_wallpaper,2,design +75,alpha_wallpaper_feedback,Solicit Feedback on Alpha Wallpaper,package_alpha_wallpaper,10,design +76,start_splash_screens,Create Splash Screens,alpha_drop,9,design +77,start_splash_screens_cal,Start Splash Screens,alpha_drop,,design +78,finalize_splash_screens,Finalize Splash Screens,start_splash_screens,4,design +79,beta_wallpaper,Prepare wallpaper for Beta,alpha_drop,13,design +81,alpha_go_not,Alpha Go/No-Go Meeting \(17:00 US Eastern),create_alpha_compose,4,releng quality devel pm proto blocker +82,trans_software_rebuild1,Remind f-dev-announce to Rebuild All Translated Packages,feature_freeze,5,translation +83,software_string_freeze,Software String Freeze,feature_freeze,6,devel translation pm proto releng key roadmap +85,software_translation,Software Translation,,, +86,trans_software,Software Translation Period,software_string_freeze,25,translation +88,request_review_image,Create Rel-Eng ticket for Live Image compose for Software Review UI,software_translation,4,translation +89,build_trans_software,Build F- collection packages for all language translators,request_review_image,,releng devel +90,compose_review_image,Compose of Live Image of Software Review UI for Translation,build_trans_software,,releng +91,trans_software_review,Review and correct software translation in built UI,build_trans_software,6,translation +92,trans_software_rebuild2,Remind f-dev-announce to Rebuild All Translated Packages,trans_software_review,,translation +93,trans_software_deadline,Software: Translation Deadline \(PO Files complete),trans_software_review,,translation roadmap key +94,start_trans_rebuild,Software: Start Rebuild all translated packages,trans_software_deadline,,devel +95,trans_rebuild,Software: Rebuild all translated packages,trans_software_deadline,5,devel +96,alpha_meeting_reminder,Reminder: Alpha Release Readiness Meeting,feature_freeze,10,pm +97,alpha_meeting,Alpha Release Readiness Meeting,alpha_meeting_reminder,3,releng pm quality docs design translation marketing web +98,create_alpha_tc,Create Alpha Test Compose \(TC),,,releng proto +99,test_alpha_tc,Test Alpha 'Test Compose',create_alpha_tc,6,quality proto +100,alpha_kernel_build,Submit Kernel Build for Alpha RC Compose,alpha_deadline,,devel +101,alpha_installer_build,Submit Installer Build for Alpha RC Compose,alpha_deadline,1,devel +103,create_alpha_compose,Compose Alpha Candidate,alpha_deadline,2,releng proto +104,test_alpha_candidate,Test Alpha Candidate,create_alpha_compose,5,quality proto +105,start_stage_alpha,Start Stage and Sync Alpha to Mirrors,test_alpha_candidate,,releng +106,notify_mirrors_alpha,Notify Mirrors of Alpha,start_stage_alpha,1,releng +107,stage_alpha,Stage and Sync Alpha to Mirrors,test_alpha_candidate,3,releng proto +108,alpha_export_control,Alpha Export Control Reporting,start_stage_alpha,1,releng pm +109,alpha_announce,Create Alpha Announcement \(Marketing and Docs),alpha_meeting,2,docs marketing +110,alpha_banner,Alpha Release Banner,,3, +111,alpha_create_banner,Create Alpha Website Banner,,2,design +112,alpha_publish_banner,Add Alpha Banner to Website,alpha_create_banner,1,web +113,alpha_drop,Alpha Public Availability,stage_alpha alpha_banner alpha_publish_banner,,releng docs quality design pm proto devel key marketing roadmap spins blocker infrastructure fpl +114,ambassador_start,FAmSCo heads Ambassador Wide Meetings Preparing For,alpha_drop,7,amassadors +115,start_swag,FAmSCo and Regional teams call for Preparation of Media/SWAG,alpha_drop,7,ambassadors +116,swag_poc,Regional Team Meetings and Select POC for Swag/Media production,alpha_drop,8,ambassadors +117,swag_funding_request,Regional Teams Submit Funding Request For Swag/Media Production,alpha_drop,8,amassadors +118,nvr_testing,NVR Update Check testing,stage_alpha,1,quality +119,alpha_release_notes,Alpha Release Notes,,, +120,start_alpha_beats,Start Alpha Beat and Feature Page Review,feature_freeze,6,docs quality +121,validate_beat_writers,Validate Former Beat Writers,feature_freeze,5,docs +122,recruite_beat_writers,Recruit New Beat Writers,validate_beat_writers,5,docs +123,comb_alpha_beats,Comb Beats and Feature Pages for Alpha,start_alpha_beats,2,docs quality +124,notify_devel_relnotes,Notify Development About Alpha Release Notes,alpha_deadline,,docs +125,prep_alpha_notes,Prepare Alpha Release Notes \(1 page),comb_alpha_beats,6,docs quality +126,post_notes,Post Alpha Release Notes One-Page,prep_alpha_notes,1,docs +127,test_alpha,Alpha Testing,stage_alpha,15,quality proto +128,review_bookmarks,Review Firefox Bookmarks For Update,stage_alpha,5,marketing +129,update_bookmarks,Update and Package Firefox Bookmarks,review_bookmarks,2,marketing +130,tag_bookmarks,Tag Updated Bookmarks Package for,update_bookmarks,,marketing +131,alpha_end,End of Alpha Testing,test_alpha,,quality +132,beta_marketing_notes,Marketing: Beta One Page Release Notes,alpha_end,5,marketing +133,beta,Beta Release,,, +134,remind_beta_blocker1,Reminder: Beta Blocker Meeting \(beta) 1,create_alpha_compose,9,pm +135,beta_blocker1,Beta Blocker Meeting \(beta) 1,stage_alpha,3,quality releng devel pm blocker +136,beta_releng_tickets,File All Release Engineering Tickets for Beta,stage_alpha,2,releng +137,remind_beta_blocker2,Reminder: Beta Blocker Meeting \(beta) #2,beta_blocker1,3,pm +138,beta_blocker2,Beta Blocker Meeting \(beta) 2,beta_blocker1,5,releng quality devel pm blocker +139,daily_beta_blocker,Daily Review and Notification of Open Beta Blocker Bugs,beta_blocker2,4,releng quality devel pm blocker +141,beta_blocker3,Beta Blocker Meeting \(beta) #3,beta_blocker2,5,releng quality devel pm blocker +143,beta_blocker4,Beta Blocker Meeting \(beta) #4,beta_blocker3,5,releng quality devel pm blocker +146,beta_spins_ks,Build spin-kickstarts package from master,,,spins +147,coordinate_swag_design,FAmSCo Coordinate Media/Swag/Poster artwork with Design team,,10,ambassadors +150,beta_deadline,Beta Change Deadline,test_alpha,,releng docs quality pm proto devel key marketing spins roadmap +151,feature_complete,Features 100% Complete Deadline,test_alpha,,releng docs quality pm proto devel key marketing roadmap fpl +152,beta_infrastructure_freeze,Beta Infrastructure Change Freeze,test_alpha,10,infrastructure releng +154,final_feature_fesco,Deliver features < 100% to FESCo,beta_deadline,1,pm +155,brief_ambassadors,Brief Ambassadors on upcoming release,beta_deadline,5,marketing +156,create_countdown,Create Count Down Graphic,beta_deadline,10,design +157,publish_countdown,Publish Count Down Graphic,create_countdown,1,web +158,beta_release_notes,Beta Release Notes,,, +159,unclaimed_beats,Write Unclaimed Wiki Beats,alpha_drop,6,docs +160,port_wiki_publican,Port Wiki to Publican,unclaimed_beats,3,docs +162,start_release_notes_pot1,Start nightly POT files all fed-rel-notes.rpm content,port_wiki_publican,1,docs +163,release_notes_pot1,Generate nightly POT files all fed-rel-notes.rpm content,port_wiki_publican,13,docs +165,beta_wiki_freeze,Wiki Freeze: Beta Release Notes,beta,2,docs +166,trans_release_notes,Translate Beta Release Notes,port_wiki_publican,14,translation +167,build_trans_review,Ongoing build translation review htmls,beta_wiki_freeze,5,docs +168,trans_review_beta,Review and correct Beta Release Notes \(daily buids html),beta_wiki_freeze,5,translation +169,trans_release_notes_deadline,Translation Deadline: Beta Release Notes \(PO Files complete),trans_review_beta,,translation docs +170,build_beta_relnotes,Build f-r-n.rpm and Push to updates-candidate,trans_release_notes_deadline,2,docs translation +171,final_release_notes_reminder,Reminder: Send Project Wide-Final Release Notes Deadlines,beta_deadline,7,docs +172,web_notes,Build and Post Beta release-notes to docs.fedoraproject.org,beta_meeting,2,docs +173,tech_web_notes,Build and Post Fedora Technical Notes to docs.fedoraproject.org,beta_meeting,2,docs +174,splash_deadline,Deadline: Beta Splash Screens,finalize_splash_screens,,design +175,package_final_splash,Package: Beta Splash Screens,finalize_splash_screens,2,design +176,package_beta_wallpaper,Package: Beta Wallpaper,beta_wallpaper,2,design +177,package_supplemental_wallpaper,Package: Supplemental Wallpaper,beta_wallpaper,,design +178,beta_meeting_announce,Announce: Beta Release Readiness Meeting,,,pm +179,beta_meeting_reminder,Reminder: Beta Release Readiness Meeting,beta_deadline,4,pm +180,beta_meeting,Beta Release Readiness Meeting,beta_meeting_reminder,3,releng pm quality docs design translation marketing web +181,beta_announce,Create Beta Announcement \(Docs and Marketing),beta_meeting,2,docs marketing +182,beta_installer_build1,Submit Installer Build for Beta TC Compose,,,devel +183,beta_rawhide_install,Pre-Beta Acceptance Test Plan,,5,quality +184,create_beta_tc,Create Beta Test Compose \(TC),beta_rawhide_install,2,releng proto +185,test_beta_tc,Test Beta 'Test Compose',create_beta_tc,6,quality proto +187,beta_go_not,Beta Go/No-Go Meeting \(17:00 US Eastern),create_beta_compose,4,releng quality devel pm proto blocker +188,beta_kernel_build,Submit Kernel Build for Beta RC Compose,beta_deadline,,devel +189,beta_installer_build,Submit Installer Build for Beta RC Compose,beta_deadline,1,devel +191,create_beta_compose,Compose Beta Candidate,beta_deadline,2,releng proto +192,call_for_events,FAmSCo and Regional Teams Call for Release Events,beta_deadline,12,ambassadors +193,logistics_budget,Regional Teams Plan Regional Logistics for Release Events and File Budget Requests,call_for_events,10,ambassadors +194,test_beta2,Test Beta Candidate,create_beta_compose,5,quality proto +195,start_stage_beta,Start Stage and Sync Beta to Mirrors,test_beta2,,releng +196,notify_mirrors_beta,Notify Mirrors of Beta,start_stage_beta,1,releng +197,stage_beta,Stage and Sync Beta to Mirrors,test_beta2,3,releng proto +198,beta_export_control,Beta Export Control Reporting,start_stage_beta,1,releng pm +199,beta_banner,Beta Release Banner,,3, +200,beta_create_banner,Create Beta Website Banner,,2,design +201,beta_publish_banner,Add Beta Banner to Website,beta_create_banner,1,web +203,beta_drop,Beta Release Public Availability,stage_beta beta_create_banner beta_publish_banner,,docs releng quality pm translation proto design devel key marketing roadmap blocker spins infrastructure fpl +204,event_deadline,Release Event Submission Deadline,logistics_budget,1,ambassadors +205,budget_allocations,FAmSCo Review Budget Allocations,event_deadline,,ambassadors +206,irc_sessions,FAmSCo Regional IRC town halls,beta_drop,10,ambassadors +207,beta_test,Beta Testing,stage_beta,14,quality proto +208,websites_trans_reminder,Reminder to f-websites-list about POT/PO dates in 7 days,beta_drop,,translation web +209,media,Create DVD/CD label and sleeve artwork,beta_drop,10,design +210,rc_rawhide_install,Pre-RC Acceptance Test Plan,stage_beta,7,quality +211,testmile,End of Beta Testing,beta_test,,quality +212,LaunchPhase,Launch Phase,,, +213,release_posters,Release Party Posters,beta_drop,, +214,create_posters,FAmSCo with Design Team Create Release Party Posters,,10,ambassadors +215,polish_poster,Polish/Finalize Release Party Posters,create_posters,9,design +216,screenshots,Update and freeze the screenshots page,stage_beta,5,marketing +217,final_screenshots,Marketing: Final Screen Shots,screenshots,5,marketing +218,final_marketing_notes,Marketing: Final One Page Release Notes,screenshots,5,marketing +219,briefings,Brief news distribution network,screenshots,5,marketing +220,monitor,Monitor news sites to provide corrections and info,screenshots,29,marketing +221,rc,Release Candidate,,, +222,final_releng_tickets,File All Release Engineering Tickets for GA,stage_beta,2,releng +224,ga_blocker1,Final Blocker Meeting \(blocker) #1,start_stage_beta,1,releng quality devel pm blocker +226,ga_blocker2,Final Blocker Meeting \(blocker) #2,ga_blocker1,5,releng quality devel pm blocker +228,ga_blocker3,Final Blocker Meeting \(blocker) #3,ga_blocker2,5,releng quality devel pm blocker +229,kernel_debug,Disable Kernel debug and submit new Kernel build for RC,,,devel +231,final_change_deadline,Final Change Deadline,beta_test,,releng devel proto pm key spins +232,check_swag,FAmSCo and Regional Teams Meet to Address Unresolved Events/Media/Swag Issues,final_change_deadline,1,ambassadors +233,final_wallpaper,Package Final Wallpaper,,,design +234,final_splash,Package Final Splash Screens,,,design +235,announce_final_change_deadline,Announce Final Freeze and Implications,final_change_deadline,,pm +236,eol_warning,File RHT Eng-ops ticket for Fedora 15 EOL Bugzilla warning,final_change_deadline,,pm +237,final_infrastructure_freeze,Final Infrastructure Change Freeze,beta_test,10,infrastructure releng +239,ga_blocker4,Final Blocker Meeting \(blocker) #4,ga_blocker3,5,releng quality devel pm blocker +240,daily_ga_blocker,Daily Review and Notification of Open Final Blocker Bugs,ga_blocker3,4,releng quality devel pm blocker +241,ga_blocker5,Final Blocker Meeting \(blocker)--Blocks RC Compose,ga_blocker4,1,releng quality devel pm blocker +242,ga_release_notes,Final Release Notes,,, +243,final_release_note_wiki_reminder,Reminder to Development: Wiki Freeze in 7 days,,,docs +244,prep_ga_notes,Prepare GA Release Notes,beta_drop,,docs quality +245,ga_release_notes_freeze,String Freeze: GA Release Notes,prep_ga_notes,4,docs +246,wiki_ga_port,Port diff wiki content to Publican,ga_release_notes_freeze,5,docs +248,ga_pot_trans,Translate Final Release Notes \(POT to PO),beta_release_notes trans_release_notes_deadline,24,translation +249,ga_release_notes_pot,Generate GA Release Notes POT files for Translation,wiki_ga_port,,docs +250,build_trans_review_final,Build GA release note htmls for Translation,ga_release_notes_pot,4,docs +251,build_ga_trans_review,Review and correct GA Release Notes \(daily builds html),ga_release_notes_pot,4,docs translation +253,ga_release_notes_po,Translation Deadline: GA rel-notes \(PO Files complete),ga_pot_trans,,translation +254,ga_release_notes_rpm,Build fedora-release-notes.rpm,ga_release_notes_po,2,docs +255,ga_create_banners,Create Final Release Banners,testmile,9,design +256,create_ga_announce,Create GA Announcement \(Docs and Marketing),,7,docs marketing +257,translate_ga_announce,GA Announcement available for translation \(optional),create_ga_announce,5,translation +258,ga_publish_banners,Add Final Release Banners to Website,ga_create_banners,1,web +259,web_content_update,Update Website Content,beta_drop,5,web +260,web_freeze,Website String Freeze,web_content_update,,web +261,web_create_pot,Create Website POT Files,web_freeze,1,web +262,trans_web,Translation Period for Website \(POT to PO),web_create_pot,9,translation +263,review_trans_web,Review and correct Website translations,trans_web,4,translation web +264,finish_trans_web,Translation Deadline: Websites \(POs done),review_trans_web,,translation +265,publish_trans_web,Publish Translations on Website \(fedoraproject.org),review_trans_web,1,web +266,final_meeting_reminder,Reminder: Final Release Readiness Meeting,beta_test,5,pm +267,ga_meeting,Final Release Readiness Meeting,final_meeting_reminder,3,releng pm quality docs design marketing translation web +268,final_installer_build1,Submit Installer Build for Final TC Compose,,,devel +269,create_final_tc,Create 'Final' Test Compose \(TC),,2,releng proto +270,test_final_tc,Test 'Final' Test Compose \(TC),create_final_tc,4,quality proto +271,final_installer_build,Submit Installer Build for Final RC Compose,final_change_deadline,,devel +273,start_final_compose,Compose 'Final' RC: DVD;Live;Spins,final_change_deadline,1,releng key roadmap proto +274,early_iso,Regional Teams Obtain Final Release ISOs from Release Engineering for duplication,test_final,3,ambassadors +275,regional_marketing,Regional Coordination with Marketing for Release Events,test_final,5,ambassadors +276,deliver_final,Deliver RC to QA for Testing,start_final_compose,,releng proto +277,test_final,Test 'Final' RC,deliver_final,4,quality +278,start_stage_final,Start Stage and Sync RC to Mirrors,test_final,2,releng +279,notify_mirrors_final,Notify Mirrors of Final,start_stage_final,1,releng +280,stage_final,Stage and Sync RC to Mirrors,test_final,3,releng proto +281,package_spins_ks,Branch spin-kickstarts and build package from new branch,create_final_tc,,spins +282,freeze_spins_ks,Spins kickstart package Freeze,create_final_tc,,spins +283,enable_updates,Enable Updates,beta_test,2,releng +285,final_go_not,Final Go/No-Go Meeting \(17:00 US Eeastern),start_final_compose,4,releng quality docs pm proto blocker +286,final_export_control,Final Export Control Reporting,start_stage_final,1,releng pm +287,bugzilla_descrption,Reflect supported versions in Bugzilla product description,stage_final,,pm +288,zero_day_relnotes,Zero Day Release Notes,beta_drop,, +290,zero_day_web,0-Day rel-notes update docs.fp.org,zero_day_relnotes,6,docs +291,zero_day_rpm,0-Day rel-notes build updated rpm,zero_day_relnotes,6,docs +292,zero_day_pot,0-Day rel-notes generate POT,zero_day_relnotes,6,docs +293,zero_day_trans,Translate 0-Day Release Notes,zero_day_relnotes,6,translation +294,zero_day_deadline,Translation Deadline: 0-Day \(PO Files complete),zero_day_trans,10,translation +295,web_post,Add translated zero-day updates to docs.fp.org,zero_day_trans,,docs +296,post_tech_notes,Update and post Fedora Technical Notes to docs.fedoraproject.org,final,,docs +297,push_updates_rpm,Push updated rel-notes RPMs to Updates repo,final,4,docs +300,final,Final \(GA) Release,stage_final zero_day_relnotes media_prebriefs,,quality releng docs design pm translation proto devel key marketing roadmap spins infrastructure fpl +302,event_reports,Hold Release Events and Publish Event Reports,final,23,ambassadors +303,spins_ga_ks,Build new spin-kickstarts package for updates \(if necessary),stage_final,,spins +304,marketing_post,Marketing Retrospective,final,10,marketing +305,all_guides,Guides,,, +306,continue_guides_trans,Continue translation of guides in branch of previous release,,70,translation +307,test_branch_guides,Test master branches of guides against Alpha and correct,stage_alpha,10,docs +308,branch_guides,Branch Guides,test_branch_guides,,docs +309,guides_pot,Create POT files for All Guides,branch_guides,,docs +310,notify_trans,Notify trans that new Guide POT files available,guides_pot,,docs +311,trans_all_guides,Translate All Guides \(POT to PO),guides_pot,,docs +312,publish_draft,Publish draft guides,branch_guides,,docs +313,annouce_publish_draft,Notify announce-list and f-devel-list draft guides available,publish_draft,,docs +314,guides_trans,Translate All Guides \(POT to PO),guides_pot,39,translation +316,srpm_review,Remind new guide owners SRPM package review,beta_deadline,6,docs +318,guides_string_freeze,String Freeze All Guides,final_change_deadline,,docs +319,generate_final_pot,Generate final POT files for Guides,guides_string_freeze,,docs +320,notify_trans_final,Notify Trans of Final Guides POT availability,guides_string_freeze,,docs +321,build_daily,Daily builds of Final guides for Translation,final_change_deadline,9,docs +322,review_daily,Review and correct Final Translated Guides \(daily builds html),final_change_deadline,9,translation +323,guides_trans_deadline,Translation Deadline: All Final Guides,,,translation +324,test_guides_beta,Test guides against Beta and correct,beta_drop,4,docs +325,refresh_pot,Refresh POT files for all guides against Beta,test_guides_beta,,docs +326,notify_trans_refresh,Notify trans that POT files updated against Beta,refresh_pot,,docs +327,republish_draft,Republish draft guides for Beta,test_guides_beta,,docs +328,notify_revised_draft,Notify announce-list and f-devel-list revised draft guides available,republish_draft,,docs +329,guides_final_build,Final Build All Guides: All Languages,srpm_review,3,docs +330,publish_guides,Publish all guides to docs.fp.o \(html;html-single;pdf),,,docs +331,elections,Election Coordination,,,elections fpl pm +332,remind,Remind advisory-board list of upcoming election schedule,,, +333,solicit,Solicit volunteers for questionnaire and town halls,remind,7, +334,wiki_update,Update wiki page https://fedoraproject.org/wiki/Elections with required information,solicit,, +335,advertise_elections,Advertise elections schedule and pages,solicit,, +336,announce_nominations,FPL/designee announces opening of nominations,solicit,25, +337,open_questions,Questionnaire wrangler announces opening for questions,announce_nominations,, +338,collect_questions,Collect question on the wiki,announce_nominations,8, +339,collect_answers,Candidates write questionnaire answers,collect_questions,7, +340,announce_town,Town hall wrangler announces schedule for town hall meetings,announce_nominations,, +341,question_deadline,Questionnaire answers due from candidates,collect_answers,, +342,present_answers,Wrangler presents questionnaire answers,collect_answers,2, +343,post_questions,All answers posted to questionnaire page;advertise to voters,present_answers,, +344,town_hall,Town hall period,post_questions,6, +345,voting_application,Finalize Voting Application,town_hall,1, +346,voting_start,Voting Begins,voting_application,, +347,voting,Voting for general elections,voting_application,6, +348,voting_end,Voting Ends,voting,, +349,announce_results,Announce Results,voting_end,1, +350,naming,Name the Release,,,pm fpl +351,gather,Collect Names on Wiki,,5.5, +352,board,Board Review of Proposed Names,gather,3, +353,legal,Legal Review,board,5, +354,vote,Voting,legal,4, +355,announce_name,Release Name Announced,vote,1,design pm +356,pr,Public Relations,,, +357,video,Creative team videos,,25,fpl pr +358,video_schedule,Meet w/Creative to schedule videos,,5, +359,video1,Make spotlight video 1,video_schedule,, +360,review_spotlight1_video,Review video #1,video1,15, +361,release_spotlight1_video,Publish spotlight video #1,review_spotlight1_video,, +362,video2,Make spotlight video #2,video_schedule,, +363,review_spotlight2_video,Review video #2,video2,15, +364,release_spotlight2_video,Publish spotlight video #2,review_spotlight2_video,, +365,review_release_video,Make and Review release video,video1 video2,20, +366,release_video,Publish release video,final review_release_video,, +367,beta_release_blog,Beta press blog entry,,,fpl pr +368,beta_release_blog_draft,Start drafting Beta blog,,10, +369,beta_release_blog_legal,Red Hat PR send Beta blog to Legal,beta_release_blog_draft,5, +370,beta_release_blog_intl,Red Hat PR send Beta blog to intl-pr list,beta_release_blog_legal,6, +371,beta_release_blog_drop,Red Hat PR publish and send Beta blog to media contacts,beta_drop beta_release_blog_intl,, +372,spotlight_feature1_draft,Draft spotlight #1 blog entry,,5,fpl pr +373,spotlight_feature1_legal,Red Hat PR send spotlight #1 blog entry draft to legal,spotlight_feature1_draft,5,fpl pr +375,spotlight_feature1_drop,Red Hat PR publish spotlight #1 blog entry,spotlight_feature1_legal,,fpl pr +376,spotlight_feature1,Spotlight feature #1,spotlight_feature1_drop,, +377,spotlight_feature2_draft,Draft spotlight #2 blog entry,,5,fpl pr +378,spotlight_feature2_legal,Red Hat PR send spotlight #2 blog entry draft to legal,spotlight_feature2_draft,5,fpl pr +379,spotlight_feature2_drop,Red Hat PR publish spotlight #2 blog entry,,,fpl pr +381,spotlight_feature2,Spotlight feature #2,spotlight_feature2_drop,, +382,spotlight_feature3,Spotlight feature #3,,, +383,spotlight_feature3_draft,Draft spotlight #3 blog entry,,5,fpl pr +384,spotlight_feature3_legal,Red Hat PR send spotlight #3 blog entry draft to legal,spotlight_feature3,5,fpl pr +385,spotlight_feature3_drop,Red Hat PR publish spotlight #3 blog entry,spotlight_feature3_legal,,fpl pr +387,spotlight_feature_blogs,Spotlight feature press blogs,spotlight_feature3 spotlight_feature2 spotlight_feature1,, +388,usb_keys_prebriefs,USB Keys and media pre-briefs,,,fpl pr +389,buy_usb_keys,Purchase USB Keys,,5, +390,assess_press_kit,Check LiveUSB press review sheet for readiness,,5, +391,update_press_one_sheet,Update LiveUSB press review sheet,assess_press_kit,5, +392,prepare_usb_keys,Prep USB keys with pre-release,buy_usb_keys,5, +393,send_usb_keys,Send USB keys to Red Hat PR for distribution,prepare_usb_keys update_press_one_sheet,10, +394,distribute_usb_keys,Red Hat PR distribute USB keys to media contacts,,7, +395,media_prebriefs,Hold media prebrief interviews,send_usb_keys distribute_usb_keys,6, +396,web_graphics_discuss,Schedule meeting with Red Hat web team to plan launch,,5, +397,web_promo_to_brand,Send web promo ideas to Brand,web_graphics_discuss,5, +398,web_copy_review,Review and update www.redhat.com/Fedora copy,web_promo_to_brand,5, +399,web_copy_send_update,Send updated copy to Web team,web_copy_review,11, +400,rh_web_goes_live,Red Hat website changes go live,final web_copy_send_update,, +401,redhat_com_update,Update Red Hat web site,rh_web_goes_live,,fpl pr +402,ga_press_release_draft,Start drafting GA press release,,10, +403,ga_press_release_legal,Red Hat PR send GA press release to Legal,ga_press_release_draft,5, +404,ga_press_release_intl,Red Hat PR send GA press release to intl-pr list,ga_press_release_legal,6, +405,ga_press_release_drop,Red Hat PR publish and send GA press release to media contacts,final ga_press_release_intl,, +406,ga_press_release,GA press release,ga_press_release_drop,,fpl pr +407,ceo_prepare_final_rc,Prepare a final RC on USB for CEO,,2, +408,ceo_send_final_rc,Send final RC USB key to CEO,ceo_prepare_final_rc,2, +409,ceo_solicit_feedback,Solicit CEO feedback on pre-release,ceo_send_final_rc,4, +410,ceo_blog_draft,Draft CEO blog,ceo_solicit_feedback,3, +411,ceo_blog_legal,Red Hat PR send CEO blog to Legal,ceo_blog_draft,3, +412,ceo_blog_drop,Red Hat PR publish and send CEO blog to media contacts,final ceo_blog_legal,1, +413,ceo_blog,CEO press blog entry,ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop,,fpl pr +"] } + p20f { + set ret_list [list "Example 6" "This example highlights features that somewhat resemble the XDCPM banner." "activity_ref,dependent_tasks,time_est_median +AA,,100 +BB,AA,100 +CC,BB,100 +DD,CC,100 +EE,DD,100 +FF,EE,100 +GG,FF,100 +HH,GG,100 +II,HH,100 +JJ,,100 +KK,JJ,100 +LL,KK,100 +MM,LL,100 +NN,MM,100 +OO,NN,100 +PP,OO,100 +QQ,PP,100 +RR,,90 +SS,KK,100 +TT,JJ,90 +UU,LL,100 +VV,MM,100 +WW,NN,90 +XX,OO,90 +YY,PP,100 +ZZ,SS,100 +AE,TT,90 +OE,UU,100 +OU,VV,100 +EU,WW,90 +US,XX,90 +DK,YY,100 +G1,RR,12 +G2,G1,10.8 +G3,G2,9.72 +G4,G3,8.748 +G5,G4,7.8732 +G6,G5,7.08588 +G7,G6,6.377292 +G8,G7,5.7395628 +H1,AE,53 +H2,H1,47.7 +H3,H2,42.93 +H4,H3,38.637 +H5,H4,19 +H6,H5,32 +J1,ZZ,28.8 +J2,J1,25.92 +J3,J2,23.328 +J4,J3,20.9952 +J5,J4,18.89568 +L1,OE,17.006112 +L2,L1,15.3055008 +L3,L2,13.77495072 +L4,L3,12.397455648 +K1,OU,11.1577100832 +K2,K1,10.0419390749 +K3,K2,9.0377451674 +INT,EU,28 +ORG,INT,28 +UK,QQ,90 +RI,US,23" ] + } + p20 { + # p2 Task Network + # activity_ref reference for an activity, a unique task id, using "activity" to differentiate between table_id's tid + # An activity reference is essential a function as in f() with no attributes, + # However, there is room to grow this by extending a function to include explicitly set paramemters + # within the function, similar to how app-model handles functions aka vectors + # The multiple of an activity is respresented by a whole number followed by an "*" + # with no spaces between (when spaces are used as an activity delimiter), or + # with spaces allowed (when commas or another character is used as an activity delimiter. + # + # aid_type activity type from p3 + # dependent_tasks direct predecessors , activity_ref of activiites this activity depends on. + # name defaults to type's name (if exists else blank) + # description defaults to type's description (if exists else blank) + # max_concurrent defaults to type's max_concurrent + # max_overlap_pct defaults to type's max_overlap_pct021 + + # time_est_short estimated shortest duration. (Lowest statistical deviation value) + # time_est_median estimated median duration. (Statistically, half of deviations are more or less than this.) + # time_est_long esimated longest duration. (Highest statistical deviation value.) + # time_dist_curve_tid Use this distribution curve instead of the time_est short, median and long values + # Consider using a variation of task_type as a reference + # time_dist_curv_eq Use this distribution curve equation instead. + + # cost_est_low estimated lowest cost. (Lowest statistical deviation value.) + # cost_est_median estimated median cost. (Statistically, half of deviations are more or less than this.) + # cost_est_high esimage highest cost. (Highest statistical deviation value.) + # cost_dist_curve_tid Use this distribution curve instead of equation and value defaults + # cost_dist_curv_eq Use this distribution curve equation. + # + # RESERVED columns: + # _tCurveRef integer reference to time curve in time_clarr and time duration estimate at time_probability_point in t_est_arr + # _cCurveRef integer reference to cost curve in cost_clarr and cost duration estimate at cost_probability_point in c_est_arr + set ret_list acc_fin::pretti_columns_list p2 0 + + } + p21 { + set ret_list acc_fin::pretti_columns_list p2 1 + } + p30 { + # p3 Task Types: + # type + # dependent_types Other dependent types required by this type. (possible reference collisions. type_refs != activity_refs. + # + ##### dependent_types should be checked against activity_dependents' types + # to confirm that all dependencies are satisified. + # name + # description + # max_concurrent (as an integer, blank = no limit) + # max_overlap_pct021 (as a percentage from 0 to 1, blank = 1) + # + # RESERVED columns: + # _tCurveRef integer reference to time curve in time_clarr and time duration estimate at time_probability_point in t_est_arr + # _cCurveRef integer reference to cost curve in cost_clarr and cost duration estimate at cost_probability_point in c_est_arr + set ret_list acc_fin::pretti_columns_list p3 0 + } + p31 { + set ret_list acc_fin::pretti_columns_list p3 1 + # if changing p3 or p2 lists, see also constants_woc_list in this file. + } + p40 { + # each column is track_{number} and generated by code so not used in this context + + # p4 Display modes + # + # tracks within n% of CP duration, n represented as %12100 or a duration of time as total lead slack + # tracks w/ n fixed count closest to CP duration. A n=1 shows CP track only. + # tracks that contain at least 1 CP track + set ret_list acc_fin::pretti_columns_list p4 0 + } + p41 { + # each column is track_{number} and generated by code so not used in this context + set ret_list acc_fin::pretti_columns_list p4 1 + } + p50 { + # each row is a cell, in format of detailed PRETTI internal output. See code. All columns are required to reproduce output to p4 (including p4 comments). + set ret_list acc_fin::pretti_columns_list p5 0 + } + p51 { + # each row is a cell, in format of detailed PRETTI internal output. See code. + set ret_list acc_fin::pretti_columns_list p5 1 + } + p60 { + # each row is a cell, in format of detailed PRETTI internal output. See code. All columns are required to reproduce output to p4 (including p4 comments). + set ret_list acc_fin::pretti_columns_list p6 0 + } + p61 { + # each row is a path, in format of detailed PRETTI internal output. See code. + set ret_list acc_fin::pretti_columns_list p6 1 + } + dc0 { + # dc2 distribution curve table + # Y where Y = f(x) and f(x) is a + # probability mass function ie probability density function as a distribution + # http://en.wikipedia.org/wiki/Probability_mass_function + # http://en.wikipedia.org/wiki/Probability_density_function + # aka http://en.wikipedia.org/wiki/Discrete_probability_distribution#Discrete_probability_distribution + # The discrete values are the values of Y included in the table + + # X Where X = the probability of Y. + # These can be counts of a sample or a frequency. When the table is saved, + # the total area under the distribution is normalized to 1. + + # label Where label represents the value of Y at x. This is a short phrase or reference + # that identifies a boundary point in the distribution. + # A three point (short/median/long or low/median/high) estimation curve can be respresented as + # a discrete set of six points: minimum median median median median maximum + # of standard bell curve probabilities (outliers + standard deviation). + # Thereby allowing *_probability_point variable to be used in estimates with lower statistical resolution. + set ret_list acc_fin::pretti_columns_list dc 0 + } + dc1 { + set ret_list acc_fin::pretti_columns_list dc 1 + } + default { + ns_log Notice "acc_fin::pretti_columns_list (242): bad reference sref '$sref'. Returning blank list." + set ret_list [list ] + } + } + return $ret_list +} + +ad_proc -private acc_fin::pretti_example_maker { + {name_value_list ""} + {package_id ""} + {user_id ""} +} { + Creates a randomized scenario with accompanying required tables, mainly used for testing. Pass a list of optional arguments as a list of name-value pairs; See code for options. +} { + set randomseed [expr { wide( [clock seconds] / 360 ) }] + #set random [expr { wide( fmod( $random * 38629 , 279470273 ) * 71 ) } ] + set random [expr { srand($randomseed) } ] + + + # scenario_prettify requires: + # p1 scenario table + # p2 activity table + # optional: + # p3 activity_type table + # dc distribution curves + + # p1 data refers to p2 table. Create p2 table before p1. + # p2 data refers to dc or p3 tables. Create dc or p3 tables before p2. + + # acts = accounts count + # cols = columns count + # types = types count + # dots = points count + set dc1_list [acc_fin::pretti_columns_list dc 1] + set dc1_len [llength $dc1_list] + set dc0_list [acc_fin::pretti_columns_list dc 0] + set dc0_len [llength $dc0_list] + set p11_list [acc_fin::pretti_columns_list p1 1] + set p11_len [llength $p11_list] + set p10_list [acc_fin::pretti_columns_list p1 0] + set p10_len [llength $p10_list] + set p21_list [acc_fin::pretti_columns_list p2 1] + set p21_len [llength $p21_list] + set p20_list [acc_fin::pretti_columns_list p2 0] + set p20_len [llength $p20_list] + set p31_list [acc_fin::pretti_columns_list p3 1] + set p31_len [llength $p31_list] + set p30_list [acc_fin::pretti_columns_list p3 0] + set p30_len [llength $p30_list] + + set param_arr(dc_count_min) 0 + set param_arr(dc_count_max) 5 + set param_arr(dc_count) [expr { int( [random] * ( $param_arr(dc_count_max) - $param_arr(dc_count_min) ) + .99 ) + $param_arr(dc_count_min) } ] + set param_arr(dc_dots_min) 0 + set param_arr(dc_dots_max) 10 + set param_arr(dc_cols_min) $dc1_len + set param_arr(dc_cols_max) $dc0_len + + + set param_arr(p3_types_min) 0 + set param_arr(p3_types_max) 120 + set param_arr(p3_cols_min) $p31_len + set param_arr(p3_cols_max) $p30_len +# set param_arr(p3_cols) [expr { int( [random] * ( $param_arr(p3_cols_max) - $param_arr(p3_cols_min) + .99 ) ) + $param_arr(p3_cols_min) } ] + + set param_arr(p2_acts_max) 100 + set param_arr(p2_acts_min) 20 + set param_arr(p2_cols_min) $p21_len + set param_arr(p2_cols_max) $p20_len +# set param_arr(p2_cols) [expr { int( [random] * ( $param_arr(p2_cols_max) - $param_arr(p2_cols_min) + .99 ) ) + $param_arr(p2_cols_min) } ] + + set param_arr(p1_vals_min) $p11_len + set param_arr(p1_vals_max) $p10_len +# set param_arr(p1_vals) [expr { int( [random] * ( $param_arr(p1_vals_max) - $param_arr(p1_vals_min) + .99 ) ) + $param_arr(p1_vals_min) } ] + + # blank means column inclusion is randomized. Otherwise list specific columns to try/use + # acc_fin::pretti_columns_list is a handy column name reference + set param_arr(p1_req_vals) "" + set param_arr(p2_req_cols) "" + set param_arr(p3_req_cols) "" + # Use an existing case to test..??? not implemented. + + # Add optional arguments + # ie generative parameters + foreach {name value} $name_value_list { + if { [info exists param_arr($name) ] } { + set param_arr($name) $value + } + } + + # dc + ns_log Notice "acc_fin::pretti_example_maker.248 dc start" + for {set i 0} { $i < $param_arr(dc_count) } { incr i } { + set dc_larr($i) [list ] + set param_arr(dc_cols) [expr { int( [random] * ( $param_arr(dc_cols_max) - $param_arr(dc_cols_min) + .99 ) ) + $param_arr(dc_cols_min) } ] + set title_list $dc1_list + set cols_diff [expr { $param_arr(dc_cols) - [llength $title_list] } ] + if { $cols_diff > 0 } { + lappend title_list [lindex $dc0_list end] + } + set title_list [acc_fin::shuffle_list $title_list] + lappend dc_larr($i) $title_list + set param_arr(dc_dots) [expr { int( [random] * ( $param_arr(dc_dots_max) - $param_arr(dc_dots_min) + .99 ) ) + $param_arr(dc_dots_min) } ] + for { set ii 0} {$ii < $param_arr(dc_dots)} {incr ii} { + # dist curve point + set row_list [list ] + foreach title $title_list { + switch -exact $title { + x { + # a random amount, assume hours for a task for example + set dot(x) [expr { int( [random] * 256. + 5. ) / 6. } ] + } + y { + # these could be usd or btc for example + set dot(y) [expr { int( [random] * 30000. + 90. ) / 100. } ] + } + label { + set dot(label) [ad_generate_random_string] + } + } + lappend row_list $dot($title) + } + # add row + lappend dc_larr($i) $row_list + } + # save dc curve + set dc_comments_arr($i) "This is a test table representing a distribution curve (dc)" + set dc_name_arr($i) "dc-[ad_generate_random_string] [ad_generate_random_string]" + set dc_title_arr($i) [string totitle $dc_name_arr($i)] + set type_guess [acc_fin::pretti_type_flag $dc_larr($i) ] + if { $type_guess ne "dc" } { + ns_log Notice "acc_fin::pretti_example_maker type should be 'dc'. Instead type_guess '$type_guess'" + } +# ns_log Notice "acc_fin::pretti_example_maker.289 dc saving dc_larr($i): $dc_larr($i)" + set dc_table_id_arr($i) [qss_table_create $dc_larr($i) $dc_name_arr($i) $dc_title_arr($i) $dc_comments_arr($i) "" $type_guess $package_id $user_id] + + } + + + # p3 + ns_log Notice "acc_fin::pretti_example_maker.294 p3 start" + set p3_larr [list ] + set param_arr(p3_cols) [expr { int( [random] * ( $param_arr(p3_cols_max) - $param_arr(p3_cols_min) + .99 ) ) + $param_arr(p3_cols_min) } ] + # required: type + set title_list $p31_list + set cols_diff [expr { $param_arr(p3_cols) - [llength $title_list] } ] + if { $cols_diff > 0 } { + # Try to make some sane choices by choosing groups of titles with consistency + # sane groupings of titles: + if { $cols_diff > 3 } { + # time_est_short time_est_median time_est_long + lappend title_list time_est_short time_est_median time_est_long + incr cols_diff -3 + } + if { $cols_diff > 3 } { + # cost_est_low cost_est_median cost_est_high + lappend title_list cost_est_low cost_est_median cost_est_high + incr cols_diff -3 + } + # ungrouped ones can include partial groupings: + # max_concurrent max_overlap_pct + # time_dist_curve_name time_dist_curve_tid + # name description + # cost_dist_curve_name cost_dist_curve_tid + # time_est_short time_est_median time_est_long + # cost_est_low cost_est_median cost_est_high + + # dependent_tasks + # dependent_types --not implemented + + set ungrouped_list $p30_list + foreach title $title_list { + # remove existing title from ungrouped_list + set title_idx [lsearch -exact $ungrouped_list $title] + if { $title_idx > -1 } { + set ungrouped_list [lreplace $ungrouped_list $title_idx $title_idx] + } else { + ns_log Notice "acc_fin::pretti_example_maker.327: title '$title' not found in p30 title list '${ungrouped_list}'" + } + } + set ungrouped_len [llength $ungrouped_list] + # set cols_diff expr $param_arr(p3_cols) - llength $title_list + while { $cols_diff > 0 && $ungrouped_len > 0} { + # Select a random column to add to title_list + set rand_idx [expr { int( [random] * $ungrouped_len ) } ] + lappend title_list [lindex $ungrouped_list $rand_idx] + set ungrouped_list [lreplace $ungrouped_list $rand_idx $rand_idx] + set ungrouped_len [llength $ungrouped_list] + incr cols_diff -1 + } + } + set title_list [acc_fin::shuffle_list $title_list] + lappend p3_larr $title_list + set p2_cols_list [list ] + set param_arr(p3_types) [expr { int( [random] * ( $param_arr(p3_types_max) - $param_arr(p3_types_min) + .99 ) ) + $param_arr(p3_types_min) } ] + ns_log Notice "acc_fin::pretti_example_maker.357: title_list '$title_list'" + for { set i 0} {$i < $param_arr(p3_types)} {incr i} { + # new row + set row_list [list ] + foreach title $title_list { + switch -exact $title { + time_est_short { + set row_arr($title) [expr { int( [random] * 256. + 5. ) / 24. } ] + } + time_est_median { + set row_arr($title) [expr { int( [random] * 256. + 10. ) / 12. } ] + } + max_run_time - + time_est_long { + set row_arr($title) [expr { int( [random] * 256. + 20. ) / 6. } ] + # a random amount, assume hours for a task for example + } + cost_est_low { + set row_arr($title) [expr { int( [random] * 100. + 90. ) / 100. } ] + } + cost_est_median { + set row_arr($title) [expr { int( [random] * 200. + 180. ) / 100. } ] + } + cost_est_high { + set row_arr($title) [expr { int( [random] * 400. + 360. ) / 100. } ] + # these could be usd or btc for example + } + max_tasks_per_run - + max_concurrent { + set row_arr($title) [expr { int( [random] * 12 ) + 1 } ] + } + max_overlap_pct { + set row_arr($title) [expr { int( [random] * 1000. ) / 1000. } ] + } + cost_dist_curve_name - + time_dist_curve_name { + if { $param_arr(dc_count) > 0 } { + set x [expr { int( [random] * $param_arr(dc_count) * .9 ) } ] + set row_arr($title) $dc_name_arr($x) + } else { + set row_arr($title) "" + } + } + cost_dist_curve_tid - + time_dist_curve_tid { + if { $param_arr(dc_count) > 0 } { + set x [expr { int( [random] * $param_arr(dc_count) * .9 ) } ] + set row_arr($title) $dc_table_id_arr($x) + } else { + set row_arr($title) "" + } + } + name - + description { + set row_arr($title) [ad_generate_random_string] + } + type { + set row_arr($title) [ad_generate_random_string] + # add to a list for referencing in p2 form for later + lappend p2_cols_list $row_arr($title) + + } + dependent_tasks - + dependent_types { + set row_arr($title) "" + } + default { + ns_log Notice "acc_fin::pretti_example_maker.394: no switch option for '$title'" + } + } + if { [info exists row_arr($title) ] } { + lappend row_list $row_arr($title) + array unset row_arr + } else { + ns_log Notice "acc_fin::pretti_example_maker.396: no switch option for '$title'" + lappend row_list "" + } + } + # add row + lappend p3_larr $row_list + } + # save p3 curve + set p3_comments "This is a test table of PRETTI activity types (p3)" + set p3_name "p3-[ad_generate_random_string] [ad_generate_random_string]" + set p3_title [string totitle ${p3_name}] + set type_guess [acc_fin::pretti_type_flag $p3_larr ] + if { $type_guess ne "p3" } { + ns_log Notice "acc_fin::pretti_example_maker type should be 'p3'. Instead type_guess '$type_guess'" + } + + set p3_table_id [qss_table_create $p3_larr ${p3_name} ${p3_title} $p3_comments "" $type_guess $package_id $user_id ] + + # p2 + ns_log Notice "acc_fin::pretti_example_maker.419 p2 start" + set p2_larr [list ] + set param_arr(p2_cols) [expr { int( [random] * ( $param_arr(p2_cols_max) - $param_arr(p2_cols_min) + .99 ) ) + $param_arr(p2_cols_min) } ] + # required: type + set title_list $p21_list + set cols_diff [expr { $param_arr(p2_cols) - [llength $title_list] } ] +# ns_log Notice "acc_fin::pretti_example_maker.434 cols_diff $cols_diff param_arr(p2_cols) '$param_arr(p2_cols)' title_list $title_list" + if { $cols_diff > 0 } { + # Try to make some sane choices by choosing groups of titles with consistency + # sane groupings of titles: + if { $cols_diff > 3 } { + # time_est_short time_est_median time_est_long + lappend title_list time_est_short time_est_median time_est_long + incr cols_diff -3 + } + if { $cols_diff > 3 } { + # cost_est_low cost_est_median cost_est_high + lappend title_list cost_est_low cost_est_median cost_est_high + incr cols_diff -3 + } +# ns_log Notice "acc_fin::pretti_example_maker.448 cols_diff $cols_diff title_list $title_list" + # ungrouped ones can include partial groupings: + # max_concurrent max_overlap_pct + # time_dist_curve_name time_dist_curve_tid + # name description + # cost_dist_curve_name cost_dist_curve_tid + # time_est_short time_est_median time_est_long + # cost_est_low cost_est_median cost_est_high + + # dependent_tasks + # dependent_types --not implemented + + set ungrouped_list $p20_list +# ns_log Notice "acc_fin::pretti_example_maker.430: ungrouped_list $ungrouped_list" + foreach title $title_list { + # remove existing title from ungrouped_list + set title_idx [lsearch -exact $ungrouped_list $title] + if { $title_idx > -1 } { + set ungrouped_list [lreplace $ungrouped_list $title_idx $title_idx] +# ns_log Notice "acc_fin::pretti_example_maker.432: title_idx $title_idx" + } else { + ns_log Notice "acc_fin::pretti_example_maker.435: title '$title' not found in p20 title list '${ungrouped_list}'" + } + } + set ungrouped_len [llength $ungrouped_list] + # set cols_diff expr $param_arr(p2_cols) - llength $title_list +# ns_log Notice "acc_fin::pretti_example_maker.480: ungrouped_len $ungrouped_len cols_diff $cols_diff" + while { $cols_diff > 0 && $ungrouped_len > 0 } { + # Select a random column to add to title_list + set rand_idx [expr { int( [random] * $ungrouped_len ) } ] + lappend title_list [lindex $ungrouped_list $rand_idx] + set ungrouped_list [lreplace $ungrouped_list $rand_idx $rand_idx] + set ungrouped_len [llength $ungrouped_list] + incr cols_diff -1 +# ns_log Notice "acc_fin::pretti_example_maker.481: ungrouped_len $ungrouped_len rand_idx $rand_idx cols_diff $cols_diff" + } +# ns_log Notice "acc_fin::pretti_example_maker.489" + } +# ns_log Notice "acc_fin::pretti_example_maker.490" + set title_list [acc_fin::shuffle_list $title_list] + lappend p2_larr $title_list + set p2_cols_len [llength $p2_cols_list] + set param_arr(p2_cols) [expr { int( [random] * ( $param_arr(p2_cols_max) - $param_arr(p2_cols_min) + .99 ) ) + $param_arr(p2_cols_min) } ] + set p3_to_p2_count_ratio [expr { $param_arr(p2_cols) / $p2_cols_len } ] + set p2_act_list [list ] +# ns_log Notice "acc_fin::pretti_example_maker.495: p2_cols_len $p2_cols_len p3_to_p2_count_ratio $p3_to_p2_count_ratio param_arr(p2_cols) title_list '$title_list'" + for { set i 0} {$i < $param_arr(p2_cols)} {incr i} { + # new row +# ns_log Notice "acc_fin::pretti_example_maker.497: i $i" + set row_list [list ] + foreach title $title_list { + switch -exact $title { + time_est_short { + set row_arr($title) [expr { int( [random] * 256. + 5. ) / 24. } ] + } + time_est_median { + set row_arr($title) [expr { int( [random] * 256. + 10. ) / 12. } ] + } + time_est_long { + # a random amount, assume hours for a task for example + set row_arr($title) [expr { int( [random] * 256. + 20. ) / 6. } ] + } + cost_est_low { + set row_arr($title) [expr { int( [random] * 100. + 90. ) / 100. } ] + } + cost_est_median { + set row_arr($title) [expr { int( [random] * 200. + 180. ) / 100. } ] + } + cost_est_high { + # these could be usd or btc for example + set row_arr($title) [expr { int( [random] * 400. + 360. ) / 100. } ] + } + max_concurrent { + set row_arr($title) [expr { int( [random] * 12 ) + 1 } ] + } + max_overlap_pct { + set row_arr($title) [expr { int( [random] * 1000. ) / 1000. } ] + } + cost_dist_curve_name - + time_dist_curve_name { + if { $param_arr(dc_count) > 0 } { + set x [expr { int( [random] * $param_arr(dc_count) * .9 ) } ] + set row_arr($title) $dc_name_arr($x) + } else { + set row_arr($title) "" + } + } + cost_dist_curve_tid - + time_dist_curve_tid { + if { $param_arr(dc_count) > 0 } { + set x [expr { int( [random] * $param_arr(dc_count) * .9 ) } ] + set row_arr($title) $dc_table_id_arr($x) + } else { + set row_arr($title) "" + } + } + activity_ref { + set row_arr($title) [ad_generate_random_string] + lappend p2_act_list $row_arr($title) + } + name - + description { + set row_arr($title) [ad_generate_random_string] + } + aid_type { + set x [expr { int( [random] * $p2_cols_len * 2. ) } ] + if { $x < $p2_cols_len } { + set row_arr($title) [lindex $p2_cols_list $x] + } else { + set row_arr($title) "" + } + } + dependent_tasks { + set row_arr($title) "" + set count [expr { int( pow( [random] * 2.2 , [random] * 3.5 ) ) } ] + set ii 1 + set delim "" + while { $ii < $count } { + set x [expr { int( [random] * $i ) } ] + append row_arr($title) $delim + append row_arr($title) [lindex $p2_act_list $x] + incr ii + set delim " " + } + } + cost_probability_point - + time_probability_point { + set row_arr($title) "" + } + default { + ns_log Notice "acc_fin::pretti_example_maker.520: shouldn't happen. no switch option for '$title'" + } + } + if { [info exists row_arr($title) ] } { + lappend row_list $row_arr($title) + array unset row_arr + } else { + ns_log Notice "acc_fin::pretti_example_maker.530: no switch option for '$title'" + lappend row_list "" + } + + } + # add row + lappend p2_larr $row_list + } + # save p2 curve + set p2_comments "This is a test table of PRETTI activity table (p2)" + set p2_name "p2-[ad_generate_random_string] [ad_generate_random_string]" + set p2_title [string totitle ${p2_name}] + set type_guess [acc_fin::pretti_type_flag $p2_larr ] + if { $type_guess ne "p2" } { + ns_log Notice "acc_fin::pretti_example_maker type should be 'p2'. Instead type_guess '$type_guess'" + } + + set p2_table_id [qss_table_create $p2_larr ${p2_name} ${p2_title} $p2_comments "" $type_guess $package_id $user_id ] + + # p1 + ns_log Notice "acc_fin::pretti_example_maker.560 p1 start" + # activity_table_tid + # activity_table_name task_types_tid + # task_types_name + # time_dist_curve_name time_dist_curve_tid + # cost_dist_curve_name cost_dist_curve_tid + # time_est_short time_est_median time_est_long + # time_probability_point + # cost_est_low cost_est_median cost_est_high + # cost_probability_point + # db_format (1 or 0) saves p5 report table if db_format ne "" + + set p1_larr [list ] + set param_arr(p1_vals) [expr { int( [random] * ( $param_arr(p1_vals_max) - $param_arr(p1_vals_min) + .99 ) ) + $param_arr(p1_vals_min) } ] + # required: name value + set title_list [list name value] + lappend p1_larr $title_list + # p1: activity_table_tid + # activity_table_name task_types_tid task_types_name time_dist_curve_name time_dist_curve_tid cost_dist_curve_name cost_dist_curve_tid time_est_short time_est_median time_est_long time_probability_point cost_est_low cost_est_median cost_est_high cost_probability_point db_format + set vals_list $p11_list + set vals_diff [expr { $param_arr(p1_vals) - [llength $p11_list] } ] + if { $vals_diff > 0 } { + # Try to make some sane choices by choosing groups of names with consistency + # sane groupings of names: + if { $vals_diff > 3 } { + # time_est_short time_est_median time_est_long + lappend vals_list time_est_short time_est_median time_est_long + incr vals_diff -3 + } + if { $vals_diff > 3 } { + # cost_est_low cost_est_median cost_est_high + lappend vals_list cost_est_low cost_est_median cost_est_high + incr vals_diff -3 + } + # ungrouped ones can include partial groupings: + # task_types_tid task_types_name + # time_dist_curve_name time_dist_curve_tid + # cost_dist_curve_name cost_dist_curve_tid + # db_format + # cost_probability_point + # time_probability_point + + # why not these: ?? max_concurrent max_overlap_pct + # currently defaults are unlimited and 100% overlapp + + set ungrouped_list $p10_list + foreach value $vals_list { + # remove existing name from ungrouped_list + set val_idx [lsearch -exact $ungrouped_list $value] + if { $val_idx > -1 } { + set ungrouped_list [lreplace $ungrouped_list $val_idx $val_idx] + } else { + ns_log Notice "acc_fin::pretti_example_maker.573: value '$value' not found in p10 title list '${ungrouped_list}'" + } + } + set ungrouped_len [llength $ungrouped_list] + # set vals_diff expr $param_arr(p1_vals) - llength $title_list + while { $vals_diff > 0 && $ungrouped_len > 0 } { + # Select a random column to add to title_list + set rand_idx [expr { int( [random] * $ungrouped_len ) } ] + lappend vals_list [lindex $ungrouped_list $rand_idx] + set ungrouped_list [lreplace $ungrouped_list $rand_idx $rand_idx] + set ungrouped_len [llength $ungrouped_list] +# ns_log Notice "acc_fin::pretti_example_maker.618: ungrouped_len $ungrouped_len rand_idx $rand_idx vals_diff $vals_diff" + incr vals_diff -1 + } + } + set vals_list [acc_fin::shuffle_list $vals_list] + set p1_types_len [llength $vals_list] +# ns_log Notice "acc_fin::pretti_example_maker.662: vals_list '$vals_list'" + + foreach name $vals_list { + set row_list [list ] + switch -exact $name { + time_est_short { + set row_arr($title) [expr { int( [random] * 256. + 5. ) / 24. } ] + } + time_est_median { + set row_arr($title) [expr { int( [random] * 256. + 10. ) / 12. } ] + } + time_est_long { + # a random amount, assume hours for a task for example + set row_arr($title) [expr { int( [random] * 256. + 20. ) / 6. } ] + } + cost_est_low { + set row_arr($title) [expr { int( [random] * 100. + 90. ) / 100. } ] + } + cost_est_median { + set row_arr($title) [expr { int( [random] * 200. + 180. ) / 100. } ] + } + cost_est_high { + # these could be usd or btc for example + set row_arr($title) [expr { int( [random] * 400. + 360. ) / 100. } ] + } + cost_dist_curve_name - + time_dist_curve_name { + if { $param_arr(dc_count) > -1 } { + set x [expr { int( [random] * $param_arr(dc_count) ) } ] + set row_arr($title) $dc_name_arr($x) + } else { + set row_arr($title) "" + } + } + cost_dist_curve_tid - + time_dist_curve_tid { + if { $param_arr(dc_count) > 0 } { + set x [expr { int( [random] * $param_arr(dc_count) ) } ] + set row_arr($title) $dc_table_id_arr($x) + } else { + set row_arr($title) "" + } + } + task_types_tid { + set row_arr($title) $p3_table_id + } + task_types_name { + set row_arr($title) $p3_name + } + activity_table_tid { + set row_arr($title) $p2_table_id + } + activity_table_name { + set row_arr($title) $p2_name + } + db_format - + name - + description { + set row_arr($title) [ad_generate_random_string] + } + max_concurrent { + set row_arr($title) [expr { int( [random] * 12 ) } ] + } + max_overlap_pct - + cost_probability_point - + time_probability_point { + # round off to nearest percent ( 0.01 ) + set row_arr($title) [expr { int( [random] * 100. ) / 100. } ] + } + } + if { [info exists row_arr($title) ] } { + lappend row_list $name $row_arr($title) + array unset row_arr + # add row to p1 table + lappend p1_larr $row_list + } else { + ns_log Notice "acc_fin::pretti_example_maker.673: no switch option for '$title'" + } + } + # save p1 table + set p1_comments "This is a test table of PRETTI scenario table (p1)" + set p1_name "p1-[ad_generate_random_string] [ad_generate_random_string]" + set p1_title [string totitle ${p1_name}] + set type_guess [acc_fin::pretti_type_flag $p1_larr ] + if { $type_guess ne "p1" } { + ns_log Notice "acc_fin::pretti_example_maker.671 type should be 'p1'. Instead type_guess '$type_guess'" + } + + set p1_table_id [qss_table_create $p1_larr ${p1_name} ${p1_title} $p1_comments "" $type_guess $package_id $user_id ] + # create a most simple test case using same data + set p1b_lists [list [list name value] [list activity_table_tid ${p2_table_id}] ] + set p1b_comments "This is a minimum test of PRETTI scenario table (p1)" + set p1b_name "p1-minimum [ad_generate_random_string]" + set p1b_title [string totitle ${p1b_name}] + + set type_guess [acc_fin::pretti_type_flag $p1b_lists ] + if { $type_guess ne "p1" } { + ns_log Notice "acc_fin::pretti_example_maker.683 type should be 'p1'. Instead type_guess '$type_guess'" + } + set p1b_table_id [qss_table_create $p1b_lists ${p1b_name} ${p1b_title} $p1b_comments "" $type_guess $package_id $user_id ] + # check that tables saved without error. + set status 1 + foreach {name dc_table_id} [array get dc_table_id_arr] { + if { $dc_table_id eq 0 } { + set status 0 + ns_log Notice "acc_fin::pretti_example_maker.690 dc_table_id for $name is '${dc_table_id}' instead of > 0." + } + } + if { $p1b_table_id eq 0 || $p1_table_id eq 0 || $p2_table_id eq 0 || $p3_table_id eq 0 } { + set status 0 + ns_log Notice "acc_fin::pretti_example_maker.695 all s/b > 0: p1b_table_id '$p1b_table_id' p1_table_id '$p1_table_id' p2_table_id '$p2_table_id' p3_table_id '$p3_table_id'" + } + if { $status } { + set status $p1_table_id + } + return $status +} Index: openacs-4/packages/accounts-finance/tcl/pretti-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/pretti-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/pretti-procs.tcl 14 Nov 2014 18:20:17 -0000 1.1 @@ -0,0 +1,4512 @@ +ad_library { + + PRETTI routines used for Project Reporting Evaluation and Track Task Interpretation + With Hints Of GANTT Activity Network Task Tracking (PRETTI WHO GANTT) + Project Activity Network Evaluation By Reporting Low Float Paths In Fast Tracks + @creation-date 11 Feb 2014 + @cvs-id $Id: + @Copyright (c) 2014 Benjamin Brink + @license GNU General Public License 3, see project home or http://www.gnu.org/licenses/gpl-3.0.en.html + @project home: http://github.com/tekbasse/accounts-finance + @address: po box 20, Marylhurst, OR 97036-0020 usa + @email: tekbasse@yahoo.com + + Temporary comment about git commit comments: http://xkcd.com/1296/ +} + +namespace eval acc_fin {} + +## acs-tcl/tcl/set-operation-procs.tcl + +ad_proc -private acc_fin::pretti_curve_time_multiply { + factor_curve_lol + tcurvenum + coefficient + scenario_id + user_id + instance_id +} { + Returns the multiple of a time curve after applying any defined constraints. + max_overlap_pct, max_concurrent, max_run_time, max_tasks_per_run, activity must be defined in space called by this proc. + Additionally, tasks_per_run and run_count are passed back for use with acc_fin::pretti_curve_cost_multiply +} { + upvar 1 max_tasks_per_run max_tasks_per_run + upvar 1 max_run_time max_run_time + upvar 1 max_overlap_pct max_overlap_pct + upvar 1 max_concurrent max_concurrent + upvar 1 activity activity + upvar 1 run_count run_count + upvar 1 tasks_per_run tasks_per_run + upvar 1 use_t_run_p use_t_run_p + upvar 1 t_constrained_by_time_p t_constrained_by_time_p + + # time_clarr(tcurvenum) curve is not available in regression testing. + if { $tcurvenum ne "" } { + upvar 1 time_clarr time_clarr + } else { + # create a fake tcurvenum and time_clarr + set tcurvenum 1 + set time_clarr($tcurvenum) $factor_curve_lol + } + + set use_t_run_p 1 + # create new curve based on the one referenced + # parameters: max_concurrent max_run_time max_tasks_per_run max_overlap_pct + # max_overlap_pct (as a percentage from 0 to 1, blank = 1) + # max_concurrent (as a positive integer, blank = no limit) + # max_run_time (as a decimal, blank = no limit) + # max_tasks_per_run (as a postive integer, blank = no limit) + + + # activity curve @tcurvenum + # for each point t(pp) in curve time_clarr($_tCurveRef), max_overlap_pct, max_concurrent, coeffient c + if { [qf_is_decimal $max_overlap_pct ] && $max_overlap_pct <= 1. && $max_overlap_pct >= 0. } { + # validated + } else { + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "max_overlap_pct" "#accounts-finance.value#" "max_overlap_pct '${max_overlap_pct}' #accounts-finance.Value_out_of_range_or_blank# #accounts-finance.Value_set_to# '1' (100%). (ref1520)" $user_id $instance_id + } + set max_overlap_pct 1. + } + if { [qf_is_decimal $max_concurrent ] && $max_concurrent >= 1 } { + # validated. should be a natural number, so round off + set max_concurrent [expr { round( $max_concurrent ) + 0. } ] + # coef_p1 * max_concurrent + coef_p2 = $coefficient + set block_count [expr { ceil( $coefficient / $max_concurrent ) + 0. } ] + # coef_p2 should be at most 1 less than max_concurrent + # max_trailing_pct = 1. - max_overlap_pct + } else { + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "max_concurrent" "#accounts-finance.value#" "max_concurrent '$max_concurrent' #accounts-finance.Value_out_of_range_or_blank# #accounts-finance.Value_set_to# #accounts-finance.no_limit# (ref1525)" $user_id $instance_id + } + # max_concurrent is coeffcient + set max_concurrent "" + set block_count 1. + } + if { [qf_is_decimal $max_run_time ] && $max_run_time > 0. } { + # validated + } else { + set max_run_time "" + } + if { [qf_is_decimal $max_tasks_per_run] && $max_tasks_per_run >= 1. } { + # validated, but should be a natural number + set max_tasks_per_run [expr { round( $max_tasks_per_run ) + 0. } ] + } else { + set max_tasks_per_run "" + } + + ## $coefficient count of tasks + ## a $block_count of tasks operates in up to $max_concurrent tasks per block + ## a partial block occupies the same amount of scheduled time as a full block + + # a run is a contiguous period of time. A run can be measured in run_time or task count + # or tpr_coef, where tpr_coef * task_time = run_time + ## max_run_time = max duration of a run in units of time + ## $tasks_per_run up to $max_tasks_per_run + ## a batch is a multiple of run cycles + + # Calculate batch duration in units of task_count assuming no run limits + # ie. first run is whole, subsequent runs are of length 1 - max_overlap + set max_dedicated_pct [expr { 1. - $max_overlap_pct } ] + set tasks_per_run $block_count + set tpr_coef [expr { 1. * $tasks_per_run * $max_dedicated_pct + $max_overlap_pct } ] + set run_count 1. + + if { $max_tasks_per_run ne "" && $max_tasks_per_run >= 1. } { + # Calculate duration assuming max_tasks_per_run + # adjust task_count and run_count? + if { $tasks_per_run > $max_tasks_per_run } { + set run_count [expr { ceil( $block_count / $max_tasks_per_run ) + 0. } ] + set tasks_per_run $max_tasks_per_run + set tpr_coef [expr { 1. * $tasks_per_run * $max_dedicated_pct + $max_overlap_pct } ] + } + } + #ns_log Notice "acc_fin::pretti_curve_time_multiply.119: max_run_time '${max_run_time}' max_overlap_pct '${max_overlap_pct}' max_tasks_per_run '${max_tasks_per_run}'" + #ns_log Notice "acc_fin::pretti_curve_time_multiply.121: initial: block_count '${block_count}' max_dedicated_pct '${max_dedicated_pct}' tasks_per_run '${tasks_per_run}' run_count '${run_count}'" + # create new dc based on old dc + set curve_lol [list ] + # add titles + set title_list [lindex $time_clarr($tcurvenum) 0] + set x_idx [lsearch -exact $title_list "x"] + set y_idx [lsearch -exact $title_list "y"] + set label_idx [lsearch -exact $title_list "label"] + set title_new_list [list "y" "x"] + if { $label_idx > -1 } { + lappend title_new_list "label" + } + lappend curve_lol $title_new_list + + if { $max_run_time ne "" } { + # Use a separate loop for scaling. + + foreach point [lrange $time_clarr($tcurvenum) 1 end] { + # point: x y label + set x [lindex $point $x_idx] + set y [lindex $point $y_idx] + if { $label_idx > -1 } { + set label [lindex $point $label_idx] + } + # run_time is y * tpr_coef + set tpr_coef [expr { 1. * $tasks_per_run * $max_dedicated_pct + $max_overlap_pct } ] + set run_time [expr { $y * $tpr_coef } ] + # y_new constrained by max_overlap_pct, max_concurrent, and max_tasks_per_run + set y_new [expr { $run_time * $run_count } ] + #ns_log Notice "acc_fin::pretti_curve_time_multiply.143: for point y $y tasks_per_run $tasks_per_run run_count $run_count run_time ${run_time} tpr_coef ${tpr_coef} y_new ${y_new}" + # constrain run_time by max_run_time? + # is run_time (optimally set using max_tasks_per_run) too long? + if { $run_time > $max_run_time && $y > 0. && $y < $max_run_time } { + set t_constrained_by_time_p 1 + # max_run_time per run is exceeded for this probability point (pp) + # calculate new tasks_per_run for this pp. + + # How many tasks fit in max_run_time? + if { $max_overlap_pct > 0. } { + set tasks_per_run_at_pp [expr { int( ( $max_run_time - $max_dedicated_pct * $y ) / ( $y * $max_overlap_pct ) ) } ] + } else { + # no overlap + set tasks_per_run_at_pp [expr { int( $max_run_time / $y ) } ] + } + set run_count_at_pp [expr { ceil( $block_count / ( $tasks_per_run_at_pp + 0. ) ) } ] + set tpr_coef_at_pp [expr { 1. * $tasks_per_run_at_pp * $max_dedicated_pct + $max_overlap_pct } ] + if { $run_count_at_pp >= $run_count } { + ns_log Warning "acc_fin::pretti_curve_time_multiply.2600: scenario '$scenario_tid' run_count_at_pp ${run_count_at_pp} should never be more than run_count ${run_count} here. tasks_per_run_at_pp '${tasks_per_run_at_pp}' y '$y' run_time '${run_time}' max_run_time '${max_run_time}'" + set error_time 1 + } + set y_new [expr { $y * $run_count_at_pp * $tpr_coef_at_pp } ] + #ns_log Notice "acc_fin::pretti_curve_time_multiply.170: for point y $y tasks_per_run_at_pp ${tasks_per_run_at_pp} tpr_coef_at_pp ${tpr_coef_at_pp} y_new ${y_new}" + } elseif { $run_time > $max_run_time } { + set t_constrained_by_time_p 1 + # y == 0 + # warn user for out of bounds value of Y + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "dc y=0" "#accounts-finance.value#" "activity '${activity}': y '${y}'; #accounts-finance.max_run_time_ignored_in_dc# #accounts-finance.in_dc_y_cannot_be_0# #accounts-finance.set_max_run_time_longer_or_blank# (ref2601)" $user_id $instance_id + } + + } elseif { $y > $max_run_time } { + # y duration is larger than max_run_time.. + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "dc y" "#accounts-finance.value#" "activity '${activity}': y '${y}'; #accounts-finance.in_dc_y_gt_max_run_time_ignored# #accounts-finance.set_max_run_time_longer_or_blank# (ref2602)" $user_id $instance_id + } + } + set point_new [list $y_new $x] + if { $label_idx > -1 } { + lappend point_new $label + } + lappend curve_lol $point_new + } + } else { + # max_run_time is unlimited + ns_log Notice "acc_fin::pretti_curve_time_multiply.190: max_tasks_per_run $max_tasks_per_run max_overlap_pct $max_overlap_pct max_dedicated_pct $max_dedicated_pct" + #set tpr_coef [expr { 1. * $tasks_per_run * $max_dedicated_pct + $max_overlap_pct } ] + foreach point [lrange $time_clarr($tcurvenum) 1 end] { + # point: x y label + set x [lindex $point $x_idx] + set y [lindex $point $y_idx] + if { $label_idx > -1 } { + set label [lindex $point $label_idx] + } + + set y_new [expr { $y * $run_count * $tpr_coef } ] + #ns_log Notice "acc_fin::pretti_curve_time_multiply.199: for point y $y tasks_per_run ${tasks_per_run} tpr_coef ${tpr_coef} y_new ${y_new}" + #ns_log Notice "acc_fin::pretti_curve_time_multiply.2631: scenario '$scenario_tid' y $y run_count ${run_count} tasks_per_run ${tasks_per_run} max_overlap_pct ${max_overlap_pct} max_dedicated_pct ${max_dedicated_pct} y_new ${y_new}" + set point_new [list $y_new $x] + if { $label_idx > -1 } { + lappend point_new $label + } + lappend curve_lol $point_new + } + } + return $curve_lol +} + +ad_proc -private acc_fin::pretti_curve_cost_multiply { + factor_curve_lol + ccurvenum + coefficient + scenario_id + user_id + instance_id +} { + Returns the multiple of a time curve after applying any defined constraints. + max_overlap_pct, max_concurrent, max_run_time, max_tasks_per_run, activity, run_count, tasks_per_run and use_t_run_p must be defined in space called by this proc. +} { + upvar 1 max_tasks_per_run max_tasks_per_run + upvar 1 max_run_time max_run_time + upvar 1 max_overlap_pct max_overlap_pct + upvar 1 max_concurrent max_concurrent + upvar 1 max_discount_pct max_discount_pct + upvar 1 activity activity + upvar 1 run_count run_count + upvar 1 tasks_per_run tasks_per_run + upvar 1 use_t_run_p use_t_run_p + upvar 1 t_constrained_by_time_p t_constrained_by_time_p + # cost_clarr(tcurvenum) curve is not available in regression testing. + if { $ccurvenum ne "" } { + upvar 1 cost_clarr cost_clarr + } else { + # create a fake ccurvenum and cost_clarr + set ccurvenum 1 + set cost_clarr($ccurvenum) $factor_curve_lol + } + + # New curve is isn't affected by overlap or max_concurrent max_run_time max_tasks_per_run. + # New curve is simple multiplication of old and coefficient + if { [qf_is_decimal $max_discount_pct ] && $max_discount_pct <= 1. && $max_discount_pct >= 0. } { + # validated + } else { + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "max_discount_pct" "#accounts-finance.value#" "max_discount_pct '${max_discount_pct}'; #accounts-finance.Value_out_of_range_or_blank# #accounts-finance.Value_set_to# '0'. (ref1620)" $user_id $instance_id + } + set max_discount_pct 0. + } + + # Calculate batch duration in units of task_count assuming no run limits + # ie. first run is whole, subsequent runs are of length 1 - max_overlap + set max_batch_rate_pct [expr { 1. - $max_discount_pct } ] + + # cost calcs are not affected by time constraints, but must match any existing constraints + if { $use_t_run_p && $t_constrained_by_time_p == 0 } { + #tasks_per_run and run_count are already calculated. Use same here. + } elseif { $use_t_run_p && $t_constrained_by_time_p } { + # Curve calculations get complicated since tcurve is different than ccurve. + # Assume the worse case. Ignore the discount. + set tasks_per_run 1. + set run_count $coefficient + } else { + if { [qf_is_decimal $max_concurrent ] && $max_concurrent >= 1 } { + # validated. should be a natural number, so round off + set max_concurrent [expr { round( $max_concurrent ) + 0. } ] + # coef_p1 * max_concurrent + coef_p2 = $coefficient + set block_count [expr { ceil( $coefficient / $max_concurrent ) + 0. } ] + # coef_p2 should be at most 1 less than max_concurrent + # max_trailing_pct = 1. - max_overlap_pct + } else { + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "max_concurrent" "#accounts-finance.value#" "max_concurrent '$max_concurrent'; #accounts-finance.Value_out_of_range_or_blank# #accounts-finance.Value_set_to# #accounts-finance.no_limit# (ref1625)" $user_id $instance_id + } + # max_concurrent is coeffcient + set max_concurrent "" + set block_count 1. + } + + set tasks_per_run [expr { 1. + ( $block_count - 1. ) * $max_batch_rate_pct } ] + set run_count 1. + + if { $max_tasks_per_run ne "" && $max_tasks_per_run >= 1. } { + # Calculate duration assuming max_tasks_per_run + # adjust task_count and run_count? + if { $tasks_per_run > $max_tasks_per_run } { + set run_count [expr { ceil( $block_count / $max_tasks_per_run ) + 0. } ] + set tasks_per_run $max_tasks_per_run + } + } + } + + + # create new curve + set curve_lol [list ] + # add titles + set title_list [lindex $cost_clarr($ccurvenum) 0] + set x_idx [lsearch -exact $title_list "x"] + set y_idx [lsearch -exact $title_list "y"] + set label_idx [lsearch -exact $title_list "label"] + set title_new_list [list "y" "x"] + if { $label_idx > -1 } { + lappend title_new_list "label" + } + lappend curve_lol $title_new_list + foreach point [lrange $cost_clarr($ccurvenum) 1 end] { + # point: x y label + set x [lindex $point $x_idx] + set y [lindex $point $y_idx] + if { $label_idx > -1 } { + set label [lindex $point $label_idx] + } + #set y_new [expr { $y * $coefficient } ] + # max_batch_rate_pct was max_overlap_pct + # max_discount_pct was max_dedicated_pct + set y_new [expr { $y * $run_count * ( 1. * $tasks_per_run * $max_batch_rate_pct + $max_discount_pct ) } ] + set point_new [list $y_new $x] + if { $label_idx > -1 } { + lappend point_new $label + } + lappend curve_lol $point_new + } + return $curve_lol +} + + +ad_proc -private acc_fin::pretti_curve_eco2_multiply { + factor_curve_lol + ecurvenum + coefficient + scenario_id + user_id + instance_id +} { + Returns the multiple of a eco2 curve after applying any defined constraints. + max_overlap_pct, max_concurrent, max_run_time, max_tasks_per_run, activity, run_count, tasks_per_run and use_t_run_p must be defined in space called by this proc. +} { + upvar 1 max_tasks_per_run max_tasks_per_run + upvar 1 max_run_time max_run_time + upvar 1 max_overlap_pct max_overlap_pct + upvar 1 max_concurrent max_concurrent + upvar 1 max_reduction_pct max_reduction_pct + upvar 1 activity activity + upvar 1 run_count run_count + upvar 1 tasks_per_run tasks_per_run + upvar 1 use_t_run_p use_t_run_p + upvar 1 t_constrained_by_time_p t_constrained_by_time_p + # eco2_clarr(tcurvenum) curve is not available in regression testing. + if { $ecurvenum ne "" } { + upvar 1 eco2_clarr eco2_clarr + } else { + # create a fake ecurvenum and eco2_clarr + set ecurvenum 1 + set eco2_clarr($ecurvenum) $factor_curve_lol + } + + # New curve is isn't affected by overlap or max_concurrent max_run_time max_tasks_per_run. + # New curve is simple multiplication of old and coefficient + if { [qf_is_decimal $max_reduction_pct ] && $max_reduction_pct <= 1. && $max_reduction_pct >= 0. } { + # validated + } else { + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "max_reduction_pct" "#accounts-finance.value#" "max_reduction_pct '${max_reduction_pct}'; #accounts-finance.Value_out_of_range_or_blank# #accounts-finance.Value_set_to# '0'. (ref1620)" $user_id $instance_id + } + set max_reduction_pct 0. + } + + # Calculate batch duration in units of task_count assuming no run limits + # ie. first run is whole, subsequent runs are of length 1 - max_overlap + set max_batch_rate_pct [expr { 1. - $max_reduction_pct } ] + + # eco2 calcs are not affected by time constraints, but must match any existing constraints + if { $use_t_run_p && $t_constrained_by_time_p == 0 } { + #tasks_per_run and run_count are already calculated. Use same here. + } elseif { $use_t_run_p && $t_constrained_by_time_p } { + # Curve calculations get complicated since tcurve is different than ecurve. + # Assume the worse case. Ignore the reduction. + set tasks_per_run 1. + set run_count $coefficient + } else { + if { [qf_is_decimal $max_concurrent ] && $max_concurrent >= 1 } { + # validated. should be a natural number, so round off + set max_concurrent [expr { round( $max_concurrent ) + 0. } ] + # coef_p1 * max_concurrent + coef_p2 = $coefficient + set block_count [expr { ceil( $coefficient / $max_concurrent ) + 0. } ] + # coef_p2 should be at most 1 less than max_concurrent + # max_trailing_pct = 1. - max_overlap_pct + } else { + if { $user_id > 0 } { + acc_fin::pretti_log_create $scenario_tid "max_concurrent" "#accounts-finance.value#" "max_concurrent '$max_concurrent'; #accounts-finance.Value_out_of_range_or_blank# #accounts-finance.Value_set_to# #accounts-finance.no_limit# (ref1625)" $user_id $instance_id + } + # max_concurrent is coeffcient + set max_concurrent "" + set block_count 1. + } + + set tasks_per_run [expr { 1. + ( $block_count - 1. ) * $max_batch_rate_pct } ] + set run_count 1. + + if { $max_tasks_per_run ne "" && $max_tasks_per_run >= 1. } { + # Calculate duration assuming max_tasks_per_run + # adjust task_count and run_count? + if { $tasks_per_run > $max_tasks_per_run } { + set run_count [expr { ceil( $block_count / $max_tasks_per_run ) + 0. } ] + set tasks_per_run $max_tasks_per_run + } + } + } + + + # create new curve + set curve_lol [list ] + # add titles + set title_list [lindex $eco2_clarr($ecurvenum) 0] + set x_idx [lsearch -exact $title_list "x"] + set y_idx [lsearch -exact $title_list "y"] + set label_idx [lsearch -exact $title_list "label"] + set title_new_list [list "y" "x"] + if { $label_idx > -1 } { + lappend title_new_list "label" + } + lappend curve_lol $title_new_list + foreach point [lrange $eco2_clarr($ecurvenum) 1 end] { + # point: x y label + set x [lindex $point $x_idx] + set y [lindex $point $y_idx] + if { $label_idx > -1 } { + set label [lindex $point $label_idx] + } + #set y_new [expr { $y * $coefficient } ] + # max_batch_rate_pct was max_overlap_pct + # max_reduction_pct was max_dedicated_pct + set y_new [expr { $y * $run_count * ( 1. * $tasks_per_run * $max_batch_rate_pct + $max_reduction_pct ) } ] + set point_new [list $y_new $x] + if { $label_idx > -1 } { + lappend point_new $label + } + lappend curve_lol $point_new + } + return $curve_lol +} + + +ad_proc -public acc_fin::pretti_color_chooser { + on_cp_p + on_a_sig_path_p + odd_row_p + popularity + max_act_count_per_track + cp_duration + path_duration + {color_cp_mask_idx "3"} + {color_sig_mask_idx "5"} + {row_contrast "-8"} +} { + Returns an html color in hex value based on parameters. popularity is 0..1. +} { + # create a list of cells from highest priority to lowest. + # from acc_fin::pretti_table_to_html + + # build formatting colors + + set hex_list [list 0 1 2 3 4 5 6 7 8 9 a b c d e f] + set bin_list [list 000 100 010 110 001 101 011 111] + #set row_contrast -7 + set color_cp_mask [lindex $bin_list $color_cp_mask_idx] + set color_cp_mask_list [split $color_cp_mask ""] + set color_sig_mask [lindex $bin_list $color_sig_mask_idx] + set color_sig_mask_list [split $color_sig_mask ""] + + set k2 [expr { 127. / ( $max_act_count_per_track + 0. ) } ] + + if { $on_cp_p > -1 } { + # ..from acc_fin::pretti_table_to_html + # intensity is 0 to 15. + # subtract 1 for contrast variance + # which leaves color variance 0 to 14 + if { $on_cp_p || $path_duration == $cp_duration } { + set color_mask_list $color_cp_mask_list + set c1 255 + set c0 127 + } else { + set color_mask_list $color_sig_mask_list + set dur_ratio_case [expr { round( 255 * $path_duration / ( $cp_duration + 0. ) ) } ] + if { $on_a_sig_path_p } { + set pop_case [expr { 127 + int( $popularity * $k2 + 1. ) } ] + set max_case [f::max $pop_case $dur_ratio_case ] + set c1 [f::max 0 [f::min 255 $max_case ]] + set c0 127 + + } else { + set c0 127 + set pop_case [expr { int( $popularity * $k2 + 1. ) } ] + set max_case [f::max $pop_case $dur_ratio_case ] + set c1 [f::max 0 [f::min 255 $max_case ]] + } + } + # set c0 [expr { 255 - $c1 } ] + if { $odd_row_p } { + incr c1 $row_contrast + # incr c0 [f::sum $color_mask_list] + } + # convert rgb to hexidecimal + set c0e1 [expr { int( $c0 / 16. ) } ] + set c0e0 [expr { $c0 - $c0e1 * 16 } ] + set h(0) [lindex $hex_list [f::max 0 [f::min 15 $c0e1 ]]] + append h(0) [lindex $hex_list [f::max 0 [f::min 15 $c0e0 ]]] + set hex_arr($c0) $h(0) + + set c1e1 [expr { int( $c1 / 16. ) } ] + set c1e0 [expr { $c1 - $c1e1 * 16 } ] + set h(1) [lindex $hex_list [f::max 0 [f::min 15 $c1e1 ]]] + append h(1) [lindex $hex_list [f::max 0 [f::min 15 $c1e0 ]]] + set hex_arr($c1) $h(1) + + set colorhex "" + foreach mask $color_mask_list { + append colorhex $h($mask) + } + if { [string length $colorhex] != 6 } { + ns_log Notice "acc_fin::pretti_color_chooser.914: issue colorhex '$colorhex' on_a_sig_path_p ${on_a_sig_path_p} popularity $popularity on_cp_p $on_cp_p c0 '$c0' c1 '$c1' h(0) $h(0) h(1) $h(1) color_mask_list '${color_mask_list}' odd_row_p '${odd_row_p}" + set colorhex "ffffff" + } + } else { + set colorhex "4f4f4f" + } + return $colorhex +} + + +ad_proc -public acc_fin::pretti_equation_vars { +} { + Returns a list of value triplets, where each value pair consists of 1. a variable name used in pretti custom equation feature, 2. a human legible variable equivalent, and 3. a brief definition of the variable +} { + set vars_lol [list [list 0 path_len "Number of different activities in path"] \ + [list 1 path_len_w_coefs "Number of activities in path"] \ + [list 2 act_cp_ratio "Ratio of activities in path that are also in Critical Path"] \ + [list 3 cost_ratio "Cost ratio: cost of path / cost of project"] \ + [list 4 on_critical_path_p "1 if path is Critical Path, otherwise 0"] \ + [list 5 duration_ratio "Duration ratio: duration of path / duration of Critical Path"] \ + [list 6 path_counter "A path's sequence number from Critical Path based on PRETTI index"] \ + [list 7 act_count_median "Median count of unique activities on a path."] \ + [list 8 act_count_max "Max count of unqiue activities on a path."] \ + [list 9 paths_count "Count of all complete paths."] \ + [list 10 a_sig_path_p "1 if path contains at least one activity that is above the median count (act_path_count_median), otherwise 0"] ] + return $vars_lol +} + +ad_proc -private acc_fin::pretti_log_create { + table_tid + action_code + action_title + entry_text + {user_id ""} + {instance_id ""} +} { + Log an entry for a pretti process. Returns unique entry_id if successful, otherwise returns empty string. +} { + set id "" + set status [qf_is_natural_number $table_tid] + if { $status } { + if { $entry_text ne "" } { + if { $instance_id eq "" } { + ns_log Notice "acc_fin::pretti_log_create.451: instance_id ''" + set instance_id [ad_conn package_id] + } + if { $user_id eq "" } { + ns_log Notice "acc_fin::pretti_log_create.451: user_id ''" + set user_id [ad_conn user_id] + } + set id [db_nextval qaf_id_seq] + set trashed_p 0 + set nowts [dt_systime -gmt 1] + set action_code [qf_abbreviate $action_code 38] + set action_title [qf_abbreviate $action_title 78] + db_dml qaf_process_log_create { insert into qaf_process_log + (id,table_tid,instance_id,user_id,trashed_p,name,title,created,last_modified,log_entry) + values (:id,:table_tid,:instance_id,:user_id,:trashed_p,:action_code,:action_title,:nowts,:nowts,:entry_text) } + ns_log Notice "acc_fin::pretti_log_create.46: posting to qaf_process_log: action_code ${action_code} action_title ${action_title} '$entry_text'" + } else { + ns_log Warning "acc_fin::pretti_log_create.48: attempt to post an empty log message has been ignored." + } + } else { + ns_log Warning "acc_fin::pretti_log_create.51: table_tid '$table_tid' is not a natural number reference. Log message '${entry_text}' ignored." + } + return $id +} + +ad_proc -public acc_fin::pretti_log_read { + table_tid + {max_old "1"} + {user_id ""} + {instance_id ""} +} { + Returns any new log entries as a list via util_user_message, otherwise returns most recent max_old number of log entries. + Returns empty string if no entry exists. +} { + set return_lol [list ] + set alert_p 0 + set nowts [dt_systime -gmt 1] + set valid1_p [qf_is_natural_number $table_tid] + set valid2_p [qf_is_natural_number $table_tid] + if { $valid1_p && $valid2_p } { + if { $instance_id eq "" } { + set instance_id [ad_conn package_id] + ns_log Notice "acc_fin::pretti_log_read.493: instance_id ''" + } + if { $user_id eq "" } { + set user_id [ad_conn user_id] + ns_log Notice "acc_fin::pretti_log_read.497: user_id ''" + } + set return_lol [list ] + set last_viewed "" + set alert_msg_count 0 + set viewing_history_p [db_0or1row qaf_process_log_viewed_last { select last_viewed from qaf_process_log_viewed where instance_id = :instance_id and table_tid = :table_tid and user_id = :user_id } ] + # set new view history time + if { $viewing_history_p } { + + set last_viewed [string range $last_viewed 0 18] + if { $last_viewed ne "" } { + + set entries_lol [db_list_of_lists qaf_process_log_read_new { + select id, name, title, log_entry, last_modified from qaf_process_log + where instance_id = :instance_id and table_tid =:table_tid and last_modified > :last_viewed order by last_modified desc } ] + + ns_log Notice "acc_fin::pretti_log_read.80: last_viewed ${last_viewed} entries_lol $entries_lol" + + if { [llength $entries_lol ] > 0 } { + set alert_p 1 + set alert_msg_count [llength $entries_lol] + foreach row $entries_lol { + set message_txt "[lc_time_system_to_conn [string range [lindex $row 4] 0 18]] [lindex $row 3]" + set last_modified [lindex $row 4] + ns_log Notice "acc_fin::pretti_log_read.79: last_modified ${last_modified}" + util_user_message -message $message_txt + ns_log Notice "acc_fin::pretti_log_read.88: message '${message_txt}'" + } + set entries_lol [list ] + } + } + + set max_old [expr { $max_old + $alert_msg_count } ] + set entries_lol [db_list_of_lists qaf_process_log_read_one { + select id, name, title, log_entry, last_modified from qaf_process_log + where instance_id = :instance_id and table_tid =:table_tid order by last_modified desc limit :max_old } ] + foreach row [lrange $entries_lol $alert_msg_count end] { + set message_txt [lindex $row 2] + append message_txt " ([lindex $row 1])" + append message_txt " posted: [lc_time_system_to_conn [string range [lindex $row 4] 0 18]]\n " + append message_txt [lindex $row 3] + ns_log Notice "acc_fin::pretti_log_read.100: message '${message_txt}'" + lappend return_lol $message_txt + } + + # last_modified ne "", so update + db_dml qaf_process_log_viewed_update { update qaf_process_log_viewed set last_viewed = :nowts where instance_id = :instance_id and table_tid = :table_tid and user_id = :user_id } + } else { + # create history + set id [db_nextval qaf_id_seq] + db_dml qaf_process_log_viewed_create { insert into qaf_process_log_viewed + ( id, instance_id, user_id, table_tid, last_viewed ) + values ( :id, :instance_id, :user_id, :table_tid, :nowts ) } + } + } + return $return_lol +} + + +ad_proc -public acc_fin::pert_omp_to_strict_dc { + optimistic + most_likely + pessimistic + {labels_p "0"} +} { + Creates a curve in PRETTI table format representing strict characteristics of + a PERT expected time function (Te), where + Te = ( o + 4 * m + p ) / 6 and o = optimistic time, m = most likely time, and p = pessimistic time. + This 3 point curve has lower limit (o), upper limit (p) and median (m). If labels_p is true, adds a labels column; Labels describe a little about each point. +} { + if { $labels_p ne "0" && $labels_p ne "1" } { + set labels_p "0" + } + # ns_log Notice "acc_fin::pert_omp_to_strict_dc.24: optimistic $optimistic most_likely $most_likely pessimistic $pessimistic" + # nomenclature of inputs statistics: + # set median $most_likely + # set minimum $optimistic + # set maximum $pessimistic + set curve_lists [list ] + if { $labels_p } { + lappend curve_lists [list y x label] + set one_sixth [expr { 1. / 6. } ] + set point_list [list $optimistic $one_sixth "optimistic / minimum"] + lappend curve_lists $point_list + set point_list [list $most_likely [expr { 4. / 6. } ] "most likely / median"] + lappend curve_lists $point_list + set point_list [list $pessimistic $one_sixth "pessimistic / maximum"] + lappend curve_lists $point_list + } else { + lappend curve_lists [list y x] + set one_sixth [expr { 1. / 6. } ] + set point_list [list $optimistic $one_sixth] + lappend curve_lists $point_list + set point_list [list $most_likely [expr { 4. / 6. } ] ] + lappend curve_lists $point_list + set point_list [list $pessimistic $one_sixth] + lappend curve_lists $point_list + } + return $curve_lists +} + +ad_proc -public acc_fin::pert_omp_to_normal_dc { + optimistic + most_likely + pessimistic + {n_points "24"} + {labels_p "0"} +} { + Creates a normal distribution curve in PRETTI table format representing characteristics of + a PERT expected time function (Te), where + Te = ( o + 4 * m + p ) / 6 and o = optimistic time, m = most likely time, and p = pessimistic time. + The normal distribution curve has lower limit (o), upper limit (p) and median (m). + Regression tests at accounts-finance/tcl/test/pretti-test-procs.tcl suggests 24 points minimum for a practical representation of a curve. + 18 point is about the absolute minimum practical amount for passing a clear majority of regression tests to within 1%. 5 is lowest number of points accepted. + See also acc_fin::pert_omp_to_stric_dc for a 3 point curve that matches project management representation of the Time expected curve. +} { + if { $n_points eq "" } { + set n_points "24" + } + set n_points [f::max [expr { int( $n_points ) } ] 5] + if { $labels_p ne "0" && $labels_p ne "1" } { + set labels_p "0" + } + + ns_log Notice "acc_fin::pert_omp_to_normal_dc.23: starting" + ns_log Notice "acc_fin::pert_omp_to_normal_dc.24: optimistic $optimistic most_likely $most_likely pessimistic $pessimistic n_points $n_points" + # nomenclature of inputs statistics: + # set median $most_likely + # set minimum $optimistic + # set maximum $pessimistic + set curve_lists [qaf_std_normal_distribution $n_points 2 $labels_p] + ns_log Notice "acc_fin::pert_omp_to_normal_dc.305. llength $curve_lists $curve_lists] curve_lists $curve_lists" + # for purposes of qaf DCs, x_dev is y, standard f(x) = y is used to calculate area + # Therefore titles do not match variables used with standard equation. + + # change title rows to: + #set title_row [list y f_of_x x a] + # was set title_row [list x_dev y x a] + # except, y gets created/renamed in qaf_table_column_convert, so + # no need need to change title here. + #set curve_lists [lreplace $curve_lists $title_row 0 0] + + set y_min [lindex [lindex $curve_lists 1] 0] + set y_max [lindex [lindex $curve_lists end] 0] + #set bars_count [expr { [llength $curve_lists] - 1 } ] + #set med_idx [expr { $bars_count / 2. + 1 } ] + #set y_med [lindex [lindex $cure_lists $med_idx] ] + # y_med is 0. for std_normal_distributions + set y_med 0. + set curve_lists [qaf_table_column_convert $curve_lists x_dev $y_min $y_med $y_max y $optimistic $most_likely $pessimistic] + return $curve_lists +} + + +ad_proc -public acc_fin::pert_omp_to_normal_dc_old { + optimistic + most_likely + pessimistic + {n_points "24"} + {labels_p "0"} +} { + Creates a normal distribution curve in PRETTI table format representing characteristics of + a PERT expected time function (Te), where + Te = ( o + 4 * m + p ) / 6 and o = optimistic time, m = most likely time, and p = pessimistic time. + The normal distribution curve has lower limit (o), upper limit (p) and median (m). + Regression tests at accounts-finance/tcl/test/pretti-test-procs.tcl suggests 24 points minimum for a practical representation of a curve. + 18 point is about the absolute minimum practical amount for passing a clear majority of regression tests to within 1%. 5 is lowest number of points accepted. + See also acc_fin::pert_omp_to_stric_dc for a 3 point curve that matches project management representation of the Time expected curve. +} { + if { $n_points eq "" } { + set n_points "24" + } + if { $labels_p ne "0" && $labels_p ne "1" } { + set labels_p "0" + } + + ns_log Notice "acc_fin::pert_omp_to_normal_dc.23: starting" + ns_log Notice "acc_fin::pert_omp_to_normal_dc.24: optimistic $optimistic most_likely $most_likely pessimistic $pessimistic n_points $n_points" + # nomenclature of inputs statistics: + # set median $most_likely + # set minimum $optimistic + # set maximum $pessimistic + set n_points [f::max [expr { int( $n_points ) } ] 5] + set n_areas [expr { int( $n_points - 1 ) } ] + # eps = 2.22044604925e-016 = Smallest number such that 1+eps != 1 from: http://wiki.tcl.tk/15256 + set eps 2.22044604925e-016 + # Create a limit of largest single step area could possibly be, to avoid binary calc tangents + set largest_a [expr { 0.5 - ( $eps * $n_areas ) } ] + #set pi 3.14159265358979 + set pi [expr { atan2( 0. , -1. ) } ] + #set e 2.718281828459 see exp() + set sqrt_2pi [expr { sqrt( 2. * $pi ) } ] + set sqrt_2 [expr { sqrt( 2. ) } ] + set optimistic [expr { $optimistic + 0. } ] + set most_likely [expr { $most_likely + 0. } ] + set pessimistic [expr { $pessimistic + 0. } ] + + # Build a curve using Normal Distribution calculations as a base + + # Split the curve into two tails, in case med - min value does not equal max - med. + + # Symetric calculations use indexed arrays to swap between tails. + # Index of: + # 0 = left tail + # 1 = right tail + + # Left tail represents minimum to median. + # So, create a standard_deviation for left side by assuming curve is symmetric: + # set std_dev_left [expr { sqrt( 2 * pow( $minimum - $median , 2) + 4 * pow( $median - $median , 2) ) } ] + # resolves to: + # set std_dev_left [expr { sqrt( 2 * pow( $minimum - $median , 2) ) } ] + # which further reduces to: + + set std_dev(0) [expr { $sqrt_2 * abs( $most_likely - $optimistic ) } ] + # set variance(0) [expr { pow( $std_dev(0) , 2. ) } ] + # set precision(0) [expr { 1. / $std_dev(0) } ] + # set precision2(0) [expr { 1. / pow( $std_dev(0) , 2. ) } ] + set precision(0) 1. + set precision2(0) [expr { pow( $precision(0) , 2. ) } ] + + # Right tail represents median to maximum. + set std_dev(1) [expr { $sqrt_2 * abs( $pessimistic - $most_likely ) } ] + # set variance(1) [expr { 2. * pow( $std_dev(1) , 2. ) } ] + # set precision(1) [expr { 1. / $std_dev(1) } ] + # set precision2(1) [expr { 1. / pow( $std_dev(1) , 2. ) } ] + set precision(1) 1. + set precision2(1) [expr { pow( $precision(1) , 2. ) } ] + + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.42: std_dev_left $std_dev(0) std_dev_right $std_dev(1)" + # f(x) is the normal distribution function. x = 0 at $median + + # for each section of the curve divided into p_count() ie ($n_areas /2) sections of approximately equal area. + # since each tail has working area of circa 0.5 (std*2 = 0.4772 actually), delta_area is circa 0.5 / p_count() + # given 2 points on curve f(x) = y, (x0,y0), (x1,y1) defines an approximate area, where + # delta_area = 0.5 * ( y0 + y1 ) ( x1 - x0 ) and + # delta_area = 0.5 / p_count + + # given x0,y0, n_areas, if y1 is estimated as y0 - y_range / p_count + # x1 is approx 1 / ( n_areas * ( y0 + y1) ) + # if y1 is approximated equal to y0 + # x1 is approx 1 / (n_areas * 2 * y0 ) + + # f(x) = k * pow( $e , -0.5 * pow( $x - $median , 2. ) ) + # where k = 1. / sqrt( 2. * $pi ) + # where x is -2. * std_dev_left to 2. * std_dev_right + # and value at x is : + # if x < 0 + # $minimum + sigma f( $x from -2. * $std_dev_left to x = 0 ) * p_count() + # if x => 0 + # $median + sigma f( $x from x = 0 to 2. * $std_dev_right ) * p_count() + + # Determine x points. Start with 0 to get critical area near distribution peak. + + # if there is an odd number of areas, use the extra one on the longer side + if { $std_dev(0) > $std_dev(1) } { + set p_count(1) [expr { int( $n_areas / 2. ) } ] + set p_count(0) [expr { $n_areas - $p_count(1) } ] + } else { + set p_count(0) [expr { int( $n_areas / 2. ) } ] + set p_count(1) [expr { $n_areas - $p_count(0) } ] + } + + # create tails and their analogs + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.83: n_areas $n_areas p_count(0) $p_count(0) p_count(1) $p_count(1)" + # from median to double standard deviation to approximate OMP calculations + + # left tail, assume symmetric, but calculate to reduce error + set y_range_arr(0) [expr { ( $most_likely - $optimistic ) } ] + set fx_limit(0) $optimistic + # right tail, assume symmetric + set y_range_arr(1) [expr { ( $pessimistic - $most_likely ) } ] + set fx_limit(1) $pessimistic + + foreach ii [list 0 1] { + set x_larr($ii) [list ] + set y_larr($ii) [list ] + set a_larr($ii) [list ] + set da_larr($ii) [list ] + set fx_larr($ii) [list ] + # standard deviation = sigma + + # range of x over f(x) is -2. * std_dev_left to 2. * std_dev_right + # let's break the areas somewhat equally, or to increase with each iteration + # x2 can be approximated all sorts of ways. + # A linear progression is used. + # An integration eq over a partial derivative might be more appropriate later. + + set a 0. + set a_prev $a + + set x1 0. + # set y1 [expr { exp( -0.5 * pow( $x1 , 2. ) ) / $sqrt_2pi } ] + # set y1 [expr { exp( -0.5 * pow( $x1 , 2. ) / $variance($ii) ) / ( $std_dev($ii) * $sqrt_2pi ) } ] + # set y1 [expr { exp( -0.5 * pow( $x1 , 2. ) / $variance($ii) ) / $sqrt_2pi } ] + set y1 [f::max $eps [expr { $precision($ii) * exp( -0.5 * $precision2($ii) * pow( $x1 , 2. ) ) / $sqrt_2pi } ]] + + # estimate delta_x and a: + set block_count [lindex [qaf_triangular_numbers [expr { $p_count($ii) - 0 } ]] end] + set numerator 0 + + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.90: ii $ii p_count($ii) $p_count($ii) block_count $block_count numerator $numerator std_dev($ii) $std_dev($ii)" + + # first point in tail: + set step_021 [f::max $eps [expr { $numerator / $block_count } ]] + lappend y_larr($ii) $y1 + lappend x_larr($ii) $x1 + + # Calculations are from x = 0 to x = std_dev + # Therefore, left tail needs flipped afterward + + # At the end of the loop, calculate the last point manually. + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.99: i '' x1 '$x1' delta_x '' y2 '' y1 '$y1' f_x '' numerator $numerator step_021 $step_021" + for {set i 0 } { $i < $p_count($ii) } { incr i } { + set numerator [expr { $numerator + 1. } ] + + set step_021 [expr { $numerator / $block_count + $step_021 } ] + set x2 [f::max $eps [expr { $std_dev($ii) * $step_021 } ]] + set delta_x [f::max $eps [expr { $x2 - $x1 } ]] + # Calculate y2 = f(x) = using the normal probability density function + # set y2 [expr { exp( -0.5 * pow( $x2 , 2. ) ) / $sqrt_2pi } ] + # set y2 [expr { exp( -0.5 * pow( $x2 , 2. ) / $variance($ii) ) / ( $std_dev($ii) * $sqrt_2pi ) } ] + # set y2 [expr { exp( -0.5 * pow( $x2 , 2. ) / $variance($ii) ) / $sqrt_2pi } ] + set y2 [f::max $eps [expr { $precision($ii) * exp( -0.5 * $precision2($ii) * pow( $x2 , 2. ) ) / $sqrt_2pi } ]] + + # Calculate area under normal distribution curve. + set a [f::min $largest_a [expr { $a + $delta_x * ( $y2 + $y1 ) / 2. } ]] + set delta_a [f::max $eps [expr { $a - $a_prev } ]] + + if { $ii } { + # Right tail + set f_x [expr { $most_likely + $y_range_arr(1) * $step_021 } ] + } else { + # Left tail + set f_x [expr { $most_likely - $y_range_arr(0) * $step_021 } ] + } + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.100: i $i x2 '$x2' x1 '$x1' delta_x '$delta_x' y2 '$y2' y1 '$y1' f_x '$f_x' numerator $numerator step_021 $step_021 a $a delta_a $delta_a" + lappend x_larr($ii) $x2 + lappend y_larr($ii) $y2 + lappend a_larr($ii) $a + lappend da_larr($ii) $delta_a + lappend fx_larr($ii) $f_x + set y1 $y2 + set x1 $x2 + set a_prev $a + + } + # Test area under normal distribution curve. + set a_arr($ii) [f::sum $da_larr($ii)] + + } + + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.116: a_arr(0) $a_arr(0) a_arr(1) $a_arr(1)" + # tail areas must be equal. + if { $a_arr(1) != $a_arr(0) } { + ns_log Notice "acc_fin::pert_omp_to_normal_dc.118: a_arr(0) of $a_arr(0) != a_arr(1) $a_arr(1)" + } + + # build final curve + + # column titles + set curve_lists [list ] + if { $labels_p } { + lappend curve_lists [list y x label] + } else { + lappend curve_lists [list y x] + } + # left tail, reverse order + #### Here a point is subtracted, apparently because the last area is empty.. why?? + # p_count() is point length. minus 1 to count from 0 to one less than p_count + set i_count [expr { $p_count(0) - 1 } ] + set label "optimistic / minimum" + for {set i $i_count} { $i > -1 } {incr i -1} { + set f_x [lindex $fx_larr(0) $i] + + # Adjust for cases where x is too close to 0 to be fully recognized as nonzero by the system ie $eps. + set delta_a [f::max $eps [lindex $da_larr(0) $i]] + # set a [expr { $a + $delta_a } ] + + set a [lindex $a_larr(0) $i] + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.234: i '$i' delta_a '$delta_a' a '$a' f_x '$f_x'" + + set point_list [list $f_x $delta_a] + if { $labels_p } { + lappend point_list $label + set label "" + } + lappend curve_lists $point_list + } + # last item this tail + # mark index of this last point, because we will be modifying it + set median_range_idx [llength $curve_lists] + incr median_range_idx -1 + + # right tail, append + # ref 1 + + set i_next2last [expr { $p_count(1) - 2 } ] + for {set i 0} { $i < $p_count(1) } {incr i } { + set f_x [lindex $fx_larr(1) $i] + + # Adjust for cases where x is too close to 0 to be fully recognized as nonzero by the system ie $eps. + set delta_a [f::max $eps [lindex $da_larr(1) $i]] + # set a [expr { $a + $delta_a } ] + set a [lindex $a_larr(1) $i] + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.243: i '$i' delta_a '$delta_a' a '$a' f_x '$f_x'" + set point_list [list $f_x $delta_a] + if { $labels_p } { + lappend point_list $label + if { $i == $i_next2last } { + set label "pessimistic / maximum" + } else { + set label "" + } + } + lappend curve_lists $point_list + } + + # combine the tails at x = 0 + # a0 is median area + #set a0 [expr { [lindex $a_larr(0) 0] + [lindex $a_larr(1) 0] } ] + # combining these areas reduces curve area count by one too many. + set a0 [lindex $a_larr(0) 0] + set a1 [lindex $a_larr(1) 0] + # a_curve is area under curve + set a_curve [expr { $a_arr(0) + $a_arr(1) } ] + + # Instead of adding the extra area from prior calculations, + # create a more balanced a0 so area under each tail is as close as possible to 0.5 + # a0_test is guess at best, new a0. ie 1 - area_under_curve (ideally 1) + a0 + # this way, if 1 - a_curve is greater than 0, the extra is added to a0 + set a0_test [expr { 1. - $a_curve + $a0 } ] + if { $a0_test > 0. } { + # straightforward adjustment + set a_new $a0_test + + } else { + # $a0_test is negative, apparently because a_curve > 1 + # Renormalize a0 to compensate and keep a0 in meridian area: + # Determine which tail is larger.. + if { $a0 > $a1 } { + set a_new [expr { $a0 - $a1 + $eps } ] + } else { + set a_new [expr { $a1 - $a0 + $eps } ] + } + + } + set median_list [list $most_likely $a_new] + if { $labels_p } { + lappend median_list "most likely / median" + } + # set median_end_idx [expr { $median_range_idx } ] + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.351: a0 $a0 a_curve $a_curve a0_test $a0_test a_new $a_new median_range_idx $median_range_idx median_end_idx $median_end_idx" + # set curve_lists [lreplace $curve_lists $median_range_idx $median_end_idx $median_list] + # extra point has already been removed, + set curve_lists [lreplace $curve_lists $median_range_idx $median_range_idx $median_list] + + + # + #set f_x [lindex $fx_larr(1) $i] + # set f_x $pessimistic + # set delta_a [lindex $da_larr(1) $i_count] + # set a [expr { $a + $delta_a } ] + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.246: i '$i' delta_a '$delta_a' a '$a' f_x '$f_x'" + # set point_list [list $f_x $delta_a] + # lappend curve_lists $point_list + + # remove header for point count + # but add a point because each item is an area, and there are area_count + 1 points + set points_count [expr { [llength $curve_lists] - 1 } ] + if { $points_count != $n_areas } { + ns_log Warning "acc_fin::pert_omp_to_normal_dc.288: curve has $points_count areas instead of requested $n_areas areas (add one for points ie area boundaries). curve_lists $curve_lists" + } else { + # ns_log Notice "acc_fin::pert_omp_to_normal_dc.289: curve_lists $curve_lists" + } + return $curve_lists +} + + +ad_proc -public acc_fin::pretti_geom_avg_of_curve { + curve_lol + {correction "0"} +} { + Given a curve with x and y columns, finds the geometric average determined by: (y1*x1 + y2*x2 .. yN*xN ) / sum(x1..xN). Correction is a value, usually -1, or +1 applied to a formula to adjust bias in a sample population as in N/(N - 1) or N/(N + 1). n - 1 is sometimes referred to a Bessel's correction. Default is no correction. More about Bessel's correction at: http://en.wikipedia.org/wiki/Bessel%27s_correction +} { + # This is a generalization of the PERT Time-expected function + set constants_list [list y x] + # get first row of titles + set title_list [lindex $curve_lol 0] + set y_idx [lsearch -exact $title_list "y"] + set x_idx [lsearch -exact $title_list "x"] + set geometric_avg "" + if { $y_idx > -1 && $x_idx > -1 } { + set x_list [list ] + set numerator_list [list ] + foreach point_list [lrange $curve_lol 1 end] { + set x [lindex $point_list $x_idx] + set y [lindex $point_list $y_idx] + lappend x_list $x + lappend numerator_list [expr { $x * $y * 1. } ] + } + set x_sum [f::sum $x_list ] + if { $x_sum != 0. } { + set numerator [f::sum $numerator_list ] + set geometric_avg [expr { $numerator / $x_sum } ] + set n [expr { [llength $x_list] * 1. } ] + set n_corr [expr { $n + $correction } ] + if { $correction ne "0" && $n_corr != 0. } { + ns_log Notice "acc_fin::pretti_geom_avg_of_curve.383: geometric_avg $geometric_avg" + set geometric_avg [expr { $geometric_avg * $n / $n_corr } ] + ns_log Notice "acc_fin::pretti_geom_avg_of_curve.385: new geometric_avg $geometric_avg" + } + } else { + ns_log Notice "acc_fin::pretti_geom_avg_of_curve.170: divide by zero caught for x_sum. numerator $numerator" + } + } else { + ns_log Notice "acc_fin::pretti_geom_avg_of_curve.178: y_idx $y_idx x_idx $x_idx" + } + + return $geometric_avg +} + + +ad_proc -public acc_fin::pretti_type_flag { + table_lists +} { + Guesses which type of pretti table +} { + #upvar $table_lists_name table_lists + # page flags as pretti_types: + # p in positon 1 = PRETTI app specific + # p1 scenario + # p2 task network (unique tasks and their dependencies) + # p3 task types (can also have dependencies) + # dc distribution curve + # p4 PRETTI report (output) + # p5 PRETTI db report (output) (similar format to p3, where each row represents a path, but in p5 all paths are represented) + # dc Estimated project duration distribution curve (can be used to create other projects) + + # get first row + set title_list [lindex $table_lists 0] + set type_return "" + # check for type p1 separate from the other cases, because the table is specified differently from other cases. + set p(p1) 0 + set name_idx [lsearch -exact $title_list "name" ] + set value_idx [lsearch -exact $title_list "value" ] + # ns_log Notice "acc_fin::pretti_columns_list.390 name_idx $name_idx value_idx $value_idx title_list '$title_list'" + if { $name_idx > -1 && $value_idx > -1 } { + # get name column + set name_list [list ] + # ns_log Notice "acc_fin::pretti_columns_list.400 table_lists '$table_lists'" + foreach row [lrange $table_lists 1 end] { + lappend name_list [lindex $row $name_idx] + } + # ns_log Notice "acc_fin::pretti_columns_list.401 name_list '$name_list'" + # check name_list against p1 required names. + # All required names need to be in list, but not all list names are required. + set p(p1) 1 + # required names in check_list + # p1 is special because it requires either activity_table_tid *or* activity_table_name + #set check_list [acc_fin::pretti_columns_list "p1" 1 ] + # ns_log Notice "acc_fin::pretti_columns_list.402 check_list $check_list" + # foreach check $check_list { + # if { [lsearch -exact $name_list $check] < 0 } { + # set p(p1) 0 + # } + # ns_log Notice "acc_fin::pretti_columns_list.404 check $check p(p1) $p(p1)" + #} + set name_idx [lsearch -exact $name_list activity_table_name] + set tid_idx [lsearch -exact $name_list activity_table_tid] + if { $name_idx < 0 && $tid_idx < 0 } { + set p(p1) 0 + } + } + if { $p(p1) } { + set type_return "p1" + # ns_log Notice "acc_fin::pretti_columns_list.410 type = p1" + } else { + # filter other p table types by required minimums first + set type_list [list "p2" "p3" "p4" "p5" "dc"] + # ns_log Notice "acc_fin::pretti_columns_list.414 type not p1. check for $type_list" + foreach type $type_list { + set p($type) 1 + set check_list [acc_fin::pretti_columns_list $type 1] + # ns_log Notice "acc_fin::pretti_type_flag.58: type $type check_list $check_list" + foreach check $check_list { + if { [lsearch -exact $title_list $check] < 0 } { + set p($type) 0 + } + # ns_log Notice "acc_fin::pretti_type_flag.60: check $check p($type) $p($type)" + } + } + + # how many types might this table be? + set type1_p_list [list ] + foreach type $type_list { + if { $p($type) } { + lappend type1_p_list $type + } + } + # ns_log Notice "acc_fin::pretti_type_flag.69: type1_p_list '${type1_p_list}'" + set type_count [llength $type1_p_list] + if { $type_count > 1 } { + # choose one + if { $p(p2) && $p(p3) && $type_count == 2 } { + if { [lsearch -exact $title_list "aid_type" ] > -1 } { + set type_return "p2" + } elseif { [lsearch -exact $title_list "type" ] > -1 } { + set type_return "p3" + } + } else { + set type3_list [list ] + # Which type best meets full list of implemented column names? + foreach type $type1_p_list { + set name_list [acc_fin::pretti_columns_list $type 0] + set name_list_count [llength $name_list] + set exists_count 0 + foreach name $name_list { + if { [lsearch -exact $title_list $name] > -1 } { + incr exists_count + } + } + if { $name_list_count > 0 } { + set type_pct_list [list $type [expr { ( $exists_count * 1. ) / ( $name_list_count * 1. ) } ] ] + lappend type3_list $type_pct_list + } + } + set type3_list [lsort -real -index 1 -decreasing $type3_list] + # ns_log Notice "acc_fin::pretti_type_flag.450: type1_p_list '${type1_p_list}'" + # ns_log Notice "acc_fin::pretti_type_flag.453: type3_list '$type3_list'" + set type_return [lindex [lindex $type3_list 0] 0] + } + } else { + # append is used here in case no type meets the criteria, an empty string is returned + append type_return [lindex $type1_p_list 0] + } + } + + return $type_return +} + +ad_proc -private acc_fin::pretti_columns_list { + type + {required_only_p "0"} +} { + Returns a list of column names used by pretti table type. If required_only_p is 1, only returns the required columns for specified type. Reserved words are not included in the list. +} { + set sref $type + append sref $required_only_p + switch -exact $sref { + p10 { + # p1 PRETTI Scenario + # consists of a "name" and "value" column, with names of: + # activity_table_tid + # activity_table_name name of table containing task network + # period_unit measure of time used in task duration etc. + # time_dist_curve_name a default distribution curve name when a task type doesn't reference one. + # time_dist_curve_tid a default distribution curve table_id, dist_curve_name overrides dist_curve_dtid + # cost_dist_curve_name a default distribution curve name when a task type doesn't reference one. + # cost_dist_curve_tid a default distribution curve table_id, dist_curve_name overrides dist_curve_dtid + # with_factors_p defaults to 1 (true). Set to 0 (false) if any factors in p3 are to be ignored. + # This option is useful to intercede in auto factor expansion to add additional + # variation in repeating task detail. (deprecated by auto expansion of nonexisting coefficients). + # time_probability_point A percentage (0..1) along the (cumulative) distribution curve. defaults to 0.5 + # cost_probability_point A percentage (0..1) along the (cumulative) distribution curve. defaults to "", which defaults to same as time_probability_point + #set ret_list \[list name value\] + set ret_list [list activity_table_tid activity_table_name task_types_tid task_types_name time_dist_curve_name time_dist_curve_tid cost_dist_curve_name cost_dist_curve_tid time_est_short time_est_median time_est_long time_probability_point cost_est_low cost_est_median cost_est_high cost_probability_point db_format index_equation precision tprecision cprecision eprecision pert_omp max_concurrent max_discount_pct max_reduction_pct max_run_time max_tasks_per_run max_overlap_pct eco2_est_low eco2_est_median eco2_est_high eco2_probability_point eco2_dist_curve_tid eco2_dist_curve_name ] + } + p11 { + #set ret_list \[list name value\] + set ret_list [list activity_table_tid ] + } + p20 { + # p2 Task Network + # activity_ref reference for an activity, a unique task id, using "activity" to differentiate between table_id's tid + # An activity reference is essential a function as in f() with no attributes, + # However, there is room to grow this by extending a function to include explicitly set paramemters + # within the function, similar to how app-model handles functions aka vectors + # The multiple of an activity is respresented by a whole number followed by an "*" + # with no spaces between (when spaces are used as an activity delimiter), or + # with spaces allowed (when commas or another character is used as an activity delimiter.) + # + # aid_type activity type from p3 + # dependent_tasks direct predecessors , activity_ref of activiites this activity depends on. + # name defaults to type's name (if exists else blank) + # description defaults to type's description (if exists else blank) + # max_concurrent defaults to type's max_concurrent + # max_run_time defaults to type's max_run_time or if blank (unlimited run time) + # max_tasks_per_run defaults to types' max_tasks_per_run or if blank (unlimited tasks per run) + # max_overlap_pct defaults to type's max_overlap_pct021 + + # time_est_short estimated shortest duration. (Lowest statistical deviation value) + # time_est_median estimated median duration. (Statistically, half of deviations are more or less than this.) + # time_est_long esimated longest duration. (Highest statistical deviation value.) + # time_actual the acutal duration (time) once complete. + # time_dist_curve_tid Use this distribution curve instead of the time_est short, median and long values + # Consider using a variation of task_type as a reference + # time_dist_curv_eq Use this distribution curve equation instead. + + # cost_est_low estimated lowest cost. (Lowest statistical deviation value.) + # cost_est_median estimated median cost. (Statistically, half of deviations are more or less than this.) + # cost_est_high esimage highest cost. (Highest statistical deviation value.) + # cost_actual the actual cost once complete. + # cost_dist_curve_tid Use this distribution curve instead of equation and value defaults + # cost_dist_curv_eq Use this distribution curve equation. + # + # RESERVED columns: + # _tCurveRef integer reference to time curve in time_clarr and time duration estimate at time_probability_point in t_est_arr + # _cCurveRef integer reference to cost curve in cost_clarr and cost duration estimate at cost_probability_point in c_est_arr + # _coef integer coefficient for use with calculations that require remembering the coefficient when multiple of an activity is referenced. + # _tDcSource source of time curve used from acc_fin::curve_import + # _cDcSource source of cost curve used from acc_fin::curve_import + + # eco2_* uses cost_probability_point + set ret_list [list activity_ref dependent_tasks aid_type name description max_concurrent max_discount_pct max_reduction_pct max_run_time max_tasks_per_run max_overlap_pct time_est_short time_est_median time_est_long time_dist_curve_tid time_dist_curve_name time_probability_point cost_est_low cost_est_median cost_est_high cost_dist_curve_tid cost_dist_curve_name cost_probability_point time_actual cost_actual eco2_actual eco2_est_low eco2_est_high eco2_est_median eco2_dist_curve_tid eco2_dist_curve_name eco2_probability_point] + + } + p21 { + set ret_list [list activity_ref dependent_tasks] + } + p30 { + # p3 Task Types: + # type + # dependent_types Other dependent types required by this type. (possible reference collisions. type_refs != activity_refs.) + # + ##### dependent_types should be checked against activity_dependents' types + # to confirm that all dependencies are satisified. + # name + # description + # max_concurrent (as a positive integer, blank = no limit) + # max_run_time (decimal, blank = no limit) + # max_tasks_per_run (as a positive integer, or blank = no limit) + # max_overlap_pct021 (as a percentage from 0 to 1, blank = 1) + # + # RESERVED columns: + # _tCurveRef integer reference to time curve in time_clarr and time duration estimate at time_probability_point in t_est_arr + # _cCurveRef integer reference to cost curve in cost_clarr and cost duration estimate at cost_probability_point in c_est_arr + # _tDcSource source of time curve used from acc_fin::curve_import + # _cDcSource source of cost curve used from acc_fin::curve_import + + set ret_list [list type dependent_tasks dependent_types name description max_concurrent max_discount_pct max_reduction_pct max_run_time max_tasks_per_run max_overlap_pct time_dist_curve_name time_dist_curve_tid cost_dist_curve_name cost_dist_curve_tid time_est_short time_est_median time_est_long cost_est_low cost_est_median cost_est_high eco2_est_low eco2_est_high eco2_est_median eco2_dist_curve_tid eco2_dist_curve_name eco2_probability_point] + } + p31 { + set ret_list [list type] + # if changing p3 or p2 lists, see also constants_woc_list in this file. + } + p40 { + # each column is path_{number} and generated by code so not used in this context + + # p4 Display modes + # + # tracks within n% of CP duration, n represented as %12100 or a duration of time as total lead slack + # tracks w/ n fixed count closest to CP duration. A n=1 shows CP track only. + # tracks that contain at least 1 CP track + set ret_list [list path_1] + } + p41 { + # each column is path_{number} and generated by code so not used in this context + set ret_list [list path_1] + } + p50 { + # each row is a cell (ie activity on a path), in format of detailed PRETTI internal output. See code. + #set ret_list [list activity_ref path_act_counter path_counter dependencies_q cp_q significant_q popularity waypoint_duration activity_time direct_dependencies activity_cost waypoint_cost] + set ret_list [list activity_ref activity_counter dependencies_q direct_dependencies dependencies_count count_on_cp_p on_a_sig_path_p act_freq_in_load_cp_alts popularity activity_time waypoint_duration t_dc_source activity_cost waypoint_cost c_dc_source activity_eco2 waypoint_eco2 e_dc_source act_coef max_concurrent max_run_time max_tasks_per_run max_overlap_pct max_discount_pct max_reduction_pct max_path_duration t_dc c_dc e_dc] + } + p51 { + # each row is a cell (ie activity on a path), in format of detailed PRETTI internal output. See code. + # p5 was: + #set ret_list [list activity_ref path_act_counter path_counter dependencies_q cp_q significant_q popularity waypoint_duration activity_time direct_dependencies activity_cost waypoint_cost path_col activity_seq dependents_count dep_act_seq ] + set ret_list [list activity_ref activity_counter dependencies_q direct_dependencies dependencies_count count_on_cp_p on_a_sig_path_p act_freq_in_load_cp_alts popularity activity_time waypoint_duration t_dc_source activity_cost waypoint_cost c_dc_source activity_eco2 waypoint_eco2 e_dc_source act_coef max_concurrent max_run_time max_tasks_per_run max_overlap_pct max_discount_pct max_reduction_pct max_path_duration t_dc c_dc e_dc] + } + p60 { + # each row is a path, in format of detailed PRETTI internal output. See code. All columns are required to reproduce output to p4 (including p4 comments). + set ret_list [list path_idx path path_counter cp_q significant_q path_duration path_cost index_custom path_eco2 path_len path_len_w_coefs] + } + p61 { + # each row is a path, in format of detailed PRETTI internal output. See code. All columns are required to reproduce output to p4 (including p4 comments). + set ret_list [list path_idx path path_counter cp_q significant_q path_duration path_cost index_custom path_eco2 path_len path_len_w_coefs] + } + + dc0 { + # dc2 distribution curve table + # Y where Y = f(x) and f(x) is a + # probability mass function ie probability density function as a distribution + # http://en.wikipedia.org/wiki/Probability_mass_function + # http://en.wikipedia.org/wiki/Probability_density_function + # aka http://en.wikipedia.org/wiki/Discrete_probability_distribution#Discrete_probability_distribution + # The discrete values are the values of Y included in the table + + # X Where X = the probability of Y. + # These can be counts of a sample or a frequency. When the table is saved, + # the total area under the distribution is normalized to 1. + + # label Where label represents the value of Y at x. This is a short phrase or reference + # that identifies a boundary point in the distribution. + # A three point (short/median/long or low/median/high) estimation curve can be respresented as + # a discrete set of six points: minimum median median median median maximum + # of standard bell curve probabilities (outliers + standard deviation). + # Thereby allowing *_probability_point variable to be used in estimates with lower statistical resolution. + set ret_list [list y x label] + } + dc1 { + set ret_list [list y x] + } + default { + ns_log Notice "acc_fin::pretti_columns_list (242): bad reference sref '$sref'. Returning blank list." + set ret_list [list ] + } + } + return $ret_list +} + + +ad_proc -public acc_fin::pretti_table_to_html { + pretti_lol + comments +} { + Interprets a saved p4 pretti output table into html table. +} { + # process table by building columns in row per html TABLE TR TD tags + # pretti_lol consists of first row: + # path_1 path_2 path_3 ... path_N + # subsequent rows: + # cell_r1c1 cell_r1c2 cell_r1c3 ... cellr1cN + # ... + # cell_rMc1 cell_rMc2 cell_rMc3 ... cellrMcN + # for N tracks of a maximum of M rows. + # Each cell is an activity. + # Each column is a track + # Path_1 is CP + + # empty cells have empty string value. + # other cells will contain comment format from acc_fin::scenario_prettify + # "$activity " + # "t:[lindex $path_list 7] " + # "ts:[lindex $path_list 6] " + # "c:[lindex $path_list 9] " + # "cs:[lindex $path_list 10] " + # "d:($depnc_larr(${activity})) " + # " " + + set column_count [llength [lindex $pretti_lol 0]] + set row_count [llength $pretti_lol] + incr row_count -1 + set success_p 1 + + # values to be extracted from comments: + # max_act_count_per_track and cp_duration_at_pp + # Other parameters could be added to comments for changing color scheme/bias + set color_sig_mask_idx "" + regexp -- {[^a-z\_]?color_sig_mask_idx[\ \=\:]([0-7])[^0-7]} $comments scratch color_sig_mask_idx + if { [ad_var_type_check_number_p $color_sig_mask_idx] && $color_sig_mask_idx > -1 && $color_sig_mask_idx < 8 } { + # do nothing + } else { + # set default + set color_sig_mask_idx 5 + } + + set color_cp_mask_idx "" + regexp -- {[^a-z\_]?color_cp_mask_idx[\ \=\:]([0-7])[^0-7]} $comments scratch color_cp_mask_idx + if { [ad_var_type_check_number_p $color_cp_mask_idx] && $color_cp_mask_idx > -1 && $color_cp_mask_idx < 8 } { + # do nothing + } else { + # set default + set color_cp_mask_idx 3 + } + + set colorswap_p "" + regexp -- {[^a-z\_]?colorswap_p[\ \=\:]([0-1])[^0-1]} $comments scratch colorswap_p + if { [ad_var_type_check_number_p $colorswap_p] && $colorswap_p > -1 && $colorswap_p < 2 } { + # do nothing + } else { + # set default + set colorswap_p 0 + } + + #ns_log Notice "acc_fin::pretti_table_to_html.836: color_sig_mask_idx $color_sig_mask_idx color_cp_mask_idx $color_cp_mask_idx colorswap_p $colorswap_p" + set max_act_count_per_track $column_count + # max_act_count_per_track is the max count of an activity on all paths ie. answers q: What is the maximum count of an activity on this table? + regexp -- {[^a-z\_]?max_act_count_per_track[\ \=\:]([0-9]+)[^0-9]} $comments scratch max_act_count_per_track + if { $max_act_count_per_track == 0 } { + set max_act_count_per_track $column_count + } + + regexp -- {[^a-z\_]?cp_duration_at_pp[\ \=\:]([0-9]+)[^0-9]} $comments scratch cp_duration_at_pp + if { $cp_duration_at_pp == 0 } { + # Calculate cp_duration_at_pp manually, using path_1 (cp track) + foreach row [lrange $pretti_lol 1 end] { + set cell [lindex $row 0] + if { $cell ne "" } { + regexp -- {ts:([0-9\.]+)[^0-9]} $cell scratch test_num + } + } + if { [ad_var_type_check_number_p $test_num] && $test_num > 0 } { + set cp_duration_at_pp $test_num + } + } + + #ns_log Notice "acc_fin::pretti_table_to_html.857: cp_duration_at_pp $cp_duration_at_pp max_act_count_per_track $max_act_count_per_track column_count $column_count row_count $row_count" + # determine list of CP activities + set cp_list [list ] + foreach row [lrange $pretti_lol 1 end] { + set cell [lindex $row 0] + if { $cell ne "" } { + # activity is not Title of activity, but activity_ref + set first_space [string first " " $cell] + incr first_space -1 + set activity [string trim [string range $cell 0 $first_space]] + if { $first_space > -1 } { + # added letter to nulify any octal issues + lappend cp_list "z$activity" + } + } + } + if { [llength $cp_list] == 0 } { + ns_log Warning "acc_fin::pretti_table_to_html.868: cp_list is blank. Not a valid p4 table, or regexp needs revising." + } + # Coloring and formatting will be interpreted + # based on values provided in comments, + # data from path_1 and table type (p4) for maximum flexibility. + + # table cells need to indicate a relative time length in addition to dependency. check + + set title_formatting_list [list ] + foreach title [lindex $pretti_lol 0] { + lappend title_formatting_list [list style "font-style: bold;"] + } + set table_attribute_list [list ] + set table_formatting_list [list ] + lappend table_formatting_list $title_formatting_list + + # build formatting colors + + set hex_list [list 0 1 2 3 4 5 6 7 8 9 a b c d e f] + set bin_list [list 000 100 010 110 001 101 011 111] + + set color_cp_mask [lindex $bin_list $color_cp_mask_idx] + set color_cp_mask_list [split $color_cp_mask ""] + set color_sig_mask [lindex $bin_list $color_sig_mask_idx] + set color_sig_mask_list [split $color_sig_mask ""] + + set k1 [expr { $row_count / $cp_duration_at_pp } ] + set k2 [expr { 7. / $max_act_count_per_track } ] + ns_log Notice "acc_fin::pretti_table_to_html.845: k1 $k1 k2 $k2 color_sig_mask_list '${color_sig_mask_list}' color_cp_mask_list '${color_cp_mask_list}'" + # add title column + set row4html_list [list ] + set row_formatting_list [list ] + set pretti4html_lol [lrange $pretti_lol 0 0] + set title_formatting "" + foreach title_cell [lrange $pretti_lol 0 0] { + lappend row_formatting_list $title_formatting + } + lappend table_formatting_lists $row_formatting_list + # red f00, green 0f0, blue 00f + # cyan 0ff, pink f0f, yellow ff0 + + # CP in highest contrast (yellow ff9) for the column: ff9 ee9 ff9 ee9 ff9 + # CP-alt means on_a_sig_path_p + # CP-alt in alternating lt magenta to lt green: 99f .. 9f9 of lowering contrast to f77 + # others in alternating medium blue/green: 66f .. 6f6 or pink/green f6f .. 66f + # contrast decreases on up to 50% + # f becomes e for even rows.. + + # to build cell color: + # contrast_adj + # color_mask_idx + # + # c(0) is other + # c(1) is primary + + # cell_nbr eq 0 is CP + + #set on_a_sig_path_p [expr { $on_a_sig_path_p || $on_cp_p } ] + # 15 - 1 (leave 1 for contrast adjustment) + #regexp -- {^([^\ ]+) t:} $cell scratch activity + + # significant, base color pink f0f + # see color_sig_mask + # set color1 and color2 based on activity count, blue lots of count, green is less count + # max $popularity is column_count + # create 2 values to be used with masks, 1 is most significant, 0 less significant + + # other, base color green 0f0 + # see color_oth_mask + + # constrast_step is number from 1 to 7, with 7 being most popular, 1 least popular + # create 2 values to be used with masks, 1 is most sig, 0 less significant + set row_nbr 1 + foreach row_list [lrange $pretti_lol 1 end] { + set row4html_list [list ] + set row_formatting_list [list ] + set odd_row_p [expr { ( $row_nbr / 2. ) != int( $row_nbr / 2 ) } ] + + set cell_nbr 1 + foreach cell $row_list { + #set activity "" + if { $cell ne "" } { + set activity_time_expected "" + set on_a_sig_path_p 0 + set popularity 0 + + set row_size 1 + set first_space [string first " " $cell] + incr first_space -1 + set activity [string range $cell 0 $first_space] + if { $activity eq "" } { + ns_log Warning "acc_fin::pretti_table_to_html.916: activity '$activity' cell '$cell' bad code. activity not extracted." + } + + set act_on_cp_p [expr { [lsearch -exact -ascii $cp_list "z$activity" ] > -1 } ] + if { $cell_nbr == 1 || $act_on_cp_p } { + set on_cp_p 1 + } else { + set on_cp_p 0 + } + + if { [regexp -- {t:([0-9\.]+)[^0-9]} $cell scratch activity_time_expected ] } { + set row_size [f::max [expr { int( $activity_time_expected * $k1 ) } ] 1 ] + } + + # set on_a_sig_path_p and popularity + if { ![regexp -- {} $cell scratch on_a_sig_path_p popularity path_duration] } { + ns_log Notice "acc_fin::pretti_table_to_html.928: regexp broken for row $row_nbr column $cell_nbr $row_cell cell '$cell'" + } + + set colorhex [acc_fin::pretti_color_chooser $on_cp_p $on_a_sig_path_p $odd_row_p $popularity $max_act_count_per_track $cp_duration_at_pp $path_duration] + + } else { + set cell " " + # pass on_cp_p as -1 when cell is inactive + set colorhex [acc_fin::pretti_color_chooser -1 $on_a_sig_path_p $odd_row_p $popularity $max_act_count_per_track $cp_duration_at_pp $path_duration] + } + #append cell "row $row_nbr col $cell_nbr on_cp $on_cp_p on_sig $on_a_sig_path_p act_on_cp_p $act_on_cp_p
" + set greycol [acc_fin::gray_from_color $colorhex] + if { [string range $greycol 0 0] < 6 } { + set reverse_color_css " color: #ffffff;" + } else { + set reverse_color_css "" + } + set cell_formatting [list style "vertical-align: top; background-color: #${colorhex};${reverse_color_css}"] + + lappend row4html_list $cell + lappend row_formatting_list $cell_formatting + incr cell_nbr + } + lappend pretti4html_lol $row4html_list + lappend table_formatting_lists $row_formatting_list + + incr row_nbr + } + + # html + set pretti_html "

Computation report

" + append pretti_html [qss_list_of_lists_to_html_table $pretti4html_lol $table_attribute_list $table_formatting_lists] + return $pretti_html +} + + +ad_proc -public acc_fin::larr_set { + larr_name + data_list +} { + Assigns a data_list to an index in array larr_name + in a manner that minimizes memory footprint. + If the list already exists (exactly) in the array, + it returns the existing index, + otherwise it assignes a new index in array and + a new index of array is returned. + This procedure helps reduce memory overhead + for indexes with lots of list data. +} { + upvar 1 ${larr_name} larr + # If memory issues exist even after using this proc, one can further compress the array by applying a dictionary storage technique. + # It may be possible to use the list as an index and gain from tcl internal handling for example. + # hmm. Initial tests suggest this array(list) works, but might not be practical to store references.. + set indexes_list [array names larr] + set icount [llength $indexes_list] + # ns_log Notice "acc_fin::larr_ste.945: larr_name $larr_name indexes_list '$indexes_list' icount '$icount'" + if { $icount > 0 } { + # larr already has names. Check against existing names + set i 0 + set index [lindex $indexes_list $i] + set larr_ne_data_p 0 + # ns_log Notice "acc_fin::larr_ste.949: index '$index' i $i" + if { $larr($index) ne $data_list } { + set larr_ne_data_p 1 + } + + while { $larr_ne_data_p } { + incr i + set index [lindex $indexes_list $i] + # ns_log Notice "acc_fin::larr_ste.953: index '$index' i $i" + set larr_ne_data_p 0 + if { $index ne "" } { + if { $larr($index) ne $data_list } { + set larr_ne_data_p 1 + } + } + } + # ended because i == icount (ie out of range) or !larr_ne_data_p + # ns_log Notice "acc_fin::larr_ste.955: index '$index' i $i" + if { $index eq "" } { + set index $icount + set larr($icount) $data_list + } + # otherwise !larr_ne_data_p, so use index as return list + } else { + set index $icount + set larr($icount) $data_list + } + if { [llength $data_list] == 0 } { + ns_log Warning "acc_fin::larr_set.956: empty data_list request in larr ${larr_name}." + } + # ns_log Notice "acc_fin::larr_set.958: ${larr_name}\(${i}\) '$larr($i)' data_list '${data_list}'" + return $index +} + +ad_proc -private acc_fin::p_load_tid { + constants_list + constants_required_list + p_larr_name + tid + {p3_larr_name ""} + {instance_id ""} + {user_id ""} +} { + loads array_name with p2 or p3 style table for use with internal code +} { + upvar 1 $p_larr_name p_larr + upvar 1 time_clarr time_clarr + upvar 1 cost_clarr cost_clarr + upvar 1 eco2_clarr eco2_clarr + upvar 1 type_t_curve_arr type_t_curve_arr + upvar 1 type_c_curve_arr type_c_curve_arr + upvar 1 type_e_curve_arr type_e_curve_arr + upvar 1 scenario_tid scenario_tid + # need to pass p1_arr defaults for p2 dc processing + upvar 1 p1_arr p1_arr + # to pass and share auxiliary variables: + upvar 1 aux_col_names_list aux_col_names_list + # following are not upvar'd because the cache is mainly useless after proc ends + # upvar 1 tc_cache_larr tc_cache_larr + # upvar 1 cc_cache_larr cc_cache_larr + # following are not upvar'd because these are temporary arrays for loading list representations of curves + # upvar 1 tc_larr tc_larr + # upvar 1 cc_larr cc_larr + + if { $instance_id eq "" } { + set instance_id [ad_conn package_id] + } + if { $user_id eq "" } { + set user_id [ad_conn user_id] + } + set success_p 1 + set table_type "p3" + set type_tcurve_list [list ] + set type_ccurve_list [list ] + set type_ecurve_list [list ] + if { $p3_larr_name ne ""} { + upvar 1 $p3_larr_name p3_larr + # p_larr must be a p2 table + set table_type "p2" + } + + # set table defaults + foreach column $constants_list { + set p_larr($column) [list ] + } + + # load table into array of lists {{a b c} {1 2 3} {4 5 6}} becomes p_larr(a) {1 4}, p_larr(b) {2 5}, p_larr(c) {3 6} + qss_tid_columns_to_array_of_lists $tid p_larr $constants_list $constants_required_list $instance_id $user_id + #### setup auxiliary calculation columns + ## p_larr_k_w_data_list p_larr names having data. + set p_larr_names_unfiltered_list [list ] + #ns_log Notice "acc_fin::p_load_tid.1795: constants_list [lsort ${constants_list}]" + #ns_log Notice "acc_fin::p_load_tid.1796: arr nams plarr [lsort [array names p_larr]]" + foreach col [array names p_larr] { + if { [llength $p_larr(${col}) ] > 0 } { + lappend p_larr_names_unfiltered_list $col + } + } + set p_larr_names_list [acc_fin::list_filter alphanum $p_larr_names_unfiltered_list ] + set names_wo_reserved_list [set_difference $p_larr_names_list $constants_list ] + # Are any names in names_wo_reserved_list auxiliary names? + set aux_col_names_allowed_unfiltered_list [parameter::get -parameter AuxiliaryColumnNames -package_id $instance_id ] + set aux_col_names_allowed_list [acc_fin::list_filter alphanum $aux_col_names_allowed_unfiltered_list ] + set my_aux_col_names_list [set_intersection $aux_col_names_allowed_list $names_wo_reserved_list ] + set remainder_names_list [set_difference $names_wo_reserved_list $my_aux_col_names_list ] + set aux_col_name_max_len [parameter::get -parameter AuxiliaryColumnNameMaxLength -package_id $instance_id ] + # Add any remaining names qualified by AuxiliaryColumnNameMaxLength + if { $aux_col_name_max_len > 0 } { + foreach name $remainder_names_list { + set name_len [llength $name] + if { $name_len <= $aux_col_name_max_len && $name_len > 0 } { + lappend $my_aux_col_names_list $name + } + } + } + set aux_col_names_list [set_union $aux_col_names_list $my_aux_col_names_list] + ## aux_col_names_list is the list of auxiliary column names in p_larr to perform auxiliary calculations identical to cost + + #### + set i_max -1 + set p2_types_exist_p 0 + set p2_type_column_exists_p 0 + set p3_types_exist_p 0 + set p3_type_column_exists_p 0 + + if { $table_type eq "p3" } { + # if 'type' column exists, then p_larr is a p3 table + set p3_type_column_exists_p [info exists p_larr(type)] + if { $p3_type_column_exists_p } { + set i_max [llength $p_larr(type) ] + set p3_types_exist_p [expr { [llength $p_larr(type)] > 0 } ] + } + } elseif { $table_type eq "p2" } { + # i_max is activity_ref length + set p2_actref_column_exists_p [info exists p_larr(activity_ref)] + if { $p2_actref_column_exists_p } { + set i_max [llength $p_larr(activity_ref)] + } + set p2_type_column_exists_p [info exists p_larr(aid_type)] + if { $p2_type_column_exists_p } { + set p2_types_exist_p [expr { [llength $p_larr(aid_type)] > 0 } ] + if { $p1_arr(task_types_tid) eq "" && $p2_types_exist_p } { + set success_p 0 + acc_fin::pretti_log_create $scenario_tid "p_load_tid" "#accounts-finance.value#" "#accounts-finance.error# #accounts-finance.task_types_tid_is_required_when# (ref1441)" $user_id $instance_id + } + } + } + + if { $p3_types_exist_p && $table_type eq "p2" } { + ns_log Warning "acc_fin::p_load_tid.1005: table_type ${table_type} and p3_types_exist_p $p3_types_exist_p is an unexpected condition. Investigate." + # Is there any reason why p3 rows cannot be defined in a p2 table? + # Recall, p3 loads curves , whereas p2 possibly references existing curves from p3. + # if okay to have p3 rows in a p2, then logic changes to (p2 || p3) vs. p3 for this proc. + } + + # filter user input that is going to be used as references in arrays: + if { $p3_type_column_exists_p } { + set p_larr(type) [acc_fin::list_filter alphanum $p_larr(type) $p_larr_name "type"] + if { [info exists p_larr(dependent_tasks) ] } { + set p_larr(dependent_tasks) [acc_fin::list_filter factorlist $p_larr(dependent_tasks) $p_larr_name "dependent_tasks"] + } + } + if { $p2_type_column_exists_p } { + set p_larr(aid_type) [acc_fin::list_filter alphanum $p_larr(aid_type) $p_larr_name "type"] + } + + + # import curves referenced in the table + set p_larr(_tCurveRef) [list ] + set p_larr(_cCurveRef) [list ] + set p_larr(_eCurveRef) [list ] + set p_larr(_coef) [list ] + set p_larr(_tDcSource) [list ] + set p_larr(_cDcSource) [list ] + set p_larr(_eDcSource) [list ] + set tcurvesource "" + set ccurvesource "" + set ecurvesource "" + + if { $table_type eq "p3" && $p3_type_column_exists_p } { + # table_type is p3 + set p3_t_dc_tid_exists_p [info exists p_larr(time_dist_curve_tid) ] + set p3_t_dc_name_exists_p [info exists p_larr(time_dist_curve_name) ] + set p3_t_est_short_exists_p [info exists p_larr(time_est_short) ] + set p3_t_est_median_exists_p [info exists p_larr(time_est_median) ] + set p3_t_est_long_exists_p [info exists p_larr(time_est_long) ] + + set p3_c_dc_tid_exists_p [info exists p_larr(cost_dist_curve_tid) ] + set p3_c_dc_name_exists_p [info exists p_larr(cost_dist_curve_name) ] + set p3_c_est_low_exists_p [info exists p_larr(cost_est_low) ] + set p3_c_est_median_exists_p [info exists p_larr(cost_est_median) ] + set p3_c_est_high_exists_p [info exists p_larr(cost_est_high) ] + + set p3_e_dc_tid_exists_p [info exists p_larr(eco2_dist_curve_tid) ] + set p3_e_dc_name_exists_p [info exists p_larr(eco2_dist_curve_name) ] + set p3_e_est_low_exists_p [info exists p_larr(eco2_est_low) ] + set p3_e_est_median_exists_p [info exists p_larr(eco2_est_median) ] + set p3_e_est_high_exists_p [info exists p_larr(eco2_est_high) ] + + + # load any referenced curves + + ns_log Notice "acc_fin::p_load_tid.1021: for ${p_larr_name} i_max ${i_max}" + for {set i 0} {$i < $i_max} {incr i} { + + set type [lindex $p_larr(type) $i] + + # time curve + set time_dist_curve_tid "" + set time_dist_curve_name "" + set time_est_short "" + set time_est_median "" + set time_est_long "" + if { $p3_t_dc_name_exists_p } { + set time_dist_curve_name [lindex $p_larr(time_dist_curve_name) $i] + ns_log Notice "acc_fin::p_load_tid.1081: for ${p_larr_name} i $i q1" + } + if { $time_dist_curve_name ne "" } { + set time_dist_curve_tid [qss_tid_from_name $time_dist_curve_name $instance_id $user_id] + ns_log Notice "acc_fin::p_load_tid.1085: for ${p_larr_name} i $i q2" + } + if { $p3_t_dc_tid_exists_p && $time_dist_curve_tid eq "" } { + set time_dist_curve_tid [lindex $p_larr(time_dist_curve_tid) $i] + ns_log Notice "acc_fin::p_load_tid.1089: for ${p_larr_name} i $i q3" + } + # set defaults + set constants_list [acc_fin::pretti_columns_list dc] + foreach constant $constants_list { + set tc_larr($constant) "" + } + + if { $time_dist_curve_tid ne "" } { + if { ![info exists tc_cache_larr(x,${time_dist_curve_tid}) ] } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists ${time_dist_curve_tid} tc_larr $constants_list $constants_required_list $instance_id $user_id + # add to temporary cache + foreach constant $constants_list { + set tc_cache_larr($constant,${time_dist_curve_tid}) $tc_larr($constant) + } + } + #tc_larr(x), tc_larr(y) and optionally tc_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + foreach constant $constants_list { + set tc_larr($constant) $tc_cache_larr($constant,${time_dist_curve_tid}) + } + } + if { $p3_t_est_short_exists_p } { + set time_est_short [lindex $p_larr(time_est_short) $i] + } + + if { $p3_t_est_median_exists_p } { + set time_est_median [lindex $p_larr(time_est_median) $i] + } + if { $p3_t_est_long_exists_p } { + set time_est_long [lindex $p_larr(time_est_long) $i] + } + # import curve given all the available curve choices + ns_log Notice "acc_fin::p_load_tid.1118: for ${p_larr_name} i $i time_est_short '${time_est_short}' time_est_median '${time_est_median}' time_est_long '${time_est_long}' type_tcurve_list '${type_tcurve_list}' tc_larr(x) '$tc_larr(x)' tc_larr(y) '$tc_larr(y)' tc_larr(label) '$tc_larr(label)'" + set curve_list [acc_fin::curve_import $tc_larr(x) $tc_larr(y) $tc_larr(label) $type_tcurve_list $time_est_short $time_est_median $time_est_long $time_clarr($p1_arr(_tCurveRef)) tcurve_source] + + set tcurvenum [acc_fin::larr_set time_clarr $curve_list] + if { $tcurvenum eq "" } { + ns_log Notice "acc_fin::p_load_tid.1120: for ${p_larr_name} i $i type $type _tCurveRef is blank for curve_list '${curve_list}'." + } + + # cost curve + set cost_dist_curve_tid "" + set cost_dist_curve_name "" + set cost_est_low "" + set cost_est_median "" + set cost_est_high "" + if { $p3_c_dc_name_exists_p } { + set cost_dist_curve_name [lindex $p_larr(cost_dist_curve_name) $i] + } + if { $cost_dist_curve_name ne "" } { + set cost_dist_curve_tid [qss_tid_from_name $cost_dist_curve_name $instance_id $user_id] + } + if { $p3_c_dc_tid_exists_p && $cost_dist_curve_tid eq "" } { + set cost_dist_curve_tid [lindex $p_larr(cost_dist_curve_tid) $i] + } + # set defaults + foreach constant $constants_list { + set cc_larr($constant) "" + } + + if { $cost_dist_curve_tid ne "" } { + set constants_list [acc_fin::pretti_columns_list dc] + if { ![info exists cc_cache_larr(x,${cost_dist_curve_tid}) ] } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists ${cost_dist_curve_tid} cc_larr $constants_list $constants_required_list $instance_id $user_id + # add to input tid cache + foreach constant $constants_list { + set cc_cache_larr($constant,${cost_dist_curve_tid}) $cc_larr($constant) + } + } + #cc_larr(x), cc_larr(y) and optionally cc_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + foreach constant $constants_list { + set cc_larr($constant) $cc_cache_larr($constant,${cost_dist_curve_tid}) + } + } + if { $p3_c_est_low_exists_p } { + set cost_est_low [lindex $p_larr(cost_est_low) $i] + } + if { $p3_c_est_median_exists_p } { + set cost_est_median [lindex $p_larr(cost_est_median) $i] + } + if { $p3_c_est_high_exists_p } { + set cost_est_high [lindex $p_larr(cost_est_high) $i] + } + # import curve given all the available curve choices + ns_log Notice "acc_fin::p_load_tid.1168: for ${p_larr_name} i $i cost_est_low '${cost_est_low}' cost_est_median '${cost_est_median}' cost_est_high '${cost_est_high}' type_ccurve_list '${type_ccurve_list}' cc_larr(x) '$cc_larr(x)' cc_larr(y) '$cc_larr(y)' cc_larr(label) '$cc_larr(label)'" + set curve_list [acc_fin::curve_import $cc_larr(x) $cc_larr(y) $cc_larr(label) $type_ccurve_list $cost_est_low $cost_est_median $cost_est_high $cost_clarr($p1_arr(_cCurveRef)) ccurve_source ] + set ccurvenum [acc_fin::larr_set cost_clarr $curve_list] + if { $ccurvenum eq "" } { + ns_log Notice "acc_fin::p_load_tid.1188: for ${p_larr_name} i $i type $type _cCurveRef is blank for curve_list '${curve_list}'." + } + + + # eco2 curve + set eco2_dist_curve_tid "" + set eco2_dist_curve_name "" + set eco2_est_low "" + set eco2_est_median "" + set eco2_est_high "" + if { $p3_e_dc_name_exists_p } { + set eco2_dist_curve_name [lindex $p_larr(eco2_dist_curve_name) $i] + } + if { $eco2_dist_curve_name ne "" } { + set eco2_dist_curve_tid [qss_tid_from_name $eco2_dist_curve_name $instance_id $user_id] + } + if { $p3_e_dc_tid_exists_p && $eco2_dist_curve_tid eq "" } { + set eco2_dist_curve_tid [lindex $p_larr(eco2_dist_curve_tid) $i] + } + # set defaults + foreach constant $constants_list { + set ec_larr($constant) "" + } + + if { $eco2_dist_curve_tid ne "" } { + set constants_list [acc_fin::pretti_columns_list dc] + if { ![info exists ec_cache_larr(x,${eco2_dist_curve_tid}) ] } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists ${eco2_dist_curve_tid} ec_larr $constants_list $constants_required_list $instance_id $user_id + # add to input tid cache + foreach constant $constants_list { + set ec_cache_larr($constant,${eco2_dist_curve_tid}) $ec_larr($constant) + } + } + #ec_larr(x), ec_larr(y) and optionally ec_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + foreach constant $constants_list { + set ec_larr($constant) $ec_cache_larr($constant,${eco2_dist_curve_tid}) + } + } + if { $p3_e_est_low_exists_p } { + set eco2_est_low [lindex $p_larr(eco2_est_low) $i] + } + if { $p3_e_est_median_exists_p } { + set eco2_est_median [lindex $p_larr(eco2_est_median) $i] + } + if { $p3_e_est_high_exists_p } { + set eco2_est_high [lindex $p_larr(eco2_est_high) $i] + } + # import curve given all the available curve choices + ns_log Notice "acc_fin::p_load_tid.1168: for ${p_larr_name} i $i eco2_est_low '${eco2_est_low}' eco2_est_median '${eco2_est_median}' eco2_est_high '${eco2_est_high}' type_ecurve_list '${type_ecurve_list}' ec_larr(x) '$ec_larr(x)' ec_larr(y) '$ec_larr(y)' ec_larr(label) '$ec_larr(label)'" + set curve_list [acc_fin::curve_import $ec_larr(x) $ec_larr(y) $ec_larr(label) $type_ecurve_list $eco2_est_low $eco2_est_median $eco2_est_high $eco2_clarr($p1_arr(_eCurveRef)) ecurve_source ] + set ecurvenum [acc_fin::larr_set eco2_clarr $curve_list] + if { $ecurvenum eq "" } { + ns_log Notice "acc_fin::p_load_tid.1188: for ${p_larr_name} i $i type $type _eCurveRef is blank for curve_list '${curve_list}'." + } + + + # add curve references for both time and cost. + lappend p_larr(_tCurveRef) $tcurvenum + lappend p_larr(_tDcSource) $tcurve_source + lappend p_larr(_cCurveRef) $ccurvenum + lappend p_larr(_cDcSource) $ccurve_source + lappend p_larr(_eCurveRef) $ecurvenum + lappend p_larr(_eDcSource) $ecurve_source + + ns_log Notice "acc_fin::p_load_tid.1106: for ${p_larr_name} added: p_larr(_tCurveRef) $tcurvenum p_larr(_cCurveRef) $ccurvenum p_larr(_eCurveRef) $ecurvenum" + # Since this is a p3_larr, create pointer arrays for use with p2_larr + if { $type ne "" } { + ns_log Notice "acc_fin::p_load_tid.1121: type_t_curve_arr($type) $tcurvenum" + set type_t_curve_arr($type) $tcurvenum + ns_log Notice "acc_fin::p_load_tid.1123: type_c_curve_arr($type) $ccurvenum" + set type_c_curve_arr($type) $ccurvenum + ns_log Notice "acc_fin::p_load_tid.1125: type_e_curve_arr($type) $ecurvenum" + set type_e_curve_arr($type) $ecurvenum + + } + + } + # end for i, $i < $i_max + + } elseif { $table_type eq "p2" && $success_p } { + # table_type is p2 + # p2 defined curves are loaded in context of higher level of complexity + + + # table_type is p2 + + set p2_t_dc_tid_exists_p [info exists p_larr(time_dist_curve_tid) ] + set p2_t_dc_name_exists_p [info exists p_larr(time_dist_curve_name) ] + set p2_t_est_short_exists_p [info exists p_larr(time_est_short) ] + set p2_t_est_median_exists_p [info exists p_larr(time_est_median) ] + set p2_t_est_long_exists_p [info exists p_larr(time_est_long) ] + + set p2_c_dc_tid_exists_p [info exists p_larr(cost_dist_curve_tid) ] + set p2_c_dc_name_exists_p [info exists p_larr(cost_dist_curve_name) ] + set p2_c_est_low_exists_p [info exists p_larr(cost_est_low) ] + set p2_c_est_median_exists_p [info exists p_larr(cost_est_median) ] + set p2_c_est_high_exists_p [info exists p_larr(cost_est_high) ] + + + set p2_e_dc_tid_exists_p [info exists p_larr(eco2_dist_curve_tid) ] + set p2_e_dc_name_exists_p [info exists p_larr(eco2_dist_curve_name) ] + set p2_e_est_low_exists_p [info exists p_larr(eco2_est_low) ] + set p2_e_est_median_exists_p [info exists p_larr(eco2_est_median) ] + set p2_e_est_high_exists_p [info exists p_larr(eco2_est_high) ] + + ns_log Notice "acc_fin::p_load_tid.1227: for ${p_larr_name} i_max ${i_max}" + for {set i 0} {$i < $i_max} {incr i} { + + # time curve + set time_dist_curve_tid "" + set time_dist_curve_name "" + set time_est_short "" + set time_est_median "" + set time_est_long "" + if { $p2_t_dc_name_exists_p } { + set time_dist_curve_name [lindex $p_larr(time_dist_curve_name) $i] + ns_log Notice "acc_fin::p_load_tid.1238: for ${p_larr_name} i $i q1" + } + if { $time_dist_curve_name ne "" } { + set time_dist_curve_tid [qss_tid_from_name $time_dist_curve_name $instance_id $user_id] + ns_log Notice "acc_fin::p_load_tid.1242: for ${p_larr_name} i $i q2" + } + if { $p2_t_dc_tid_exists_p && $time_dist_curve_tid eq "" } { + set time_dist_curve_tid [lindex $p_larr(time_dist_curve_tid) $i] + ns_log Notice "acc_fin::p_load_tid.1246: for ${p_larr_name} i $i q3" + } + # set defaults + set constants_list [acc_fin::pretti_columns_list dc] + foreach constant $constants_list { + set tc_larr($constant) "" + } + + if { $time_dist_curve_tid ne "" } { + if { ![info exists tc_cache_larr(x,${time_dist_curve_tid}) ] } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists ${time_dist_curve_tid} tc_larr $constants_list $constants_required_list $instance_id $user_id + # add to temporary cache + foreach constant $constants_list { + set tc_cache_larr($constant,${time_dist_curve_tid}) $tc_larr($constant) + } + } + #tc_larr(x), tc_larr(y) and optionally tc_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + foreach constant $constants_list { + set tc_larr($constant) $tc_cache_larr($constant,${time_dist_curve_tid}) + } + } + if { $p2_t_est_short_exists_p } { + set time_est_short [lindex $p_larr(time_est_short) $i] + } + + if { $p2_t_est_median_exists_p } { + set time_est_median [lindex $p_larr(time_est_median) $i] + } + if { $p2_t_est_long_exists_p } { + set time_est_long [lindex $p_larr(time_est_long) $i] + } + + # import curve given all the available curve choices + + if { $p2_types_exist_p && $p2_type_column_exists_p } { + # aid_type exists, so include option in curve_import + # load aid_type referenced curves here. + set aid_type [lindex $p_larr(aid_type) $i] + if { $aid_type ne "" } { + if { [info exists type_t_curve_arr(${aid_type}) ] } { + set type_tcurve_list $time_clarr($type_t_curve_arr(${aid_type})) + } else { + set success_p 0 + acc_fin::pretti_log_create $scenario_tid "p_load_tid" "#accounts-finance.value#" "aid_type: '${aid_type}'; #accounts-finance.error# #accounts-finance.aid_type_for_time_not_found# (ref1440)" $user_id $instance_id + } + } + } + ns_log Notice "acc_fin::p_load_tid.1280: for ${p_larr_name} i $i time_est_short '${time_est_short}' time_est_median '${time_est_median}' time_est_long '${time_est_long}' type_tcurve_list '${type_tcurve_list}' tc_larr(x) '$tc_larr(x)' tc_larr(y) '$tc_larr(y)' tc_larr(label) '$tc_larr(label)'" + set curve_list [acc_fin::curve_import $tc_larr(x) $tc_larr(y) $tc_larr(label) $type_tcurve_list $time_est_short $time_est_median $time_est_long $time_clarr($p1_arr(_tCurveRef)) curve_source ] + set tcurvenum [acc_fin::larr_set time_clarr $curve_list] + if { $tcurvenum eq "" } { + ns_log Warning "acc_fin::p_load_tid.1284: for ${p_larr_name} i $i type $type _tCurveRef is blank for curve_list '${curve_list}'." + } + + lappend p_larr(_tCurveRef) $tcurvenum + lappend p_larr(_tDcSource) $curve_source + + # cost curve + set cost_dist_curve_tid "" + set cost_dist_curve_name "" + set cost_est_low "" + set cost_est_median "" + set cost_est_high "" + if { $p2_c_dc_name_exists_p } { + set cost_dist_curve_name [lindex $p_larr(cost_dist_curve_name) $i] + } + if { $cost_dist_curve_name ne "" } { + set cost_dist_curve_tid [qss_tid_from_name $cost_dist_curve_name $instance_id $user_id] + } + if { $p2_c_dc_tid_exists_p && $cost_dist_curve_tid eq "" } { + set cost_dist_curve_tid [lindex $p_larr(cost_dist_curve_tid) $i] + } + # set defaults + foreach constant $constants_list { + set cc_larr($constant) "" + } + + if { $cost_dist_curve_tid ne "" } { + set constants_list [acc_fin::pretti_columns_list dc] + if { ![info exists cc_cache_larr(x,${cost_dist_curve_tid}) ] } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists ${cost_dist_curve_tid} cc_larr $constants_list $constants_required_list $instance_id $user_id + # add to input tid cache + foreach constant $constants_list { + set cc_cache_larr($constant,${cost_dist_curve_tid}) $cc_larr($constant) + } + } + #cc_larr(x), cc_larr(y) and optionally cc_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + foreach constant $constants_list { + set cc_larr($constant) $cc_cache_larr($constant,${cost_dist_curve_tid}) + } + } + if { $p2_c_est_low_exists_p } { + set cost_est_low [lindex $p_larr(cost_est_low) $i] + } + if { $p2_c_est_median_exists_p } { + set cost_est_median [lindex $p_larr(cost_est_median) $i] + } + if { $p2_c_est_high_exists_p } { + set cost_est_high [lindex $p_larr(cost_est_high) $i] + } + + # import curve given all the available curve choices + + if { $p2_types_exist_p && $p2_type_column_exists_p && $aid_type ne "" } { + # aid_type exists, so include option in curve_import + set aid_type [lindex $p_larr(aid_type) $i] + if { [info exists type_c_curve_arr(${aid_type}) ] } { + set type_ccurve_list $cost_clarr($type_c_curve_arr(${aid_type})) + } else { + set success_p 0 + acc_fin::pretti_log_create $scenario_tid "p_load_tid" "#accounts-finance.value#" "aid_type '${aid_type}'; #accounts-finance.error# #accounts-finance.aid_type_for_cost_not_found# (ref1540)" $user_id $instance_id + } + + } + ns_log Notice "acc_fin::p_load_tid.1352: for ${p_larr_name} i $i cost_est_low '${cost_est_low}' cost_est_median '${cost_est_median}' cost_est_high '${cost_est_high}' type_ccurve_list '${type_ccurve_list}' cc_larr(x) '$cc_larr(x)' cc_larr(y) '$cc_larr(y)' cc_larr(label) '$cc_larr(label)'" + set curve_list [acc_fin::curve_import $cc_larr(x) $cc_larr(y) $cc_larr(label) $type_ccurve_list $cost_est_low $cost_est_median $cost_est_high $cost_clarr($p1_arr(_cCurveRef)) curve_source] + set ccurvenum [acc_fin::larr_set cost_clarr $curve_list] + + if { $ccurvenum eq "" } { + ns_log Warning "acc_fin::p_load_tid.1356: for ${p_larr_name} i $i type $type _cCurveRef is blank for curve_list '${curve_list}'." + } + lappend p_larr(_cCurveRef) $ccurvenum + lappend p_larr(_cDcSource) $curve_source + + + + # eco2 curve + set eco2_dist_curve_tid "" + set eco2_dist_curve_name "" + set eco2_est_low "" + set eco2_est_median "" + set eco2_est_high "" + if { $p2_e_dc_name_exists_p } { + set eco2_dist_curve_name [lindex $p_larr(eco2_dist_curve_name) $i] + } + if { $eco2_dist_curve_name ne "" } { + set eco2_dist_curve_tid [qss_tid_from_name $eco2_dist_curve_name $instance_id $user_id] + } + if { $p2_e_dc_tid_exists_p && $eco2_dist_curve_tid eq "" } { + set eco2_dist_curve_tid [lindex $p_larr(eco2_dist_curve_tid) $i] + } + # set defaults + foreach constant $constants_list { + set ec_larr($constant) "" + } + + if { $eco2_dist_curve_tid ne "" } { + set constants_list [acc_fin::pretti_columns_list dc] + if { ![info exists ec_cache_larr(x,${eco2_dist_curve_tid}) ] } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists ${eco2_dist_curve_tid} ec_larr $constants_list $constants_required_list $instance_id $user_id + # add to input tid cache + foreach constant $constants_list { + set ec_cache_larr($constant,${eco2_dist_curve_tid}) $ec_larr($constant) + } + } + #ec_larr(x), ec_larr(y) and optionally ec_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + foreach constant $constants_list { + set ec_larr($constant) $ec_cache_larr($constant,${eco2_dist_curve_tid}) + } + } + if { $p2_e_est_low_exists_p } { + set eco2_est_low [lindex $p_larr(eco2_est_low) $i] + } + if { $p2_e_est_median_exists_p } { + set eco2_est_median [lindex $p_larr(eco2_est_median) $i] + } + if { $p2_e_est_high_exists_p } { + set eco2_est_high [lindex $p_larr(eco2_est_high) $i] + } + + # import curve given all the available curve choices + + if { $p2_types_exist_p && $p2_type_column_exists_p && $aid_type ne "" } { + # aid_type exists, so include option in curve_import + set aid_type [lindex $p_larr(aid_type) $i] + if { [info exists type_e_curve_arr(${aid_type}) ] } { + set type_ecurve_list $eco2_clarr($type_e_curve_arr(${aid_type})) + } else { + set success_p 0 + acc_fin::pretti_log_create $scenario_tid "p_load_tid" "#accounts-finance.value#" "aid_type '${aid_type}'; #accounts-finance.error# #accounts-finance.aid_type_for_eco2_not_found# (ref1545)" $user_id $instance_id + } + + } + ns_log Notice "acc_fin::p_load_tid.1353: for ${p_larr_name} i $i eco2_est_low '${eco2_est_low}' eco2_est_median '${eco2_est_median}' eco2_est_high '${eco2_est_high}' type_ecurve_list '${type_ecurve_list}' cc_larr(x) '$ec_larr(x)' ec_larr(y) '$ec_larr(y)' ec_larr(label) '$ec_larr(label)'" + set curve_list [acc_fin::curve_import $ec_larr(x) $ec_larr(y) $ec_larr(label) $type_ecurve_list $eco2_est_low $eco2_est_median $eco2_est_high $eco2_clarr($p1_arr(_eCurveRef)) curve_source] + set ecurvenum [acc_fin::larr_set eco2_clarr $curve_list] + + if { $ecurvenum eq "" } { + ns_log Warning "acc_fin::p_load_tid.1357: for ${p_larr_name} i $i type $type _eCurveRef is blank for curve_list '${curve_list}'." + } + lappend p_larr(_eCurveRef) $ecurvenum + lappend p_larr(_eDcSource) $curve_source + + + # add default coefficient + lappend p_larr(_coef) 1 + } + } else { + ns_log Warning "acc_fin::p_load_tid.1361: for ${p_larr_name} not processed as either p2 or p3 table." + } + return $success_p +} + +ad_proc -private acc_fin::list_filter { + type + user_input_list + {table_name ""} + {list_name ""} +} { + filters input as a list to meet basic word or reference requirements. type can be alphanum decimal natnum alphanumlist factorlist. If decimal or natural number (natnum) does not pass filter, value is replaced with blank. if table_name and list_name is specified and an input value doesn't pass, procedure logs an error to the server and notifies user of count of filtered changes via pretti_log_create +} { + set type_errors_count 0 + switch -exact $type { + alphanumlist { + # some table columns contain lists of items.. + set filtered_list [list ] + foreach input_row_unfiltered $user_input_list { + set filtered_row_list [list ] + foreach input_unfiltered $input_row_unfiltered { + # added dash and underscore, because these are often used in alpha/text references + regsub -all -nocase -- {[^a-z0-9,\.\-\_]+} $input_unfiltered {} input_filtered + lappend filtered_row_list $input_filtered + } + lappend filtered_list $filtered_row_list + } + } + factorlist { + # some table columns contain lists of items.. + set filtered_list [list ] + foreach input_row_unfiltered $user_input_list { + set filtered_row_list [list ] + foreach input_unfiltered $input_row_unfiltered { + # added dash and underscore, because these are often used in alpha/text references + regsub -all -nocase -- {[^a-z0-9,\.\-\_\*]+} $input_unfiltered {} input_filtered + lappend filtered_row_list $input_filtered + } + lappend filtered_list $filtered_row_list + } + } + alphanum { + set filtered_list [list ] + foreach input_unfiltered $user_input_list { + # added dash and underscore, because these are often used in alpha/text references + regsub -all -nocase -- {[^a-z0-9,\.\-\_]+} $input_unfiltered {} input_filtered + lappend filtered_list $input_filtered + } + } + decimal { + set filtered_list [list ] + foreach input_unfiltered $user_input_list { + if { $input_unfiltered ne "" && ![qf_is_decimal $input_unfiltered] } { + incr type_errors_count + ns_log Notice "acc_fin::list_filter.1152: val '${val}' in '${table_name}.${list_name}' is not a decimal number." + lappend filtered_list "" + } else { + lappend filtered_list $input_unfiltered + } + } + } + natnum { + set filtered_list [list ] + foreach input_unfiltered $user_input_list { + if { $input_unfiltered ne "" && ![qf_is_natural_number $input_unfiltered] } { + incr type_errors_count + ns_log Notice "acc_fin::list_filter.1164: val '${val}' in '${table_name}.${list_name}' is not a natural number." + lappend filtered_list "" + } else { + lappend filtered_list $input_unfiltered + } + } + } + } + if { $type_errors_count > 0 } { + acc_fin::pretti_log_create $scenario_tid $table_name "#accounts-finance.value#" "#accounts-finance.table_name# '${table_name}'; #accounts-finance.set_name# '${list_name}'; #accounts-finance.unacceptable_values_in_set# #accounts-finance.count#: ${type_errors_count}" $user_id $instance_id + set type_errors_count 0 + set type_errors_p 1 + } + + return $filtered_list +} + +ad_proc -public acc_fin::table_type { + table_id + {instance_id ""} + {user_id ""} +} { + returns table flags. +} { + set stats_list [qss_table_stats $table_id $instance_id $user_id] + # stats: name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id. + set flags [string trim [lindex $stats_list 6]] + return $flags +} + + +ad_proc -private acc_fin::curve_import { + c_x_list + c_y_list + c_label_list + curve_lists + minimum + median + maximum + default_lists + {case_var_name ""} +} { + Returns curve data to standard representation for PRETTI processing. + Expects column labels in arbitrary order in row lists, but no titles with c_*_list. + Distribution curve format is a spreadsheet table format with labeled columns 'x' and 'y' (and optionally 'label'). + Returns columns in order of x,y (,label) for minimizing memory footprint when used with acc_fin::larr_set. + 1. If a curve exists in c_x_list, c_y_list (, c_label_list), use it. + 2. If a curve exists in curve_lists where each element is a list of x, followed by list of y ( and perhaps followed by label), use it. + 3. If a minimum, median, and maximum is available, make a curve of it. + 4. if an median value is available, make a curve of it, + 5. if an ordered list of lists x,y,label exists, use it as a fallback default, otherwise + 6. return a representation of a normalized curve as a list of lists similar to curve_lists +} { + upvar 1 p1_arr p1_arr + if { $case_var_name ne "" } { + upvar 1 $case_var_name case_var + } + # In persuit of making curve_data + # local curves are represented as a list of lists + # with each list a triplet set x, y, label, with the first row consisting of title names + + # local 3-point (min,median,max) represented as a list of 3 elements + # local median represented as a single element + # default curve represented as a list of lists + # if no default available, create one based on a normalized standard. + + set c_lists [list ] + + # 1. If a curve exists in c_x_list, c_y_list (, c_label_list), use it. + set c_x_list_len [llength $c_x_list] + set c_y_list_len [llength $c_y_list] + set c_label_list_len [llength $c_label_list] + set list_len 0 + if { $c_x_list_len > 0 && $c_x_list_len < $c_y_list_len } { + set list_len $c_x_list_len + } elseif { $c_y_list_len > 0 } { + set list_len $c_y_list_len + } + if { $list_len > 0 } { + if { $c_label_list_len > 0 } { + # x, y and label + lappend c_lists [list x y label] + set case_var 1 + ns_log Notice "acc_fin::curve_import.1237 case 1. building list from x, y and label " + for {set i 0} {$i < $list_len} {incr i} { + set row [list [lindex $c_x_list $i] [lindex $c_y_list $i] [lindex $c_label_list $i] ] + lappend c_lists $row + } + } else { + # x and y only + lappend c_lists [list x y] + set case_var 1 + ns_log Notice "acc_fin::curve_import.1244 case 1. building list from x and y " + for {set i 0} {$i < $list_len} {incr i} { + set row [list [lindex $c_x_list $i] [lindex $c_y_list $i] ] + lappend c_lists $row + } + } + } + + # 2. If a curve exists in curve_lists where each element is a list of x,y(,label), use it. + set curve_lists_len [llength $curve_lists] + if { [llength $c_lists] == 0 && $curve_lists_len > 0 } { + set title_list [lindex $curve_lists 0] + set y_idx [lsearch -exact $title_list "y"] + set x_idx [lsearch -exact $title_list "x"] + set label_idx [lsearch -exact $title_list "label"] + if { $label_idx > -1 } { + set label_exists_p 1 + } else { + set label_exists_p 0 + } + ns_log Notice "acc_fin::curve_import.1255 case 2. building curve_lists " + # curve exists. + set point_len [llength [lindex $curve_lists 0] ] + if { $point_len > 1 } { + # Reorder columns? + if { $x_idx == 0 && $y_idx == 1 } { + set c_lists $curve_lists + } else { + # Reorder columns for output + foreach point_list $curve_lists { + set x [lindex $point_list $x_idx] + set y [lindex $point_list $y_idx] + if { $label_exists_p } { + set label [lindex $point_list $label_idx] + set point_new_list [list $x $y $label] + } else { + set point_new_list [list $x $y] + } + lappend c_lists $point_new_list + } + } + set case_var 2 + } + + } + + # 3. If a minimum, median, and maximum is available, make a curve of it. + # or + if { [llength $c_lists] == 0 && $minimum ne "" && $median ne "" && $maximum ne "" } { + ns_log Notice "acc_fin::curve_import.1272 case 3. building curve from min/med/max points " + # min,med,max values available + # Geometric median requires all three values + + # time_expected = ( time_optimistic + 4 * time_most_likely + time_pessimistic ) / 6. + # per http://en.wikipedia.org/wiki/Program_Evaluation_and_Review_Technique + if { [info exists p1_arr(pert_omp) ] && $p1_arr(pert_omp) eq "strict" } { + set c_lists [acc_fin::pert_omp_to_strict_dc $minimum $median $maximum ] + set case_var 3.1 + } else { + set c_lists [acc_fin::pert_omp_to_normal_dc $minimum $median $maximum ] + set case_var 3.0 + } + + } + + # 4. if an median value is available, make a curve of it, + #set standard_deviation 0.682689492137 + #set std_dev_parts [expr { $standard_deviation / 4. } ] + #set outliers [expr { 0.317310507863 / 2. } ] + if { [llength $c_lists] == 0 && $median ne "" } { + ns_log Notice "acc_fin::curve_import.1272 case 4. building curve from med and maybe min or max points " + set med_label "med" + if { $minimum eq "" } { + set minimum $median + set min_label $med_label + } else { + set min_label "min" + } + if { $maximum eq "" } { + set maximum $median + set max_label $med_label + } else { + set max_label "max" + } + + # min,med,max values available + # Geometric median requires all three values + + # time_expected = ( time_optimistic + 4 * time_most_likely + time_pessimistic ) / 6. + # per http://en.wikipedia.org/wiki/Program_Evaluation_and_Review_Technique + if { [info exists p1_arr(pert_omp) ] && $p1_arr(pert_omp) eq "strict" } { + set c_lists [acc_fin::pert_omp_to_strict_dc $minimum $median $maximum ] + set case_var 4.1 + + } else { + set c_lists [acc_fin::pert_omp_to_normal_dc $minimum $median $maximum ] + set case_var 4.0 + } + } + + # 5. if an ordered list of lists x,y,label exists, use it as a fallback default + if { [llength $c_lists] == 0 && [llength $default_lists] > 0 && [llength [lindex $default_lists 0] ] > 1 } { + ns_log Notice "acc_fin::curve_import.1298 case 5. building curve_lists from default_lists " + set c_lists $default_lists + set case_var 5 + } + + # 6. return a representation of a normalized curve as a list of lists similar to curve_lists + if { [llength $c_lists] == 0 } { + ns_log Notice "acc_fin::curve_import.1304 case 6. building curve_lists from blanks" + # No time defaults. + # following is essentially the same as acc_fin::pert_omp_to_normal_dc + # set duration to 1 for limited block feedback. + #set tc_larr(y) [list $outliers $std_dev_parts $std_dev_parts $std_dev_parts $std_dev_parts $outliers] + set minimum 0.5 + set median 1. + set maximum 2. + set tc_larr(y) [list y $minimum $median $median $median $median $maximum] + # using approximate cumulative distribution y values for standard deviation of 1. + set portion [expr { 1. / 6. } ] + set tc_larr(x) [list x $portion $portion $portion $portion $portion $portion ] + set tc_larr(label) [list label "outlier" "standard deviation 2" "standard deviation 1" "standard deviation 1" "standard deviation 2" "outlier" ] + + set c_lists [list ] + for {set i 0} {$i < 7} {incr i} { + lappend c_lists [list [lindex $tc_larr(x) $i] [lindex $tc_larr(y) $i] [lindex $tc_larr(label) $i]] + } + set case_var 6 + } + if { [llength $c_lists] == 0 } { + set case_var 0 + # This shouldn't happen.. for the most part. + ns_log Notice "acc_fin::curve_import.1312: len c_list 0 " + ns_log Notice "acc_fin::curve_import.1312: c_x_list $c_x_list " + ns_log Notice "acc_fin::curve_import.1312: c_y_list $c_y_list " + ns_log Notice "acc_fin::curve_import.1312: c_label_list $c_label_list " + ns_log Notice "acc_fin::curve_import.1312: curve_lists $curve_lists " + ns_log Notice "acc_fin::curve_import.1312: minimum $minimum median $median maximum $maxium " + ns_log Notice "acc_fin::curve_import.1312: default_lists $default_lists " + } + # Return an ordered list of lists representing a curve + ns_log Notice "acc_fin::curve_import.1639: c_lists '$c_lists'" + return $c_lists +} + +ad_proc -public acc_fin::scenario_prettify { + scenario_tid + {instance_id ""} + {user_id ""} +} { + Processes PRETTI scenario. Returns resulting PRETTI table as a list of lists. +} { + # General notes: + + # Can create a projected completion curve by stepping through the range of all + # the performance curves N times for N point curve --instead of Monte Carlo simm. + + # About output table: + # Vertical represents time. All tasks are rounded up to quantized time_unit. + # Smallest task duration is the number of quantized time_units that result in 1 line of text. + # To find smallest task duration, repeat PRETTI scenario on tracks with CP tasks by task type, + # then increment by quantized time_unit (row), tracking overages + # amount to extend CP duration: + # collision_count / task_type * ( row_counts / ( time_quanta per task_type_duration ) + 1 ) + + # Represents task bottlenecks --limits in parallel activity of same type + # Parallel limits represented by using: + # concurrency_limit: count of tasks of same type that can operate in parallel + # overlap_limit: a percentage representing amount of overlap allowed. + # overlap_limit, in effect, creates progressions of activity + + # Since PRETTI does not schedule, don't manipulate task positioning, + # just increase duration of task(s) to account for any overages. + + # Activities: + # Represent multiple dependencies of same task for example 99 cartwheels using * as in 99*cartwheels + + + set setup_start [clock seconds] + if { $instance_id eq "" } { + # Added warning for diagnostics if called via schedule proc + ns_log Warning "acc_fin::scenario_prettify.2364 instance_id not previously set." + set instance_id [ad_conn package_id] + } + if { $user_id eq "" } { + # Added warning for diagnostics if called via schedule proc + ns_log Warning "acc_fin::scenario_prettify.2368 instance_id not previously set." + set user_id [ad_conn user_id] + } + ## error_fail is set to 1 if there has been an error that prevents continued processing + ## error_cost is set to 1 if there has been an error that prevents continued processing of cost aspects + ## error_time is set to 1 if there has been an error that prevents continued processing of time aspects + ## error_eco2 is set to 1 if there has been an error that prevents continued processing of eco2 aspects + set error_fail 0 + set error_cost 0 + set error_time 0 + set error_eco2 0 + set index_eq "" + # # # load scenario values -- requires scenario_tid + + # activity_table contains: + # activity_ref predecessors time_est_short time_est_median time_est_long cost_est_low cost_est_median cost_est_high time_dist_curv_eq cost_dist_curv_eq + + + # # # load p1 + ns_log Notice "acc_fin::scenario_prettify.1306: scenario '$scenario_tid' start. Load p1 table" + + # get scenario into array p1_arr + set constants_list [acc_fin::pretti_columns_list p1] + foreach constant $constants_list { + set p1_arr($constant) "" + } + # preload p1 defaults + + set p1_arr(time_probability_point) "0.5" + # set p1_arr(max_overlap_pct) "" defaults to 1 + # set p1_arr(max_concurrent) "" defaults to no limit. + # set p1_arr(max_run_time) "" defaults no limit + # set p1_arr(max_tasks_per_run) "" defaults to no limit + # # # identify table ids to process + set constants_required_list [acc_fin::pretti_columns_list p1 1] + qss_tid_scalars_to_array $scenario_tid p1_arr $constants_list $constants_required_list $instance_id $user_id + + if { $p1_arr(activity_table_name) ne "" } { + # set activity_table_tid + set p1_arr(activity_table_tid) [qss_tid_from_name $p1_arr(activity_table_name) $instance_id $user_id] + if { $p1_arr(activity_table_tid) eq "" } { + acc_fin::pretti_log_create $scenario_tid "activity_table_name" "#accounts-finance.value#" "activity_table_name #accounts-finance.unknown_reference#" $user_id $instance_id + } + } + if { $p1_arr(task_types_name) ne "" } { + # set task_types_tid + set p1_arr(task_types_tid) [qss_tid_from_name $p1_arr(task_types_name) $instance_id $user_id] + if { $p1_arr(task_types_tid) eq "" } { + acc_fin::pretti_log_create $scenario_tid "task_types_name" "#accounts-finance.value#" "task_types_name #accounts-finance.unknown_reference#" $user_id $instance_id + } + } + if { $p1_arr(time_dist_curve_name) ne "" } { + # set dist_curve_tid + set p1_arr(time_dist_curve_tid) [qss_tid_from_name $p1_arr(time_dist_curve_name) $instance_id $user_id] + if { $p1_arr(time_dist_curve_tid) eq "" } { + acc_fin::pretti_log_create $scenario_tid "time_dist_curve_name" "#accounts-finance.value#" "time_dist_curve_name #accounts-finance.unknown_reference#" $user_id $instance_id + } + + } + if { $p1_arr(cost_dist_curve_name) ne "" } { + # set dist_curve_tid + set p1_arr(cost_dist_curve_tid) [qss_tid_from_name $p1_arr(cost_dist_curve_name) $instance_id $user_id ] + if { $p1_arr(cost_dist_curve_tid) eq "" } { + acc_fin::pretti_log_create $scenario_tid "cost_dist_curve_name" "#accounts-finance.value#" "cost_dist_curve_name #accounts-finance.unknown_reference#" $user_id $instance_id + } + } + if { $p1_arr(eco2_dist_curve_name) ne "" } { + # set dist_curve_tid + set p1_arr(eco2_dist_curve_tid) [qss_tid_from_name $p1_arr(eco2_dist_curve_name) $instance_id $user_id ] + if { $p1_arr(eco2_dist_curve_tid) eq "" } { + acc_fin::pretti_log_create $scenario_tid "eco2_dist_curve_name" "#accounts-finance.value#" "eco2_dist_curve_name #accounts-finance.unknown_reference#" $user_id $instance_id + } + } + + + set constants_exist_p 1 + set compute_message_list [list ] + foreach constant $constants_required_list { + if { $p1_arr($constant) eq "" } { + set constants_exist_p 0 + lappend compute_message_list "Initial condition constant '${constant}'; #accounts-finance.unknown_reference# #accounts-finance.reference_is_required#" + acc_fin::pretti_log_create $scenario_tid "${constant}" "#accounts-finance.value#" "${constant}; #accounts-finance.unknown_reference# #accounts-finance.reference_is_required#" $user_id $instance_id + # This may be triggered by code/permissions unable to find p1 table. Report more info? + + set error_fail 1 + } + } + + + # # # set defaults specified in p1 + ns_log Notice "acc_fin::scenario_prettify.1369: scenario '$scenario_tid' set defaults specified in p1 table." + + + # # # Make time_curve_data defaults + ns_log Notice "acc_fin::scenario_prettify.1382: scenario '$scenario_tid' make time_curve_data defaults from p1." + + # These are the default values unless more specific data is specified in a task list. + # The most specific information is used for each activity. + # Median (most likely) point is assumed along the (cumulative) distribution curve, unless + # a time_probability_point is specified. time_probability_point is only available as a general term. + # local curve + # local 3-point (min,median,max) + # general curve (normalized to local 1 point median ); local 1 point median is minimum time data requirement + # general 3-point (normalized to local median) + set constants_list [acc_fin::pretti_columns_list dc] + foreach constant $constants_list { + set tc_larr($constant) [list ] + } + + if { $p1_arr(time_dist_curve_tid) ne "" } { + set table_stats_list [qss_table_stats $p1_arr(time_dist_curve_tid) $instance_id $user_id] + set trashed_p [lindex $table_stats_list 7] + if { [llength $table_stats_list] > 1 && !$trashed_p } { + # get time curve into array tc_larr + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists $p1_arr(time_dist_curve_tid) tc_larr $constants_list $constants_required_list $instance_id $user_id + #tc_larr(x), tc_larr(y) and optionally tc_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + ns_log Notice "acc_fin::scenario_prettify.1392: scenario '$scenario_tid' tc_larr(x) '$tc_larr(x)' tc_larr(y) '$tc_larr(y)'" + # validate x and y values before importing + set type_errors_count 0 + set type_errors_p 0 + set column_ck_list [list x y] + foreach col $column_ck_list { + set filtered_list [acc_fin::list_filter decimal $tc_larr($col) "time_dist_curve_tid: $p1_arr(time_dist_curve_tid)" $col] + if { $filtered_list ne $tc_larr($col) } { + set type_errors_p 1 + } + } + if { $type_errors_p } { + # undo data expansion + set tc_larr(x) [list ] + set tc_larr(y) [list ] + if { [info exists tc_larr(label)] } { + set tc_larr(label) [list ] + } + } + + } else { + acc_fin::pretti_log_create $scenario_tid "time_dist_curve_tid" "#accounts-finance.value#" "time_dist_curve #accounts-finance.unknown_reference#" $user_id $instance_id + } + } + set tc_lists [acc_fin::curve_import $tc_larr(x) $tc_larr(y) $tc_larr(label) [list ] $p1_arr(time_est_short) $p1_arr(time_est_median) $p1_arr(time_est_long) [list ] tcurve_source ] + + + # # # Make cost_curve_data defaults + ns_log Notice "acc_fin::scenario_prettify.1401 :scenario '$scenario_tid' make cost_curve_data defaults from p1." + + set constants_list [acc_fin::pretti_columns_list dc] + foreach constant $constants_list { + set cc_larr($constant) [list ] + } + if { $p1_arr(cost_dist_curve_tid) ne "" } { + set table_stats_list [qss_table_stats $p1_arr(cost_dist_curve_tid) $instance_id $user_id] + set trashed_p [lindex $table_stats_list 7] + if { [llength $table_stats_list] > 1 && !$trashed_p } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists $p1_arr(cost_dist_curve_tid) cc_larr $constants_list $constants_required_list $instance_id $user_id + #cc_larr(x), cc_larr(y) and optionally cc_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + ns_log Notice "acc_fin::scenario_prettify.1404: scenario '$scenario_tid' cc_larr(x) '$cc_larr(x)' cc_larr(y) '$cc_larr(y)'" + # validate x and y values before importing + set type_errors_count 0 + set type_errors_p 0 + set column_ck_list [list x y] + foreach col $column_ck_list { + set filtered_list [acc_fin::list_filter decimal $cc_larr($col) "cost_dist_curve_tid: $p1_arr(cost_dist_curve_tid)" $col] + if { $filtered_list ne $cc_larr($col) } { + set type_errors_p 1 + } + } + if { $type_errors_p } { + # undo data expansion + set cc_larr(x) [list ] + set cc_larr(y) [list ] + if { [info exists cc_larr(label)] } { + set cc_larr(label) [list ] + } + } + + } else { + acc_fin::pretti_log_create $scenario_tid "cost_dist_curve_tid" "#accounts-finance.value#" "cost_dist_curve #accounts-finance.unknown_reference#" $user_id $instance_id + } + } + ns_log Notice "acc_fin::scenario_prettify.1422: scenario '$scenario_tid' cc_larr(x) '$cc_larr(x)' cc_larr(y) '$cc_larr(y)'" + set cc_lists [acc_fin::curve_import $cc_larr(x) $cc_larr(y) $cc_larr(label) [list ] $p1_arr(cost_est_low) $p1_arr(cost_est_median) $p1_arr(cost_est_high) [list ] ccurve_source ] + + + # # # Make eco2_curve_data defaults + ns_log Notice "acc_fin::scenario_prettify.1401 :scenario '$scenario_tid' make eco2_curve_data defaults from p1." + + set constants_list [acc_fin::pretti_columns_list dc] + foreach constant $constants_list { + set ec_larr($constant) [list ] + } + if { $p1_arr(eco2_dist_curve_tid) ne "" } { + set table_stats_list [qss_table_stats $p1_arr(eco2_dist_curve_tid) $instance_id $user_id] + set trashed_p [lindex $table_stats_list 7] + if { [llength $table_stats_list] > 1 && !$trashed_p } { + set constants_required_list [acc_fin::pretti_columns_list dc 1] + qss_tid_columns_to_array_of_lists $p1_arr(eco2_dist_curve_tid) ec_larr $constants_list $constants_required_list $instance_id $user_id + #ec_larr(x), ec_larr(y) and optionally ec_larr(label) where _larr refers to an array where each value is a list of column data by row 1..n + ns_log Notice "acc_fin::scenario_prettify.1404: scenario '$scenario_tid' ec_larr(x) '$ec_larr(x)' ec_larr(y) '$ec_larr(y)'" + # validate x and y values before importing + set type_errors_count 0 + set type_errors_p 0 + set column_ck_list [list x y] + foreach col $column_ck_list { + set filtered_list [acc_fin::list_filter decimal $ec_larr($col) "eco2_dist_curve_tid: $p1_arr(eco2_dist_curve_tid)" $col] + if { $filtered_list ne $ec_larr($col) } { + set type_errors_p 1 + } + } + if { $type_errors_p } { + # undo data expansion + set ec_larr(x) [list ] + set ec_larr(y) [list ] + if { [info exists ec_larr(label)] } { + set ec_larr(label) [list ] + } + } + + } else { + acc_fin::pretti_log_create $scenario_tid "eco2_dist_curve_tid" "#accounts-finance.value#" "eco2_dist_curve #accounts-finance.unknown_reference#" $user_id $instance_id + } + } + ns_log Notice "acc_fin::scenario_prettify.1422: scenario '$scenario_tid' ec_larr(x) '$ec_larr(x)' ec_larr(y) '$ec_larr(y)'" + set ec_lists [acc_fin::curve_import $ec_larr(x) $ec_larr(y) $ec_larr(label) [list ] $p1_arr(eco2_est_low) $p1_arr(eco2_est_median) $p1_arr(eco2_est_high) [list ] ecurve_source ] + + + # curves_larr ie *_c_larr has 3 versions: time as t_c_larr, cost as c_c_larr, eco2 as e_c_larr + # index 0 is default + set p1_arr(_tCurveRef) [acc_fin::larr_set time_clarr $tc_lists] + set p1_arr(_tDcSource) $tcurve_source + # set time_clarr(0) $tc_lists + set p1_arr(_cCurveRef) [acc_fin::larr_set cost_clarr $cc_lists] + set p1_arr(_cDcSource) $ccurve_source + # set cost_clarr(0) $cc_lists + set p1_arr(_eCurveRef) [acc_fin::larr_set eco2_clarr $ec_lists] + set p1_arr(_eDcSource) $ecurve_source + # set eco2_clarr(0) $ec_lists + ns_log Notice "acc_fin::scenario_prettify.1426: scenario '$scenario_tid' default t curve: time_clarr($p1_arr(_tCurveRef)) '$tc_lists'" + ns_log Notice "acc_fin::scenario_prettify.1427: scenario '$scenario_tid' default c curve: cost_clarr($p1_arr(_cCurveRef)) '$cc_lists'" + ns_log Notice "acc_fin::scenario_prettify.1428: scenario '$scenario_tid' default e curve: eco2_clarr($p1_arr(_eCurveRef)) '$ec_lists'" + + # # # import task_types table p3 + ns_log Notice "acc_fin::scenario_prettify.1432: scenario '$scenario_tid' import task_types table p3, if any." + + # set defaults + set constants_list [acc_fin::pretti_columns_list p3] + foreach constant $constants_list { + set p3_larr($constant) [list ] + } + # declare auxiliary variables list + ## aux_col_names_list is the list of auxiliary column names in p2_larr to perform auxiliary calculations identical to cost + set aux_col_names_list [list ] + + if { $p1_arr(task_types_tid) ne "" } { + set table_stats_list [qss_table_stats $p1_arr(task_types_tid) $instance_id $user_id] + set trashed_p [lindex $table_stats_list 7] + if { [llength $table_stats_list] > 1 && !$trashed_p } { + set constants_required_list [acc_fin::pretti_columns_list p3 1] + ns_log Notice "acc_fin::scenario_prettify.1459: scenario '$scenario_tid' import task_types from '$p1_arr(task_types_tid)'." + if { $error_fail == 0 } { + if { [acc_fin::p_load_tid $constants_list $constants_required_list p3_larr $p1_arr(task_types_tid) "" $instance_id $user_id] } { + ns_log Notice "acc_fin::scenario_prettify.1460: scenario '$scenario_tid' p3_larr '[array get p3_larr]'" + + # validate decimal values before importing + set type_errors_count 0 + set type_errors_p 0 + set column_maybe_ck_list [list max_concurrent max_discount_pct max_reduction_pct max_run_time max_tasks_per_run max_overlap_pct time_dist_curve_tid cost_dist_curve_tid eco2_dist_curve_tid time_est_short time_est_median time_est_long cost_est_low cost_est_median cost_est_high eco2_est_low eco2_est_median eco2_est_high] + set column_ck_list [list ] + set titles_list [array names p3_larr] + # collect titles that are in p3_larr that should be checked + foreach col $column_maybe_ck_list { + if { [lsearch -exact $titles_list $col] > -1 } { + lappend column_ck_list $col + } + } + # check data for each column + foreach col $column_ck_list { + if { [string range $col end-3 end] eq "_tid" } { + set filtered_list [acc_fin::list_filter natnum $p3_larr($col) p3 $col] + } else { + set filtered_list [acc_fin::list_filter decimal $p3_larr($col) p3 $col] + } + if { $filtered_list ne $p3_larr($col) } { + set type_errors_p 1 + } + } + set index_eq "" + if { $p1_arr(index_equation) ne "" } { + # validate equation or set empty + # only allow + - / * $, logical comparisions > < == != and numbers. $number converts to one of the available row numbers that returns a number from in p4 + regsub -nocase -all -- {[^\$\/\+\-\*\(\)\.\<\>\=\!\ 0-9]+} $p1_arr(index_equation) "" index_eq + # add extra spaces to help expr avoid misinterpretations, but can't assume that for negative numbers vs. minus sign + regsub -nocase -all -- {([\/\+\*\(\)])} $index_eq " \1 " index_eq + # get rid of extra spaces + regsub -nocase -all -- {[ ]+} $index_eq " " index_eq + set vars_list [list ] + foreach {var0 var1 scratch} [acc_fin::pretti_equation_vars ] { + set var2 " $" + append var2 $var0 + set var3 " \[qaf_fp ${" + append var3 $var1 + append var3 "} \] " + regsub -nocase -all -- $var2 $index_eq $var3 index_eq + } + # unqoute the brackets + regsub -nocase -all -- {[\\]} $index_eq {} index_eq + + } + if { $type_errors_p } { + # undo data expansion + foreach title $titles_list { + set p3_larr($title) [list ] + } + } + } else { + set error_fail 1 + acc_fin::pretti_log_create $scenario_tid "p_load_tid" "operation" "#accounts-finance.error# 'type_table'; #accounts-finance.table_load_error# (ref1390)" $user_id $instance_id + } + } + } else { + acc_fin::pretti_log_create $scenario_tid "task_types_tid" "#accounts-finance.value#" "task_types_tid #accounts-finance.unknown_reference#" $user_id $instance_id + set error_fail 1 + } + } + # The multi-layered aspect of curve data storage needs a double-pointer to be efficient for projects with large memory footprints + # act_curve_arr($act) => curve_ref + # type_t_curve_arr($type) => curve_ref + # type_c_curve_arr($type) => curve_ref + # tid_curve_arr($tid) => curve_ref + # where curve_ref is index of curves_lol + # where curve_ref = 0 is default + # so, add a p2_larr(_cCurveRef) and p2_larr(_tCurveRef) column which references curves_lol + # similarly, add a p3_larr(_cCurveRef) and p3_larr(_tCurveRef) column + if { $error_fail == 0 } { + # # # import activity table p2 + ns_log Notice "acc_fin::scenario_prettify.1465: scenario '$scenario_tid' import activity table p2 (required)." + + + #### Use lsearch -glob or -regexp to screen alt columns and create list for custom summary feature. [a-z][0-9] + #### ..connected to cost_probability_point.. so columns represent curve IDs.. + #### Use [lsearch -regexp {[a-z][0-9]s} -all -inline $x_list] to screen alt time columns and create list for a scheduling feature. + #### also ta,twa,tna for time_actual, time_waypoint_actual time_node_actual etc. + # set defaults + set constants_list [acc_fin::pretti_columns_list p2] + foreach constant $constants_list { + set p2_larr($constant) [list ] + } + + if { $p1_arr(activity_table_tid) ne "" } { + set table_stats_list [qss_table_stats $p1_arr(activity_table_tid) $instance_id $user_id] + set trashed_p [lindex $table_stats_list 7] + # ns_log Notice "acc_fin::scenario_prettify.1443: llength table_stats_list [llength $table_stats_list] '$table_stats_list'" + if { [llength $table_stats_list] > 1 && !$trashed_p && $error_fail == 0 } { + # load activity table + set constants_required_list [acc_fin::pretti_columns_list p2 1] + ns_log Notice "acc_fin::scenario_prettify.1495: scenario '$scenario_tid' import activity_table_tid from '$p1_arr(activity_table_tid)'." + if { $error_fail == 0 } { + if { [acc_fin::p_load_tid $constants_list $constants_required_list p2_larr $p1_arr(activity_table_tid) p3_larr $instance_id $user_id] } { + #### aux_col_names_list is now complete. Set an error flag for each in aux_error_p_arr() + foreach nam $aux_col_names_list { + set aux_error_p_arr($nam) 0 + } + # filter user input + set p2_larr(activity_ref) [acc_fin::list_filter alphanum $p2_larr(activity_ref) "p2" "activity_ref"] + set p2_larr(dependent_tasks) [acc_fin::list_filter factorlist $p2_larr(dependent_tasks) "p2" "dependent_tasks"] + } else { + set error_fail 1 + acc_fin::pretti_log_create $scenario_tid "activity_table_tid" "#accounts-finance.value#" "#accounts-finance.error# 'activity_table' #accounts-finance.table_load_error# (ref1490)" $user_id $instance_id + } + } + } else { + acc_fin::pretti_log_create $scenario_tid "activity_table_tid" "#accounts-finance.value#" "activity_table_tid #accounts-finance.unknown_reference# #accounts-finance.reference_is_required# (ref1450)" $user_id $instance_id + set error_fail 1 + } + } else { + acc_fin::pretti_log_create $scenario_tid "activity_table_tid" "#accounts-finance.value#" "activity_table_tid #accounts-finance.unknown_reference# #accounts-finance.reference_is_required# (ref1453)" $user_id $instance_id + set error_fail 1 + } + } + # Substitute task_type data (p3_larr) into activity data (p2_larr) when p2_larr data is less detailed or missing. + # Curve data has already been substituted in p_load_tid + # Other substitutions when a p2_larr field is blank. + + if { $error_fail == 0 } { + # Effectively, p2 imports parts of p3 that are more detailed than p2, to build the final p2 activity table + # p3 includes default modifiers from p1 as well. + + set constants_woc_list [list name description max_concurrent max_discount_pct max_reduction_pct max_run_time max_tasks_per_run max_overlap_pct ] + # _woc_ = without curve data (or columns) + # Removed dependent_tasks from task_type substitution, + # because dependent_tasks creates a level of complexity significant enough to be avoided + # through program set-up at this time. + set p3_type_list $p3_larr(type) + set p2_task_type_list $p2_larr(aid_type) + ## activities_list list of activities to process + set activities_list $p2_larr(activity_ref) + ns_log Notice "acc_fin::scenario_prettify.1500: scenario '$scenario_tid' activities_list '${activities_list}'" + foreach constant $constants_woc_list { + if { [llength $p2_larr(aid_type) ] > 0 && [llength $p3_larr($constant)] > 0 } { + set i 0 + set p2_col_list $p2_larr($constant) + set p2_col_list_len [llength $p2_larr($constant) ] + foreach act $activities_list { + set p2_value [lindex $p2_col_list $i] + if { $p2_value eq "" } { + # if p2 value is blank, try to get value from p3 table + set ii [lsearch -exact $p3_type_list [lindex $p2_task_type_list $i]] + if { $ii > -1 && $i < $p2_col_list_len } { + set p2_col_list [lreplace $p2_col_list $i $i [lindex $p3_larr($constant) $ii] ] + } else { + # warn that value is blank in p2 and p3 tables? No. + # Just "name" or "description" so no need to warn.. + } + } + incr i + } + set p2_larr($constant) $p2_col_list + } + } + + # # # Confirm that dependent activities exist as activities. + ns_log Notice "acc_fin::scenario_prettify.1527: scenario '$scenario_tid' Confirm p2 dependents exist as activities, expand dependents with coefficients." + } + + + if { $error_fail == 0 } { + # Expand p2_larr to include dependent activities with coefficients. + # by appending new definitions of tasks that don't yet have defined coefficients. + + + ns_log Notice "acc_fin::scenario_prettify.1529: scenario '$scenario_tid' activities_list '${activities_list}'" + ns_log Notice "acc_fin::scenario_prettify.1531: scenario '$scenario_tid' p2_larr(dependent_tasks) '$p2_larr(dependent_tasks)'" + set row_nbr 0 + foreach dependencies_list $p2_larr(dependent_tasks) { + ns_log Notice "acc_fin::scenario_prettify.1533: scenario '$scenario_tid' dependencies_list '${dependencies_list}'" + set base_activity [lindex $activities_list $row_nbr] + foreach activity $dependencies_list { + ns_log Notice "acc_fin::scenario_prettify.1535: scenario '$scenario_tid' activity '${activity}'" + if { $activity eq $base_activity } { + # activity is dependent on itself. Throw an error. + set error_fail 1 + acc_fin::pretti_log_create $scenario_tid $activity "#accounts-finance.value#" "Activity '${activity}'; #accounts-finance.dependent_circular_reference. (ref2188)" $user_id $instance_id + } + if { [lsearch -exact $activities_list $activity] == -1 } { + # A dependent activity doesn't exist.. + ns_log Notice "acc_fin::scenario_prettify.1619: scenario '$scenario_tid' activity '$activity' doesn't exist on direct search." + set term "" + set coefficient "" + # Is $activity an existing activity, but referenced with a coeffient? + set scratch "" + + if { [regexp -- {^([0-9]+)[\*]([^\*]+)} $activity scratch coefficient term] } { + ns_log Notice "acc_fin::scenario_prettify.1624: scenario '$scenario_tid' activity '$activity' is part coefficient '$coefficient' and part term '$term'" + # If $term is a defined activity, get index + set term_idx [lsearch -exact $activities_list $term] + if { $term_idx > -1 } { + # Requirements met: There is a coefficient and an existing activity. + ns_log Notice "acc_fin::scenario_prettify.1632: scenario '$scenario_tid' term '$term' exists as an activity, so creating new activity with coefficient '${activity}'." + # Generate a new activity with coeffient for this run. + set larr_len [expr { [llength $activities_list] - 2 } ] + foreach constant $constants_list { + ns_log Notice "acc_fin::scenario_prettify.1639: scenario '$scenario_tid' larr_len $larr_len term_idx $term_idx constant $constant" + if { [llength $p2_larr($constant) ] > $larr_len } { + lappend p2_larr($constant) [lindex $p2_larr($constant) $term_idx] + } + + } + lappend p2_larr(_coef) $coefficient + lappend activities_list $activity + set use_t_run_p 0 + set t_constrained_by_time_p 0 + # create new tCurves and cCurves and references to them. + set tcurvenum [lindex $p2_larr(_tCurveRef) $term_idx] + + + if { $tcurvenum ne "" && $error_time == 0 } { + + set max_overlap_pct_idx [lsearch -exact $constants_list "max_overlap_pct"] + set max_overlap_pct $p1_arr(max_overlap_pct) + if { $max_overlap_pct_idx > -1 && [llength $p2_larr(max_overlap_pct)] > 0 } { + set test [lindex $p2_larr(max_overlap_pct) $term_idx] + if { $test ne "" } { + set max_overlap_pct $test + } + } + + set max_concurrent_idx [lsearch -exact $constants_list "max_concurrent"] + set max_concurrent $p1_arr(max_concurrent) + if { $max_concurrent_idx > -1 && [llength $p2_larr(max_concurrent)] > 0 } { + set test [lindex $p2_larr(max_concurrent) $term_idx] + if { $test ne "" } { + set max_concurrent $test + } + } + + set max_run_time_idx [lsearch -exact $constants_list "max_run_time"] + set max_run_time $p1_arr(max_run_time) + if { $max_run_time_idx > -1 && [llength $p2_larr(max_run_time)] > 0 } { + set test [lindex $p2_larr(max_run_time) $term_idx] + if { $test ne "" } { + set max_run_time $test + } + } + + set max_tasks_per_run_idx [lsearch -exact $constants_list "max_tasks_per_run"] + set max_tasks_per_run $p1_arr(max_tasks_per_run) + if { $max_tasks_per_run_idx > -1 && [llength $p2_larr(max_tasks_per_run)] > 0 } { + set test [lindex $p2_larr(max_tasks_per_run) $term_idx] + if { $test ne "" } { + set max_tasks_per_run $test + } + } + + + set curve_lol [acc_fin::pretti_curve_time_multiply "" $tcurvenum $coefficient $scenario_id $user_id $instance_id ] + + # These are run time constraints for multiples of an activity, passed back from acc_fin::pretti_curve_time_multiply + set act_maxtpr_arr(${activity}) $max_tasks_per_run + set act_maxrt_arr(${activity}) $max_run_time + set act_maxol_arr(${activity}) $max_overlap_pct + set act_maxcc_arr(${activity}) $max_concurrent + + # save new curve + + set tcurvenum [acc_fin::larr_set time_clarr $curve_lol] + # save new reference + lappend p2_larr(_tCurveRef) $tcurvenum + set act_tcref($activity) [lindex $p2_larr(_tCurveRef) $i] + + lappend p2_larr(_tDcSource) 7 + ns_log Notice "acc_fin::scenario_prettify.1674: scenario '$scenario_tid' new t curve: time_clarr($tcurvenum) '$curve_lol'" + } else { + lappend p2_larr(_tCurveRef) "" + lappend p2_larr(_tDcSource) "" + set act_tcref($activity) "" + ns_log Warning "acc_fin::scenario_prettify.1676: scenario '$scenario_tid' NO tcurvenum for '$curve_lol'" + } + + # cost + set ccurvenum [lindex $p2_larr(_cCurveRef) $term_idx] + if { [lindex $p2_larr(_cCurveRef) $term_idx] ne "" && $error_cost == 0 } { + + set curve_lol [acc_fin::pretti_curve_cost_multiply "" $ccurvenum $coefficient $scenario_id $user_id $instance_id ] + set act_maxcd_arr(${activity}) $max_discount_pct + + # save new curve + set ccurvenum [acc_fin::larr_set cost_clarr $curve_lol] + # save new reference + lappend p2_larr(_cCurveRef) $ccurvenum + set act_ccref($activity) [lindex $p2_larr(_cCurveRef) $i] + lappend p2_larr(_cDcSource) 7 + ns_log Notice "acc_fin::scenario_prettify.1694: scenario '$scenario_tid' new c curve: cost_clarr($ccurvenum) '$curve_lol'" + } else { + lappend p2_larr(_cCurveRef) "" + lappend p2_larr(_cDcSource) "" + set act_ccref($activity) "" + } + + # eco2 + set ecurvenum [lindex $p2_larr(_eCurveRef) $term_idx] + if { [lindex $p2_larr(_eCurveRef) $term_idx] ne "" && $error_eco2 == 0 } { + + set curve_lol [acc_fin::pretti_curve_eco2_multiply "" $ecurvenum $coefficient $scenario_id $user_id $instance_id ] + set act_maxer_arr(${activity}) $max_reduction_pct + + # save new curve + set ecurvenum [acc_fin::larr_set eco2_clarr $curve_lol] + # save new reference + lappend p2_larr(_eCurveRef) $ecurvenum + set act_ecref($activity) [lindex $p2_larr(_eCurveRef) $i] + lappend p2_larr(_eDcSource) 7 + ns_log Notice "acc_fin::scenario_prettify.1694: scenario '$scenario_tid' new c curve: eco2_clarr($ecurvenum) '$curve_lol'" + } else { + lappend p2_larr(_eCurveRef) "" + lappend p2_larr(_eDcSource) "" + set act_ecref($activity) "" + } + + # time cost eco2 + ns_log Notice "acc_fin::scenario_prettify.1700: scenario '$scenario_tid' term '$term' tcurvenum '$tcurvenum' ccurvenum '$ccurvenum' ecurvenum '$ecurvenum'" + } else { + # No activity defined for this factor (term with coefficient), flag an error --missing dependency. + lappend compute_message_list "Dependency '${term}' is undefined, referenced in: '${activity}'." + acc_fin::pretti_log_create $scenario_tid "${term}" "#accounts-finance.value#" "#accounts-finance.dependent# '${term}'; #accounts-finance.activity# '${activity}'; #accounts-finance.unknown_reference# (ref1576)" $user_id $instance_id + set error_fail 1 + } + } else { + # No activity defined for this factor (term with coefficient), flag an error --missing dependency. + lappend compute_message_list "Dependency '${activity}' is an undefined activity." + acc_fin::pretti_log_create $scenario_tid "${activity}" "#accounts-finance.value#" "#accounts-finanace.dependent# #accounts-finance.activity# '${activity}'; #accounts-finance.unknown_reference# (ref1582)" $user_id $instance_id + set error_fail 1 + } + } + # else, an activity for the dependency exists. Do nothing. + } + incr row_nbr + } + } + + if { $error_fail == 0 } { + # # # Multiple probability_points allowed + set t_point_list [split $p1_arr(time_probability_point)] + if { $p1_arr(cost_probability_point) ne "" } { + set c_point_list [split $p1_arr(cost_probability_point)] + set c_point_blank_p 0 + ns_log Notice "acc_fin::scenario_prettify.1733: scenario '$scenario_tid' prepare p1 time '${t_point_list}' and cost '${c_point_list}' probability_point loops." + } else { + set c_point_blank_p 1 + } + if { $p1_arr(eco2_probability_point) ne "" } { + set e_point_list [split $p1_arr(eco2_probability_point)] + set e_point_blank_p 0 + ns_log Notice "acc_fin::scenario_prettify.1743: scenario '$scenario_tid' prepare p1 time '${t_point_list}' and eco2 '${e_point_list}' probability_point loops." + } else { + set e_point_blank_p 1 + } + + ns_log Notice "acc_fin::scenario_prettify.1750: scenario '$scenario_tid' prepare p1 time '${t_point_list}' c_point_blank_p ${c_point_blank_p} e_point_blank_p ${e_point_blank_p}." + + + # Be sure any new values are nullified between each loop + set setup_end [clock seconds] + set time_start [clock seconds] + foreach t_point $t_point_list { + + # Calculate base durations for time_probability_point. These work for activities and task types. + array unset t_est_arr + if { $p1_arr(pert_omp) eq "strict" && $t_point == .5 } { + # use PERT expected value (O + 4M + P )/6/ + foreach tCurve [array names time_clarr] { + set o [qaf_y_of_x_dist_curve 0. $time_clarr($tCurve) ] + set m [qaf_y_of_x_dist_curve .5 $time_clarr($tCurve) ] + set p [qaf_y_of_x_dist_curve 1. $time_clarr($tCurve) ] + set t_est_arr($tCurve) [expr { ( $o + 4. * $m + $p ) / 6. } ] + ns_log Notice "acc_fin::scenario_prettify.1754: scenario '$scenario_tid' tCurve '$tCurve' t_est_arr($tCurve) '$t_est_arr($tCurve)' ." + } + } else { + foreach tCurve [array names time_clarr] { + set t_est_arr($tCurve) [qaf_y_of_x_dist_curve $t_point $time_clarr($tCurve) ] + ns_log Notice "acc_fin::scenario_prettify.1756: scenario '$scenario_tid' tCurve '$tCurve' t_est_arr($tCurve) '$t_est_arr($tCurve)' ." + } + } + if { $c_point_blank_p } { + # if cost_probability_point is blank, loop 1:1 using time_probability_point values + set c_point_list [list $t_point] + } + foreach c_point $c_point_list { + # Calculate base costs for cost_probability_point. These work for activities and task types. + array unset c_est_arr + foreach cCurve [array names cost_clarr] { + set c_est_arr($cCurve) [qaf_y_of_x_dist_curve $c_point $cost_clarr($cCurve) ] + } + + if { $e_point_blank_p } { + # if eco2_probability_point is blank, loop 1:1 using time_probability_point values if not error_time + if { !$error_time } { + set e_point_list [list $t_point] + } else { + # use cost_probability_point values + set e_point_list [list $c_point] + } + } + foreach e_point $e_point_list { + # Calculate base eco2s for eco2_probability_point. These work for activities and task types. + array unset e_est_arr + foreach eCurve [array names eco2_clarr] { + set e_est_arr($eCurve) [qaf_y_of_x_dist_curve $e_point $eco2_clarr($eCurve) ] + } + + # Create activity time, cost, and eco2 estimate arrays for repeated use in main loop + # These arrays vary in values by t_point c_point e_point + set i 0 + array unset act_time_expected_arr + array unset act_cost_expected_arr + array unset act_eco2_expected_arr + array unset cw_arr + array unset ew_arr + array unset depnc_eq_arr + + foreach act $activities_list { + # first paths are single activities, so following line of code doesn't seem significant. + # It's just here so that internal representation is consistent. + set act_list [list $act] + # use this loop to intialize empty array: + set path_idxs_in_act_larr($act) [list ] + + # the first paths are single activities, subsequently time expected and duration are same values + set tref [lindex $p2_larr(_tCurveRef) $i] + if { $tref ne "" } { + set time_expected $t_est_arr($tref) + ## act_time_expected_arr(act) is the time expected to complete an activity + set act_time_expected_arr($act) $time_expected + ## tn_arr(act) is the time expected to complete an activity and its dependents + set tn_arr($act) $time_expected + } else { + ns_log Warning "acc_fin::scenario_prettify.1763: scenario '$scenario_tid' act '$act' tref '${tref}' p2_larr(_tCurveRef) '$p2_larr(_tCurveRef)'" + acc_fin::pretti_log_create $scenario_tid "${act}" "#accounts-finance.value#" "#accounts-finance.activity# '${act}'; #accounts-finance.duration# #accounts-finance.unknown_reference# (ref1763)" $user_id $instance_id + set error_time 1 + } + + # the first paths are single activities, subsequently cost expected and path segment costs are same values + set cref [lindex $p2_larr(_cCurveRef) $i] + if { $cref ne "" } { + set cost_expected $c_est_arr($cref) + ## act_cost_expected_arr(act) is the cost expected to complete an activity + set act_cost_expected_arr($act) $cost_expected + ## cn_arr(act) is the cost expected to complete an activity and its dependents + set cn_arr($act) $cost_expected + } else { + ns_log Warning "acc_fin::scenario_prettify.1773: scenario '$scenario_tid' act '$act' cref '${cref}' p2_larr(_cCurveRef) '$p2_larr(_cCurveRef)'" + acc_fin::pretti_log_create $scenario_tid "${act}" "#accounts-finance.value#" "#accounts-finance.activity# '${act}'; #accounts-finance.cost# #accounts-finance.unknown_reference# (ref1773)" $user_id $instance_id + set error_cost 1 + } + + # the first paths are single activities, subsequently eco2 expected and path segment eco2s are same values + set eref [lindex $p2_larr(_eCurveRef) $i] + if { $cref ne "" } { + set eco2_expected $e_est_arr($eref) + ## act_eco2_expected_arr(act) is the eco2 expected to complete an activity + set act_eco2_expected_arr($act) $eco2_expected + ## en_arr(act) is the eco2 expected to complete an activity and its dependents + set en_arr($act) $eco2_expected + } else { + ns_log Warning "acc_fin::scenario_prettify.1776: scenario '$scenario_tid' act '$act' eref '${eref}' p2_larr(_eCurveRef) '$p2_larr(_eCurveRef)'" + acc_fin::pretti_log_create $scenario_tid "${act}" "#accounts-finance.value#" "#accounts-finance.activity# '${act}'; #accounts-finance.eco2# #accounts-finance.unknown_reference# (ref1776)" $user_id $instance_id + set error_eco2 1 + } + + ##### add aux_col_name calcs here that reflect cost ones. + ## ref i , create aux_act_cost_expected_arr(act), aux_cn_arr(act) from lindex p2_larr(aux_col) i + + incr i + } + } + + # handy api ref + # util_commify_number + # format "% 8.2f" $num + + # PERTTI calculations + + # Build activity dependent map + ns_log Notice "acc_fin::scenario_prettify.1783: scenario '$scenario_tid' build activity dependents map and sequences for t_point '${t_point}' c_point '${c_point}' e_point '${e_point}'" + # activity map table: depnc_larr($activity_ref) dependent_tasks_list + # array of activity_ref sequence_num: act_seq_num_arr($activity_ref) sequence_number + + # An activity_ref's sequence is one more than the max sequence_num of its dependencies + set i 0 + set sequence_1 0 + array unset act_seq_num_arr + array unset dependencies_larr + array unset act_calculated_p_larr + + if { $error_fail == 0 } { + foreach act $activities_list { + # depnc: comma list of activity's dependencies + set depnc [lindex $p2_larr(dependent_tasks) $i] + ## t_dc_source_arr(act) answers Q: what is source of time distribution curve? + set t_dc_source_arr($act) [lindex $p2_larr(_tDcSource) $i ] + ## c_dc_source_arr(act) answers Q: what is source of cost distribution curve? + set c_dc_source_arr($act) [lindex $p2_larr(_cDcSource) $i ] + ## e_dc_source_arr(act) answers Q: what is source of eco2 distribution curve? + set e_dc_source_arr($act) [lindex $p2_larr(_eDcSource) $i ] + + # Filter out any blanks + set scratch_list [split $depnc ";, "] + set scratch2_list [list ] + foreach dep $scratch_list { + if { $dep ne "" } { + lappend scratch2_list $dep + } + } + ## dependencies_larr() is a list of direct dependencies for each activity + set dependencies_larr($act) $scratch2_list + set act_calculated_p_larr($act) 0 + ns_log Notice "acc_fin::scenario_prettify.1793: scenario '$scenario_tid' set act_calculated_p_larr($act) 0 len \$act [string length $act]" + + ## act_seq_num_arr is relative sequence number of an activity in it's path. + set act_seq_num_arr($act) $sequence_1 + ## act_coef(act) is the coefficient of an activity. If activity is defined as a multiple of another activity, it is an integer greater than 1 otherwise 1. + set act_coef($act) [lindex $p2_larr(_coef) $i] + set act_tcref($act) [lindex $p2_larr(_tCurveRef) $i] + set act_ccref($act) [lindex $p2_larr(_cCurveRef) $i] + set act_ecref($act) [lindex $p2_larr(_eCurveRef) $i] + incr i + } + } + + + # Calculate paths in the main loop to save resources. + # Each path is a list of numbers referenced by array, where + # array indexes last path activity (of a dependency track). + # set path_segment_ends_in_lists($act) + # so future segments can quickly reference it to build theirs. + + # a ptrack (partial track) is an incomplete path + + # This keeps path making nearly linear. There are up to as many path tree references as there are activities.. + + # Since some activities depend on others, some of the references are ptracks. + + # All paths must be assessed in order to handle all possibilities + # Paths are used to determine critical path and fast crawl a single path. + + # An activity cannot start until the longest dependent segment (branch) has completed. + + # For strict critical path, create a list of lists, where + # each list is a list of activity and dependencies from start to finish (aka path). + # The longest duration path is the strict defintion of critical path. + + # create dependency check equations + ns_log Notice "acc_fin::scenario_prettify.1797: scenario '$scenario_tid' create equations for checking if dependencies are met." + + # # # main process looping + ns_log Notice "acc_fin::scenario_prettify.2284: scenario '$scenario_tid' begin main process" + + array unset act_seq_list_arr + array unset act_count_of_seq_arr + #array unset tn_arr + #array unset cn_arr + array unset subtrees_larr + array unset path_tree_p_arr + set all_paths_calculated_p 0 + ## activity_count is length activities_list + set activity_count [llength $activities_list] + set i 0 + set act_seq_list_arr(${sequence_1}) [list ] + ## act_count_of_seq_arr( sequence_number) is the count of activities at this sequence number across all paths, 0 is first sequence number + set act_count_of_seq_arr(${sequence_1}) 0 + set tree_seg_dur_lists [list ] + if { $error_fail == 0 } { + while { $all_paths_calculated_p == 0 && $i < $activity_count } { + ns_log Notice "acc_fin::scenario_prettify.2300: scenario '$scenario_tid' new calc loop" + set all_paths_calculated_p 1 + foreach act $activities_list { + ## act_seq_max is the maximum path length in context of sequence_number + set act_seq_max $sequence_1 + ns_log Notice "acc_fin::scenario_prettify.2304: scenario '$scenario_tid' act $act act_seq_max ${act_seq_max}" + + # Are dependencies met for this activity? + set dependencies_met_p 1 + foreach dep $dependencies_larr($act) { + ns_log Notice "acc_fin::scenario_prettify.2308: scenario '$scenario_tid' act $act dep $dep act_calculated_p_larr($dep) '$act_calculated_p_larr($dep)' len \$dep [string length $dep]" + if { $act_calculated_p_larr($dep) == 0 } { + set dependencies_met_p 0 + } + } + + if { $dependencies_met_p && $act_calculated_p_larr($act) == 0 } { + # Calc max_num: maximum relative sequence number for activity dependencies + set max_num 0 + foreach test_act $dependencies_larr($act) { + set test $act_seq_num_arr(${test_act}) + if { $max_num < $test } { + set max_num $test + } + } + + # Add activity's relative sequence number: act_seq_num_arr + set act_seq_nbr [expr { $max_num + 1 } ] + set act_seq_num_arr($act) $act_seq_nbr + + # increment act_seq_max and set defaults for a new max seq number? + if { $act_seq_nbr > $act_seq_max } { + set act_seq_max $act_seq_nbr + set act_seq_list_arr(${act_seq_max}) [list ] + set act_count_of_seq_arr(${act_seq_max}) 0 + } + # add activity to the network for this sequence number + lappend act_seq_list_arr(${act_seq_nbr}) $act + incr act_count_of_seq_arr(${act_seq_nbr}) + + # Calculations including dependents + if { !$error_time } { + # branches_duration_max is the min. path duration to complete dependent paths + # set branches_duration_max to the longest duration of dependent segments. + set branches_duration_max 0. + foreach dep_act $dependencies_larr($act) { + if { $tn_arr(${dep_act}) > $branches_duration_max } { + set branches_duration_max $tn_arr(${dep_act}) + } + } + ## tn_arr(act) is duration of ptrack up to (and including) activity. + set tn_arr($act) [expr { $branches_duration_max + $act_time_expected_arr($act) } ] + ns_log Notice "acc_fin::scenario_prettify.2384: scenario '$scenario_tid' act $act tn_arr($act) $tn_arr($act)" + } + if { !$error_cost } { + set paths_cost_sum 0. + foreach dep_act $dependencies_larr($act) { + # paths_cost_sum is sum of costs for each dependent ptrack + #was set paths_cost_sum [expr { $paths_cost_sum + $act_cost_expected_arr(${dep_act}) } ] + ns_log Notice "acc_fin::scenario_prettify.2392: scenario '$scenario_tid' act $act cn_arr($act) $cn_arr($act) paths_cost_sum $paths_cost_sum + cn_arr({$dep_act}) $cn_arr(${dep_act})" + set paths_cost_sum [expr { $paths_cost_sum + $cn_arr(${dep_act}) } ] + } + ## cn_arr is cost of all dependent ptrack plus cost of activity + set cn_arr($act) [expr { $paths_cost_sum + $act_cost_expected_arr($act) } ] + ns_log Notice "acc_fin::scenario_prettify.2394: scenario '$scenario_tid' act $act cn_arr($act) $cn_arr($act)" + } + if { !$error_eco2 } { + set paths_eco2_sum 0. + foreach dep_act $dependencies_larr($act) { + # paths_eco2_sum is sum of eco2s for each dependent ptrack + #was set paths_eco2_sum [expr { $paths_eco2_sum + $act_eco2_expected_arr(${dep_act}) } ] + ns_log Notice "acc_fin::scenario_prettify.2396: scenario '$scenario_tid' act $act en_arr($act) $en_arr($act) paths_eco2_sum $paths_eco2_sum + en_arr({$dep_act}) $en_arr(${dep_act})" + set paths_eco2_sum [expr { $paths_eco2_sum + $en_arr(${dep_act}) } ] + } + ## en_arr is eco2 of all dependent ptrack plus eco2 of activity + set en_arr($act) [expr { $paths_eco2_sum + $act_eco2_expected_arr($act) } ] + ns_log Notice "acc_fin::scenario_prettify.2398: scenario '$scenario_tid' act $act en_arr($act) $en_arr($act)" + } + + # subtrees_larr(activity) is an array of list of ptracks ending with trunk activity + # paths (or ptracks) represented as a list of activity lists in chronological order (last acitivty last). + # For example, if A depends on B and C, and C depends on D, and A depends on F then: + # subtrees_larr(A) == (list (list B A) (list D C A ) (list F A) ) + set subtrees_larr($act) [list ] + set dependents_count_arr($act) 0 + foreach dep_act $dependencies_larr($act) { + foreach path_list $subtrees_larr(${dep_act}) { + # Mark which tracks are complete (not partial track segments), + # so that total program cost calculations don't include duplicate, incomplete ptracks + ## path_tree_p_arr answers question: is this tree of ptracks complete (ie not a subset of another track or tree)? + set path_tree_p_arr($dep_act) 0 + set path_tree_p_arr($act) 1 + set path_new_list $path_list + lappend path_new_list $act + lappend subtrees_larr($act) $path_new_list + } + ## dependents_count_arr(act) is count number of activities in each subtree, not including the activity itself. + set dependents_count_arr($act) [expr { $dependents_count_arr($act) + $dependents_count_arr($dep_act) + 1 } ] + } + if { [llength $subtrees_larr($act)] eq 0 } { + lappend subtrees_larr($act) $act + set path_tree_p_arr($act) 1 + } + + # activity calculated + set act_calculated_p_larr($act) 1 + } + + if { $dependencies_met_p == 0 } { + set all_paths_calculated_p 0 + } + } + incr i + } + # end while all_paths_calculated_p == 0 + + # # # Curve calculations complete for t_point c_point e_point. + ns_log Notice "acc_fin::scenario_prettify.2402: scenario '$scenario_tid' Curve calculations completed for t_point c_point e_point. " + + + set all_deps_met_p 1 + foreach act $activities_list { + set dependencies_met_p 1 + foreach dep $dependencies_larr($act) { + ns_log Notice "acc_fin::scenario_prettify.2409: scenario '$scenario_tid' dep $dep act_calculated_p_larr($dep) '$act_calculated_p_larr($dep)' len \$dep [string length $dep]" + if { $act_calculated_p_larr($dep) == 0 } { + set dependencies_met_p 0 + } + } + if { $dependencies_met_p == 0 } { + set all_deps_met_p 0 + } + # ns_log Notice "acc_fin::scenario_prettify: act $act act_seq_num_arr '$act_seq_num_arr($act)'" + # ns_log Notice "acc_fin::scenario_prettify: act_seq_list_arr '$act_seq_list_arr($act_seq_num_arr($act))' $act_count_of_seq_arr($act_seq_num_arr($act))" + } + ns_log Notice "acc_fin::scenario_prettify.2416: scenario '$scenario_tid' All dependencies met? 1 = yes. all_deps_met_p $all_deps_met_p" + if { $all_deps_met_p == 0 } { + set hint "Hint: activities " + set separator "" + foreach act $activities_list { + # act_seq_num_arr in next check may be redundant. + if { $act_calculated_p_larr($act) == 0 && $act_seq_num_arr($act) == 0 } { + append hint $separator $act + set separator ", " + } + } + append hint "." + set error_fail 1 + acc_fin::pretti_log_create $scenario_tid "all_deps_met_p" "#accounts-finance.value#" "#accounts-finance.dependencies_not_met_error# (ref2609) #accounts-finance.hint# $hint" $user_id $instance_id + + } + + } + # # # compile results for report + ns_log Notice "acc_fin::scenario_prettify.2431: scenario '$scenario_tid' compile results for report." + if { $error_fail == 0 } { + + # paths_lists is a list of (full paths, subtotal duration, subtotal cost) + set paths_lists [list ] + set path_idx 0 + set act_count_max 0 + foreach act $activities_list { + # Remove partial tracks from subtrees by placing only paths in paths_lists + ns_log Notice "acc_fin::scenario_prettify.2485: scenario '$scenario_tid' path_tree_p_arr($act) '$path_tree_p_arr($act)' " + + if { $path_tree_p_arr($act) } { + # subtrees_larr($act) is a tree of full paths here. + # Expand path trees to a list of paths + foreach path_list $subtrees_larr($act) { + # build a sortable list + set row_list [list ] + + # paths_lists 0 + lappend row_list $path_idx + + set paths_arr(${path_idx}) $path_list + + # create a reverse lookup array for every activity so that path properties can be referenced from an activity: + foreach acty $path_list { + lappend path_idxs_in_act_larr(${acty}) $path_idx + } + + if { !$error_time } { + # calculate no-float, no-lag duration for each path + set path_duration 0. + set ptrack_list [list ] + foreach pa $path_list { + lappend ptrack_list $pa + # subtotal + set path_duration [expr { $path_duration + $act_time_expected_arr($pa) } ] + set ptrack_dur_arr($ptrack_list) $path_duration + set tw_arr(${path_idx},$pa) $path_duration + } + # save this for later reporting + # set path_dur_arr($path_list) $path_duration + # duplicative. ptrack_dur_arr($ptrack_list) = path_dur_arr($path_list) here + } else { + set path_duration "" + } + # paths_lists 1 + set path_duration_arr(${path_idx}) $path_duration + lappend row_list $path_duration + + if { !$error_cost } { + # calculate cost for each path. + set path_cost 0. + set ptrack_list [list ] + # Since paths share activities, some costs are duplicative and so do not total these between paths + foreach pa $path_list { + lappend ptrack_list $pa + # subtotal + set path_cost [expr { $path_cost + $act_cost_expected_arr($pa) } ] + set cw_arr(${path_idx},$pa) $path_cost + } + # save this for later reporting + ###set cn_arr($path_list) $path_cost + #### duplicative. see above. + } else { + set path_cost "" + } + # paths_lists 2 + set cw_arr(${path_idx}) $path_cost + lappend row_list $path_cost + + # if duration and cost are unavailable, list will be sorted by longest path.. + # paths_lists 3 + set path_len [llength $path_list ] + ## path_len_arr(path_idx) is length of path list + set path_len_arr(${path_idx}) $path_len + lappend row_list $path_len + + # max of path_len is same as act_count_max + if { $path_len > $act_count_max } { + set act_count_max $path_len + } + + set path_len_w_coef 0 + foreach pa $path_list { + incr path_len_w_coef $act_coef($pa) + } + # paths_lists 4 + ## path_len_w_coef_arr is total number of activities in a path (with coefficients) + set path_len_w_coef_arr(${path_idx}) $path_len_w_coef + lappend row_list $path_len_w_coef + + + # adding empty list incase of index_custom later + # paths_lists 5 + lappend row_list "" + + if { !$error_eco2 } { + # calculate eco2 for each path. + set path_eco2 0. + set ptrack_list [list ] + # Since paths share activities, some eco2s are duplicative and so do not total these between paths + foreach pa $path_list { + lappend ptrack_list $pa + # subtotal + set path_eco2 [expr { $path_eco2 + $act_eco2_expected_arr($pa) } ] + set ew_arr(${path_idx},$pa) $path_eco2 + } + # save this for later reporting + ###set en_arr($path_list) $path_eco2 + #### duplicative. see above. + } else { + set path_eco2 "" + } + # paths_lists 6 + set ew_arr(${path_idx}) $path_eco2 + lappend row_list $path_eco2 + + lappend paths_lists $row_list + incr path_idx + } + } + } + ## paths_count is the number of paths ie length of paths_list + set paths_count [expr { $path_idx - 1 } ] + ## paths_list: (list path_arr_idx duration cost length length_w_coefs ) + + if { !$error_time } { + # sort by path duration + # critical path is the longest path. Float is the difference between CP and next longest CP. + # create an array of paths from longest to shortest duration to help build base table + set paths_sort1_lists [lsort -decreasing -real -index 1 $paths_lists] + + + } elseif { !$error_cost } { + + # make something useful for cost biased table, critical_path is most costly.. etc. + # sort by path cost + # critical path is the longest path. Float is the difference between CP and next longest CP. + # create an array of paths from longest to shortest duration to help build base table + set paths_sort1_lists [lsort -decreasing -real -index 2 $paths_lists] + + } elseif { !$error_eco2 } { + + # make something useful for eco2 biased table, critical_path is most eco2 related.. etc. + # sort by path eco2 + # critical path is the longest path. Float is the difference between CP and next longest CP. + # create an array of paths from longest to shortest duration to help build base table + set paths_sort1_lists [lsort -decreasing -real -index 6 $paths_lists] + + } else { + + # make something that doesn't break the final table build. critical_path is largest count of activities.. + # sort by number of activities per path + # critical path is the longest path. + # create an array of paths from longest to shortest number of activities + set paths_sort1_lists [lsort -decreasing -integer -index 4 $paths_lists] + + } + ns_log Notice "acc_fin::scenario_prettify.2588: scenario '$scenario_tid' paths_lists '${paths_lists}' paths_sort1_lists '${paths_sort1_lists}' " + ## paths_sort1_lists is paths_list sorted by index used to calc CP + + # Extract most significant CP alternates for a focused table + # by counting the number of times an act is used in the largest proportion (first half) of paths in path_set_dur_sort1_list + + ## act_freq_in_load_cp_alts_arr(act) counts number of times an activity appears in all paths combined (including coefficients) + # determine act_freq_in_load_cp_alts_arr(activity) + foreach act $activities_list { + set act_freq_in_load_cp_alts_arr($act) 0 + } + foreach path_list $paths_lists { + set path_idx [lindex $path_list 0] + foreach act $paths_arr($path_idx) { + incr act_freq_in_load_cp_alts_arr($act) $act_coef($act) + } + } + # Still need to include activity with coefficients into ones without coefficients. + # For example, 8*a in a. If a were 5 and 8*a were 16 (2 times 8), a should be 16 + 5 = 21 + set coefs_list [lsearch -regex -all -inline $activities_list {[^\*]+[\*][^\*]+} ] + foreach coef $coefs_list { + set act_idx [string first "*" $coef] + incr act_idx + set act [string range $coef $act_idx end] + incr act_freq_in_load_cp_alts_arr($act) $act_coef($coef) + } + + # Make a list of activities sorted by popularity (appearing in the most paths) + set act_count_list [list ] + foreach act $activities_list { + lappend act_count_list [list $act $act_freq_in_load_cp_alts_arr($act)] + # initialize this variable where values defined in the next loop using activities_list + set count_on_cp_p_arr($act) 0 + } + set activities_popular_sort_list [lsort -decreasing -integer -index 1 $act_count_list] + set act_count_median_pos [expr { int( $paths_count / 2. } + 1. ) ] + ## path_sig_list is a list of activities that are above the median count + set path_sig_list [list ] + for {set i 0} {$i < $act_count_median_pos} {incr i} { + lappend path_sig_list [lindex [lindex $activities_popular_sort_list $i] 0] + } + + ## act_count_max is max count of unique activities on a path + # This doesn't work for all cases: set act_count_max [lindex [lindex $activities_popular_sort_list 0] 1] + + ## act_count_median is median count of unique activities on a path + set act_count_median [lindex [lindex $activities_popular_sort_list $act_count_median_pos] 1] + + # Critical Path (CP) is: + set cp_row_list [lindex $paths_sort1_lists 0] + + set cp_path_idx [lindex $cp_row_list 0] + ns_log Notice "acc_fin::scenario_prettify.2636: scenario '$scenario_tid' cp_path_idx '$cp_path_idx' cp_row_list '$cp_row_list' " + set cp_list $paths_arr(${cp_path_idx}) + set cp_duration [lindex $cp_row_list 1] + set cp_cost [lindex $cp_row_list 2] + set cp_eco2 [lindex $cp_row_list 6] + set cp_len [lindex $cp_row_list 3] + + foreach act $activities_list { + set on_critical_path_p_arr($act) [expr { [lsearch -exact $cp_list $act] > -1 } ] + set count_on_cp_arr($act) [llength [lsearch -exact -all $cp_list $act]] + # adjustment required for count_on_cp_p_arr, if this activity has a coefficient + set ac_idx [string first "*" $act] + ns_log Notice "acc_fin::scenario_prettify.3118: scenario '$scenario_tid' ac_idx '${ac_idx}'" + if { $ac_idx > 0 } { + incr ac_idx 1 + set ac [string range $act $ac_idx end] + ns_log Notice "acc_fin::scenario_prettify.3118: scenario '$scenario_tid' ac_idx '${ac_idx}' ac '$ac' act '$act'" + # if activity has a coefficient, then root activity gets coefs, but activity counts 1 ie. swap coef values for this case + set count_on_cp_p_arr($ac) [expr { $on_critical_path_p_arr($ac) * $act_coef($act) + $count_on_cp_p_arr($ac) } ] + set count_on_cp_p_arr($act) [expr { $on_critical_path_p_arr($act) * $act_coef($ac) + $count_on_cp_p_arr($act) } ] + } else { + set count_on_cp_p_arr($act) [expr { $on_critical_path_p_arr($act) * $act_coef($act) + $count_on_cp_p_arr($act) } ] + } + # set defaults for popularity_arr() + ## popularity_arr(act) is the count of paths that an activity is in. + set popularity_arr($act) 0 + } + ## count_on_cp_p_arr(act) is the count of this activity on the critical path. coef activities are also accumulated as activity to handle expansions either way + + # path comparison calculations + set path_counter 0 + foreach path_idx_dur_cost_len_list $paths_sort1_lists { + set path_idx [lindex $path_idx_dur_cost_len_list 0] + set path_list $paths_arr(${path_idx}) + set path_len [lindex $path_idx_dur_cost_len_list 3] + set path_len_w_coefs [lindex $path_idx_dur_cost_len_list 4] + set act_count_on_cp 0 + + set term 1 + set multiple_act_p [regexp {^([^\*]+)[\*]([^\*]+)} $act scratch term base_act] + if { !$multiple_act_p } { + set base_act $act + } + foreach act $path_list { + incr act_count_on_cp $count_on_cp_arr($act) + set a_sig_path_p 0 + set sig_idx [lsearch -exact $path_sig_list $act] + if { $sig_idx > -1 } { + set a_sig_path_p 1 + } + set pop_idx [lsearch -exact $path_list $base_act] + if { $pop_idx > -1 } { + incr popularity_arr(${base_act}) + if { $multiple_act_p } { + # increment the case with coeffient as well + incr popularity_arr($act) + } + } + } + set a_sig_path_p_arr(${path_idx}) $a_sig_path_p + + set act_cp_ratio [expr { $act_count_on_cp / ( $cp_len + 0. ) } ] + set act_cp_ratio_arr(${path_idx}) $act_cp_ratio + + if { !$error_time } { + set duration_ratio_arr(${path_idx}) [expr { $path_duration_arr(${path_idx}) / ( $cp_duration + 0. ) } ] + } + if { !$error_cost } { + set cost_ratio_arr(${path_idx}) [expr { $cw_arr(${path_idx}) / ( $cp_cost + 0. ) } ] + } + if { !$error_eco2 } { + set eco2_ratio_arr(${path_idx}) [expr { $ew_arr(${path_idx}) / ( $cp_eco2 + 0. ) } ] + } + + set path_counter_arr(${path_idx}) $path_counter + incr path_counter + } + } + + if { $error_fail == 0 && $index_eq ne "" } { + # resort paths_sort1_lists using index_custom + # calculate custom equation for custom sort? + ## index_custom is value of custom index equation index_eq, or empty string + set path2_lists [list ] + + foreach path_idx_dur_cost_len_list $paths_sort1_lists { + # variables available for use with custom index equation: + # activity_count is length activities_list ie count of all activities + # paths_count is the number of paths ie length of paths_list + # act_count_max is max count of unique activities on a path + # act_count_median is median count of unique activities on a path + # path_counter CP is 0 + # calculate: + # on_critical_path_p + # a_sig_path_p + # act_cp_ratio + # cost_ratio + # duration_ratio + + set path_idx [lindex $path_idx_dur_cost_len_list 0] + set path_list $paths_arr(${path_idx}) + set row_list [lrange $path_list 0 4] + set path_len [lindex $path_idx_dur_cost_len_list 3] + set path_len_w_coefs [lindex $path_idx_dur_cost_len_list 4] + set path_counter $path_counter_arr(${path_idx}) + set a_sig_path_p $a_sig_path_p_arr(${path_idx}) + set act_cp_ratio $act_cp_ratio_arr(${path_idx}) + set duration_ratio "" + if { !$error_time } { + set duration_ratio $path_duration_arr(${path_idx}) + } + set cost_ratio "" + if { !$error_cost } { + set cost_ratio $cw_arr(${path_idx}) + } + if { !$error_eco2 } { + set eco2_ratio $ew_arr(${path_idx}) + } + set on_critical_path_p [expr { $path_counter_arr(${path_idx}) == 0 } ] + set index_custom "" + if { [catch { + set index_custom [expr { $index_eq } ] + } _error_text] } { + set error_fail 1 + ns_log Warning "acc_fin::scenario_prettify.2646: scenario '$scenario_tid' act '$act' index_eq '${index_eq}'" + acc_fin::pretti_log_create $scenario_tid "${act}" "#accounts-finance.calculation#" "#accounts-finance.error# PRETTI '${index_eq}' (ref2646). #accounts-finance.hint# '${_error_text}'" $user_id $instance_id + } + + # paths_lists 5 + # set index_custom_arr(${path_idx}) + lappend row_list $index_custom + } + if { $error_fail == 0 } { + # sort by custom created index + set paths_sort1_lists [lsort -decreasing -real -index 5 $path2_lists] + } + unset path2_lists + } + if { $error_fail == 0 } { + # # # build base table + ns_log Notice "acc_fin::scenario_prettify.2468: scenario '$scenario_tid' Build base report table." + + + # Cells need this info for presentation: + # activity_time_expected, time_start (branches_duration_max - time_expected),time_finish (branches_duration_max) + # activity_cost_expected, path_costs to complete activity + # direct dependencies + + # variables available at this point include: + + # constant per project or run: + + ## activities_list list of activities to process + ## activity_count is length activities_list + ## paths_count is the number of paths ie length of paths_list + ## error_fail is set to 1 if there has been an error that prevents continued processing + ## error_cost is set to 1 if there has been an error that prevents continued processing of cost aspects + ## error_eco2 is set to 1 if there has been an error that prevents continued processing of eco2 aspects + ## error_time is set to 1 if there has been an error that prevents continued processing of time aspects + ## paths_sort1_lists is paths_list sorted by index used to calc CP + + # constant per path: + + ## path_len_arr(path_idx) is length of a path in paths_lists with path_idx + ## path_len_w_coef_arr(path_idx) is total number of activities in a path (with coefficients) + ## paths_list: (list path_arr_idx duration cost length length_w_coefs index_custom) + ## index_custom is value of custom index equation index_eq, or empty string + ## path_counter_arr(path_idx) + ## a_sig_path_p_arr(path_idx) + ## act_cp_ratio(path_idx) + + # constant per activity: activity_ref from activities_list + + ## act_seq_num_arr(act) is relative sequence number of an activity in it's path. First activity is 0 + ## dependencies_larr(act) is a list of direct dependencies for each activity + ## dependents_count_arr(act) is count number of activities in each subtree, not including the activity itself. + ## count_on_cp_p_arr(act) Answers Q: How many of this activity is on the critical path. coef activities are also accumulated as activity to handle expansions either way + ## act_freq_in_load_cp_alts_arr(act) counts number of times an activity appears in all paths (including coefficients) + ## act_time_expected_arr(act) is the time expected to complete an activity + ## tw_arr(path_idx,act) is duration of ptrack up to (and including) activity. + ## t_dc_source_arr(act) answers Q: what is source of time distribution curve? + ## act_cost_expected_arr(act) is the cost expected to complete an activity + ## cw_arr(path_idx,act) is cost of all dependent ptrack plus cost of activity + ## ew_arr(path_idx,act) is eco2 of all dependent ptrack plus eco2 of activity + ## c_dc_source_arr(act) answers Q: what is source of cost distribution curve? + ## e_dc_source_arr(act) answers Q: what is source of eco2 distribution curve? + ## act_coef(act) is the coefficient of an activity. If activity is defined as a multiple of another activity, it is an integer greater than 1 otherwise 1. + ## popularity_arr(act) is the count of paths that an activity is in. + + ## path_tree_p_arr(act) answers question: is this tree of ptracks complete (ie not a subset of another track or tree)? + ## tn_arr(activity) is the time expected to complete an activity and its dependents + ## cn_arr(activity) is the cost expected to complete an activity and its dependents + ## en_arr(activity) is the eco2 expected to complete an activity and its dependents + + + # other + ## max_act_path_dur(activity) the maximum path duration that an activity is in. (helps with prioritization) + ## act_count_of_seq_arr(sequence no) is the count of activities at this sequence number across all paths, 0 is first sequence number + ## act_seq_max is the maximum path length in context of sequence_number + + + + # # # PRETTI p5_lists built + # Build an audit/feedback table list of lists, where each row is an activity + # p5 are activities, and p6 are paths. a path key is shared between p5 and p6 tables + set p5_lists [list ] + set p5_titles_list [acc_fin::pretti_columns_list p5 1] + + # *_dc_ref references cache reference + #lappend p5_titles_list "t_dc" + #lappend p5_titles_list "c_dc" + #lappend p5_titles_list "e_dc" + lappend p5_lists $p5_titles_list + set activity_counter 0 + foreach act $activities_list { + #set tree_act_cost_arr($act) $cn_arr($act) + incr activity_counter + incr act_count_on_cp $count_on_cp_arr($act) + set has_direct_dependency_p [expr { [llength $dependencies_larr($act)] > 0 } ] + set on_a_sig_path_p [expr { $act_freq_in_load_cp_alts_arr($act) > $act_count_median } ] + set act_maxcc "" + set act_maxol "" + set act_maxtpr "" + set act_maxrt "" + set act_maxer "" + set act_maxcd "" + if { [info exists act_maxcc_arr($act) ] } { + set act_maxcc $act_maxcc_arr($act) + } + if { [info exists act_maxol_arr($act) ] } { + set act_maxol $act_maxol_arr($act) + } + if { [info exists act_maxtpr_arr($act) ] } { + set act_maxtpr $act_maxtpr_arr($act) + } + if { [info exists act_maxrt_arr($act) ] } { + set act_maxrt $act_maxrt_arr($act) + } + if { [info exists act_maxcd_arr($act) ] } { + set act_maxcd $act_maxcd_arr($act) + } + if { [info exists act_maxer_arr($act) ] } { + set act_maxer $act_maxer_arr($act) + } + # determine max duration of paths for this activity + set max_path_duration 0 + # there should be at least one p_idx per act.. + if { [llength $path_idxs_in_act_larr($act) ] > 0 } { + foreach p_idx $path_idxs_in_act_larr($act) { + if { $path_duration_arr(${p_idx}) > $max_path_duration } { + set max_path_duration $path_duration_arr(${p_idx}) + } + } + } else { + ns_log Warning "acc_fin::scenario_prettify.3638: path_idxs_in_act_larr(${act}) is empty. This should not happen. Investigate. path_idxs_in_act_larr '[array get path_idxs_in_act_larr]'" + } + if { $max_path_duration != 0 } { + set max_act_path_dur_arr($act) $max_path_duration + } else { + ns_log Warning "acc_fin::scenario_prettify.3643: max_path_duration '0' for ${act}. This should not happen. Investigate. path_duration_arr '[array get path_duration_arr]' " + } + # base for p5 + set activity_list [list $act $activity_counter $has_direct_dependency_p [join $dependencies_larr($act) " "] [llength $dependencies_larr($act)] $on_critical_path_p_arr($act) $on_a_sig_path_p $act_freq_in_load_cp_alts_arr($act) $popularity_arr($act) $act_time_expected_arr($act) $tn_arr($act) $t_dc_source_arr($act) $act_cost_expected_arr($act) $cn_arr($act) $c_dc_source_arr($act) $act_eco2_expected_arr($act) $en_arr($act) $e_dc_source_arr($act) $act_coef($act) $act_maxcc $act_maxrt $act_maxtpr $act_maxol $act_maxcd $act_maxer $max_path_duration $act_tcref($act) $act_ccref($act) $act_ecref($act) ] + lappend p5_lists $activity_list + } + + set p6_lists [list ] + set p6_titles_list [acc_fin::pretti_columns_list p6 1] + # following added to acc_fin::pretti_columns_list p6 so no need to add here: + #lappend p6_titles_list "path_len" + #lappend p6_titles_list "path_len_w_coefs" + lappend p6_lists $p6_titles_list + + foreach path_idx_dur_cost_len_list $paths_sort1_lists { + set path_idx [lindex $path_idx_dur_cost_len_list 0] + set path_list $paths_arr(${path_idx}) + set path_counter $path_counter_arr(${path_idx}) + set a_sig_path_p $a_sig_path_p_arr(${path_idx}) + set act_cp_ratio $act_cp_ratio_arr(${path_idx}) + # set index_custom $index_custom_arr(${path_idx}) + set path_duration [lindex $path_idx_dur_cost_len_list 1] + set path_cost [lindex $path_idx_dur_cost_len_list 2] + set path_len [lindex $path_idx_dur_cost_len_list 3] + set path_len_w_coefs [lindex $path_idx_dur_cost_len_list 4] + set index_custom [lindex $path_idx_dur_cost_len_list 5] + set path_eco2 [lindex $path_idx_dur_cost_len_list 6] + set activity_counter 0 + set act_count_on_cp 0 + # base for p6 + # set ret_list [list path_idx path path_counter cp_q significant_q path_duration path_cost index_custom path_len path_len_w_coefs] + set cp_q [expr { $path_counter == 0 } ] + set path_list [list $path_idx [join $path_list "."] $path_counter $cp_q $a_sig_path_p $path_duration $path_cost $index_custom $path_eco2 $path_len $path_len_w_coefs ] + lappend p6_lists $path_list + } + + set scenario_stats_list [qss_table_stats $scenario_tid $instance_id $user_id] + set scenario_name [lindex $scenario_stats_list 0] + if { [llength $t_point_list ] > 1 } { + set t_point_len_list [list ] + foreach point $t_point_list { + lappend t_point_len_list [string length $point] + } + set t_point_format "%1.f" + append t_point_format [expr { [f::lmax $t_point_len_list] - 2 } ] + lappend " t=[format ${t_point_format} ${t_point}]" + } + if { [llength $c_point_list ] > 1 } { + set c_point_len_list [list ] + foreach point $c_point_list { + lappend c_point_len_list [string length $point] + } + set c_point_format "%1.f" + append c_point_format [expr { [f::lmax $c_point_len_list] - 2 } ] + lappend " c=[format ${c_point_format} ${c_point}]" + } + if { [llength $e_point_list ] > 1 } { + set e_point_len_list [list ] + foreach point $e_point_list { + lappend e_point_len_list [string length $point] + } + set e_point_format "%1.f" + append e_point_format [expr { [f::lmax $e_point_len_list] - 2 } ] + lappend " e=[format ${e_point_format} ${e_point}]" + } + + set scenario_title [lindex $scenario_stats_list 1] + + set time_end [clock seconds] + set time_diff_secs [expr { $time_end - $time_start } ] + set setup_diff_secs [expr { $setup_end - $setup_start } ] + # the_time Time calculation completed + set p1_arr(the_time) [clock format [clock seconds] -format "%Y %b %d %H:%M:%S"] + # comments should include cp_duration, cp_cost, max_act_count_per_track + # time_probability_point, cost_probability_point, + # scenario_name, processing_time, time/date finished processing + set comments "Scenario report for ${scenario_title}: " + append comments "scenario_name ${scenario_name} , cp_duration_at_pp ${cp_duration} , cp_cost_pp ${cp_cost} , cp_eco2_pp ${cp_eco2}" + append comments "max_act_count_per_track ${act_count_max} , time_probability_point ${t_point} , cost_probability_point ${c_point} , " + append comments "setup_time ${setup_diff_secs} , main_processing_time ${time_diff_secs} seconds , time/date finished processing $p1_arr(the_time) , " + append comments "_tDcSource $p1_arr(_tDcSource) , _cDcSource $p1_arr(_cDcSource) , " + + + if { $p1_arr(db_format) ne "" } { + qss_table_create $p5_lists "${scenario_name}.p5" "${scenario_title}.p5" $comments "" p5 $instance_id $user_id + qss_table_create $p6_lists "${scenario_name}.p6" "${scenario_title}.p6" $comments "" p6 $instance_id $user_id + } + set precision "" + if { [qf_is_decimal $p1_arr(precision) ] } { + set precision $p1_arr(precision) + } + if { [qf_is_decimal $p1_arr(tprecision) ] } { + set tprecision $p1_arr(tprecision) + } else { + set tprecision $precision + } + if { [qf_is_decimal $p1_arr(cprecision) ] } { + set cprecision $p1_arr(cprecision) + } else { + set cprecision $precision + } + if { [qf_is_decimal $p1_arr(eprecision) ] } { + set eprecision $p1_arr(eprecision) + } else { + set eprecision $precision + } + append comments "precision $precision , tprecision $tprecision , cprecision $cprecision , eprecision $eprecision , " + # # # build p4 + + # save as a new table of type p4 + append comments "color_mask_sig_idx 3 , color_mask_oth_idx 5 , colorswap_p 0" + + # p4_lol consists of first row (a list item): + # (list path_1 path_2 path_3 ... path_N ) + # subsequent rows (list items): + # (list cell_r1c1 cell_r1c2 cell_r1c3 ... cellr1cN ) + # ... + # (list cell_rMc1 cell_rMc2 cell_rMc3 ... cellrMcN ) + # for N paths of a maximum of M rows. + # Each cell is an activity. + # Each column is a path + # Path_1 is CP + + # empty cells have empty string value. + # other cells will contain comment format from acc_fin::scenario_prettify + # "$activity " + # "t:[lindex $path_list 7] " + # "ts:[lindex $path_list 6] " s is for sequence or plural + # "c:[lindex $path_list 9] " + # "cs:[lindex $path_list 10] " s is for sequence or plural + # "d:($depnc_larr(${activity})) " + # " " + ##################### + + + # Need to convert into rows ie.. transpose rows of each column to a path with column names: path_(1..N). path_1 is CP + # trac_1 path_2 path_3 ... path_N + + set p4_lists [list ] + set title_row_list [list ] + set path_num 1 + + # in p4 PRETTI table, each path is a column, so each row is built from each column, each column lappends each row.. + # store each row in: row_larr() + for {set i 0} {$i < $act_count_max} {incr i} { + set row_larr($i) [list ] + } + + foreach path_idx_dur_cost_len_list $paths_sort1_lists { + set path_idx [lindex $path_idx_dur_cost_len_list 0] + set path_list $paths_arr(${path_idx}) + set path_counter $path_counter_arr(${path_idx}) + set a_sig_path_p $a_sig_path_p_arr(${path_idx}) + set act_cp_ratio $act_cp_ratio_arr(${path_idx}) + # set index_custom $index_custom_arr(${path_idx}) + set path_duration [lindex $path_idx_dur_cost_len_list 1] + set path_cost [lindex $path_idx_dur_cost_len_list 2] + set path_len [lindex $path_idx_dur_cost_len_list 3] + set path_len_w_coefs [lindex $path_idx_dur_cost_len_list 4] + set index_custom [lindex $path_idx_dur_cost_len_list 5] + set path_eco2 [lindex $path_idx_dur_cost_len_list 6] + + set path_name "path_${path_num}" + lappend title_row_list $path_name + set ptrack_list [list ] + # fill in rows for this column + for {set i 0} {$i < $act_count_max} {incr i} { + set activity [lindex $path_list $i] + if { $activity ne "" } { + # cell should contain this info: "$act t:${time_expected} T:${branches_duration_max} D:${dependencies} " + lappend ptrack_list $activity + set cell $activity + if { !$error_time } { + append cell "
" + append cell " t:" + if { $act_time_expected_arr($activity) ne "" } { + if { $tprecision eq "" } { + append cell $act_time_expected_arr($activity) + } else { + append cell [qaf_round_to_precision $act_time_expected_arr($activity) $tprecision ] + } + } + append cell "
" + append cell "tw:" + if { $tw_arr(${path_idx},$activity) ne "" } { + if { $tprecision eq "" } { + append cell $tw_arr(${path_idx},$activity) + } else { + append cell [qaf_round_to_precision $tw_arr(${path_idx},$activity) $tprecision ] + } + } + append cell "
" + append cell "tn:" + if { $tn_arr($activity) ne "" } { + if { $tprecision eq "" } { + append cell $tn_arr($activity) + } else { + append cell [qaf_round_to_precision $tn_arr($activity) $tprecision ] + } + } + append cell "
" + append cell "fw:" + if { $tn_arr($activity) ne "" && $tw_arr($path_idx,$activity) ne "" } { + if { $tprecision eq "" } { + append cell [expr { $tn_arr($activity) - $tw_arr(${path_idx},$activity) } ] + } else { + append cell [qaf_round_to_precision [expr { $tn_arr($activity) - $tw_arr(${path_idx},$activity) } ] $tprecision ] + } + } + } + if { !$error_cost } { + append cell "
" + append cell " c:" + if { $act_cost_expected_arr($activity) ne "" } { + if { $cprecision eq "" } { + append cell $act_cost_expected_arr($activity) + } else { + append cell [qaf_round_to_precision $act_cost_expected_arr($activity) $cprecision ] + } + } + append cell "
" + append cell "cw:" + if { $cw_arr(${path_idx},$activity) ne "" } { + if { $cprecision eq "" } { + append cell $cw_arr(${path_idx},$activity) + } else { + append cell [qaf_round_to_precision $cw_arr(${path_idx},$activity) $cprecision ] + } + } + append cell "
" + append cell "cn:" + if { $cn_arr($activity) ne "" } { + if { $cprecision eq "" } { + append cell $cn_arr($activity) + } else { + append cell [qaf_round_to_precision $cn_arr($activity) $cprecision ] + } + } + } + if { !$error_eco2 } { + # eco2 part start + append cell "
" + append cell " e:" + if { $act_eco2_expected_arr($activity) ne "" } { + if { $eprecision eq "" } { + append cell $act_eco2_expected_arr($activity) + } else { + append cell [qaf_round_to_precision $act_eco2_expected_arr($activity) $eprecision ] + } + } + append cell "
" + append cell "ew:" + if { $ew_arr(${path_idx},$activity) ne "" } { + if { $eprecision eq "" } { + append cell $ew_arr(${path_idx},$activity) + } else { + append cell [qaf_round_to_precision $ew_arr(${path_idx},$activity) $eprecision ] + } + } + append cell "
" + append cell "en:" + if { $en_arr($activity) ne "" } { + if { $eprecision eq "" } { + append cell $en_arr($activity) + } else { + append cell [qaf_round_to_precision $en_arr($activity) $eprecision ] + } + } + # eco2 part end + } + append cell "
" + append cell "d:(" + append cell [join $dependencies_larr(${activity}) " "] + append cell ")
" + # set popularity $popularity_arr($activity) + set popularity $act_freq_in_load_cp_alts_arr($activity) + set on_a_sig_path_p [expr { $act_freq_in_load_cp_alts_arr($activity) > $act_count_median } ] + set max_path_duration $max_act_path_dur_arr($activity) + # this calced in p4 html generator: set on_cp_p [expr { $count_on_cp_p_arr($activity) > 0 } ] + append cell " " + lappend row_larr($i) $cell + } else { + lappend row_larr($i) "" + } + } + incr path_num + } + # combine the rows + lappend p4_lists $title_row_list + for {set i 0} {$i < $act_count_max} {incr i} { + lappend p4_lists $row_larr($i) + } + set sname "${scenario_name}.p4" + set stitle "${scenario_title}.p4" + if { $t_point ne "" } { + append sname "t${t_point}" + append stitle " t=${t_point}" + } + if { $c_point ne "" } { + append sname "c${c_point}" + append stitle " c=${c_point}" + } + if { $e_point ne "" } { + append sname "e${e_point}" + append stitle " e=${e_point}" + } + + qss_table_create $p4_lists $sname $stitle $comments "" p4 $instance_id $user_id + # Comments data will be interpreted for determining standard deviation for determining cell highlighting + } + } + # next c_point + } + # next t_point + } + ns_log Notice "acc_fin::scenario_prettify.2639: scenario '$scenario_tid' done." + set success_p [expr { abs( $error_fail - 1 ) } ] + return $success_p +} + + +ad_proc -public acc_fin::table_sort_y_asc { + table_tid + {instance_id ""} + {user_id ""} +} { + Creates a copy of a distribution curve (table) sorted by column Y in ascending order. Returns table_id or empty string if error. +} { + if { $instance_id eq "" } { + set instance_id [ad_conn package_id] + } + if { $user_id eq "" } { + set user_id [ad_conn user_id] + } + set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] + set table_id_new "" + if { $read_p } { + set create_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege create] + if { !$create_p } { + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + } + if { $create_p || $write_p } { + set table_stats_list [qss_table_stats $table_tid $instance_id $user_id] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id. + set trashed_p [lindex $table_stats_list 7] + set table_flags [lindex $table_stats_list 6] + set tid_user_id [lindex $table_stats_list 11] + if { $table_flags eq "dc" && !$trashed_p } { + set table_lists [qss_table_read $table_tid ] + set title_row [lindex $table_lists 0] + set y_idx [lsearch -exact $title_row "y"] + if { $y_idx > -1 } { + set table_sorted_lists [lsort -index $y_idx -real [lrange $table_lists 1 end]] + set table_sorted_lists [linsert $table_sorted_lists 0 $title_row] + set table_stats [qss_table_stats $table_tid $instance_id $user_id] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id. + set table_name [lindex $table_stats 0] + set table_title [lindex $table_stats 1] + set table_comments [lindex $table_stats 2] + append table_comments " Sorted by Y on [lc_time_system_to_conn [clock format [clock seconds] -format "%Y-%m-%d %r"]]" + set table_template_id [lindex $table_stats 5] + set table_flags [lindex $table_stats_list 6] + set table_id_new [qss_table_create $table_sorted_lists $table_name $table_title $table_comments $table_template_id $table_flags $instance_id $user_id] + } + } + } + } + return $table_id_new +} Index: openacs-4/packages/accounts-finance/tcl/utility-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/utility-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/utility-procs.tcl 14 Nov 2014 18:20:17 -0000 1.1 @@ -0,0 +1,829 @@ +ad_library { + + general procs with utility elsewhere and first used and thus defined in this package. + @creation-date 8 August 2014 + @cvs-id $Id: +} + +namespace eval acc_fin {} + + +ad_proc -public acc_fin::chart_file_names { + chart_filename + {instance_id ""} +} { + Returns a list of standard paths used with generated charts. + ref 0 is OS pathname, ref 1 is web url, ref 2 is a temporary location while building chart +} { + #ns_log Notice "acc_fin::chart_file_names.17: chart_filename $chart_filename instance_id $instance_id" + regsub -all -- {[^a-zA-Z0-9\.\_\-]} $chart_filename {_} chart_filename + if { ![string match -nocase "*.png" $chart_filename] } { + append chart_filename ".png" + } + set acsroot [acs_root_dir] + set tempdir [file join $acsroot "tmp"] + set chart_webpath [acc_fin::file_web_pathname $instance_id] + set chart_path [acc_fin::file_sys_pathname "" $chart_webpath $instance_id] + # if chart_filename ne "" is always false.. + set file_append "/" + append file_append ${chart_filename} + append chart_path $file_append + append chart_webpath $file_append + append tempdir $file_append + set name_list [list $chart_path $chart_webpath $tempdir] + #ns_log Notice "acc_fin::chart_file_names.30: ${name_list}" + return $name_list +} + +ad_proc -public acc_fin::table_data_stats { + {curve_list_name "curve_lists"} + {x_list_name "maybe_x_list"} + {y_list_name "maybe_y_list"} + {x_min_name "x_min"} + {x_max_name "x_max"} + {y_min_name "y_min"} + {y_max_name "y_max"} + {x_sum_name "x_sum"} + {y_sum_name "y_sum"} +} { + Validates data, splits off the x and y data (if curve_list_name supplied), and gathers some statistics about it. + Returns 1 if data validates, and values of x_min_name x_max_name y_min_name y_max_name x_list_name y_list_name via upvar +} { + upvar 1 $curve_list_name curve_lists + upvar 1 $x_list_name maybe_x_list + upvar 1 $y_list_name maybe_y_list + upvar 1 $x_min_name x_min + upvar 1 $x_max_name x_max + upvar 1 $y_min_name y_min + upvar 1 $y_max_name y_max + upvar 1 $x_sum_name x_sum + upvar 1 $y_sum_name y_sum + + set error_p 0 + set maybe_x_list_len [llength $maybe_x_list ] + set maybe_y_list_len [llength $maybe_y_list ] + + if { $curve_lists ne "" && $maybe_x_list eq "" && $maybe_y_list eq "" } { + set table_titles_list [lindex $curve_lists 0] + set table_data_list [lrange $curve_lists 1 end] + set x_idx [lsearch -exact $table_titles_list "x"] + set y_idx [lsearch -exact $table_titles_list "y"] + set row_count [llength $table_data_list] + if { $x_idx > -1 && $y_idx > -1 && $row_count > 0 } { + + # find min max x and y values and other preparations + set row [lindex $table_data_list 0] + set x_min [lindex $row $x_idx] + set y_min [lindex $row $y_idx] + set x_max $x_min + set y_max $y_min + set x_sum $x_min + set y_sum $y_min + set maybe_x_list [list $x_min] + set maybe_y_list [list $y_min] + foreach row [lrange $table_data_list 1 end] { + set x [lindex $row $x_idx] + set y [lindex $row $y_idx] + if { [ad_var_type_check_number_p $x] && [ad_var_type_check_number_p $y] } { + lappend maybe_x_list $x + lappend maybe_y_list $y + set maybe_x_list_len [llength $maybe_x_list ] + set x_sum [expr { $x_sum + abs( $x ) } ] + if { $y > $y_max } { + set y_max $y + } + if { $y < $y_min } { + set y_min $y + } + if { $x > $x_max } { + set x_max $x + } + if { $x < $x_min } { + set x_min $x + } + } else { + set error_p 1 + } + } + } else { + set error_p 1 + } + } elseif { $maybe_x_list_len > 0 && $maybe_y_list_len > 0 && $maybe_x_list_len == $maybe_y_list_len } { + set y_p 1 + set x_p 1 + foreach x $maybe_x_list { + if { ![qf_is_decimal $x] } { + set x_p 0 + set error_p 1 + } + } + foreach y $maybe_y_list { + if { ![qf_is_decimal $y] } { + set y_p 0 + set error_p 1 + } + } + if { $error_p == 0 } { + set row_count $maybe_x_list_len + set x_max [f::lmax $maybe_x_list] + set y_max [f::lmax $maybe_y_list] + set x_min [f::lmin $maybe_x_list] + set y_min [f::lmin $maybe_y_list] + set x_sum [f::sum $maybe_x_list] + set y_sum [f::sum $maybe_y_list] + } + } else { + set error_p 1 + } + set success_p 1 + if { $error_p } { + set success_p 0 + } + return $success_p +} + + +ad_proc -public acc_fin::cobbler_file_create_from_table { + table_id + {user_id ""} + {instance_id ""} +} { + This is a wrapper for acc_fin::cobbler_file_create to conveniently pass data to scheduled proc add_fin::schedule_do. table_id is a qss_simple_table id. +} { + if { $instance_id eq "" } { + ns_log Warning "acc_fin::cobbler_file_create_from_table.45: No instance_id supplied." + set instance_id [ad_conn package_id] + } + if { $user_id eq "" } { + ns_log Warning "acc_fin::cobbler_file_create_from_table.49: No user_id supplied." + set user_id [ad_conn user_id] + } + set cobbler_filename [acc_fin::pretti_cobbler_filename $table_id] + set curve_lists [qss_table_read $table_id $instance_id $user_id] + set return_val [acc_fin::cobbler_file_create $cobbler_filename $curve_lists $instance_id] + return $return_val +} + +ad_proc -public acc_fin::cobbler_file_create { + cob_filename + curve_lists + {instance_id ""} + {maybe_x_list ""} + {maybe_y_list ""} + {x_max_min_px "100"} + {x_max_max_px "1000"} + {y_max_min_px "100"} + {y_max_max_px "1000"} + {color1 ""} + {color2 ""} +} { + returns filepathname or empty string if error. depends on graphicsmagick. Creates image if it doesn't exist. + resolution adjusts automatically to fit smallest slice for pixel range of x_max_* by y_max_* + defaults: + x_max_min_px 100, x_max_max_px 1000, y_max_min_px 100, y_max_max_px 1000, color1 #999999, color2 #cccccc, url web + If url is anything other than web or list, then a filesystem pathname is returned. + If web, the web url is returned. + If url is 'list', then a list of both filesystem-pathname and web-pathname are returned. +} { + set error_p 0 + + + # set alternating colors + if { [regexp {[\#]?([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])} $color1 ] } { + set color_arr(1) "#$color1" + } else { + set color_arr(1) "#cccccc" + } + if { [regexp {[\#]?([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])} $color2 ] } { + set color_arr(1) "#$color2" + } else { + set color_arr(0) "#999999" + } + if { ![qf_is_natural_number $x_max_min_px] } { + set x_max_min_px 100 + } + if { ![qf_is_natural_number $x_max_max_px] } { + set x_max_max_px 1000 + } + if { ![qf_is_natural_number $y_max_min_px] } { + set y_max_min_px 100 + } + if { ![qf_is_natural_number $y_max_min_px] } { + set y_max_min_px 1000 + } + + set name_list [acc_fin::chart_file_names $cob_filename $instance_id] + set cob_pathname [lindex $name_list 0] + set cob_path [file dirname $cob_pathname] + + if { [file exists $cob_path] } { + if { ![file isdirectory $cob_path] } { + ns_log Warning "acc_fin::cobbler_file_create.68: unable to create filename, because '${cob_path}' is not a directory" + set error_p 1 + } + } else { + file mkdir -p $cob_path + } + + set cob_tmppathname [lindex $name_list 2] + set tempdir [file dirname $cob_tmppathname] + if { [file exists $tempdir] } { + if { ![file isdirectory $tempdir] } { + ns_log Warning "acc_fin::cobbler_file_create.102: unable to create filename, because '${tempdir}' is not a directory" + set error_p 1 + } + } else { + file mkdir -p $tempdir + } + + if { $error_p == 0 } { + set cob_webpathname [lindex $name_list 1] + + if { ![file exists $cob_pathname] } { + set success_p [acc_fin::table_data_stats ] + set error_p [expr { abs( $success_p - 1 ) } ] + if { $error_p == 0 } { + # style cobbler (square pie) chart + # make chart as png image? + if { ![file exists $cob_pathname] } { + # Create canvas image + # to create a solid red canvas image: + # gm convert -size 640x480 "xc:#f00" canvas.png + # from: www.graphicsmagick.org/FAQ.html + # Assume the same border for the farsides. It may be easier for a user to clip than to add margin. + # Image 0 point should be at twelve oclock. (subtract 90 from angle) + # split any angle over 180 degrees into two angles < 180. + # Try to provide image resolution at least one pixel per degree and/or 1% of range of y. + + # r_case1 is resolution along min size of (x) 1 pixel for min width + set r_case1 [f::max $x_max_min_px [f::min $x_max_max_px [expr { $x_sum / $x_min } ]]] + # r_case2 is resolution along range of y. + set r_case2 [f::max $y_max_min_px [f::min $y_max_max_px [expr { $y_max - $y_min } ]]] + set r [f::max $r_case1 $r_case2 ] + set dim_px [expr { round( $r + .99 ) } ] + #set dim_py [expr { round( $r / 3.6 ) } ] + set dim_py $dim_px + ns_log Notice "acc_fin::cobbler_file_create.265. dim_px $dim_px dim_py $dim_py" + exec gm convert -size ${dim_px}x${dim_py} "xc:#ffffff" $cob_tmppathname + set x0 0 + set y0 [expr { $dim_py } ] + set x2 $x0 + set y2 $y0 + set k1 [expr { $r / ( $x_sum + 0. ) } ] + set k2 [expr { $dim_py / ( $y_max + 0. ) } ] + set maybe_x_list_len [llength $maybe_x_list ] + for {set j 0} { $j < $maybe_x_list_len } {incr j } { + set odd_p [expr { 1 + $j - int( ( $j + 1 ) / 2 ) * 2 } ] + set x [lindex $maybe_x_list $j] + set y [lindex $maybe_y_list $j] + set bar_width [expr { $x * $k1 } ] + set bar_height [expr { $y * $k2 } ] + set x1 $x2 + set y1 $y0 + set x2 [expr { round( $x1 + $bar_width ) } ] + set y2 [expr { round( $y0 - $bar_height ) } ] + #ns_log Notice "accounts-finance/lib/pretti-one-view.tcl x0 $x0 y0 $y0 x1 $x1 y1 $y1 x2 $x2 y2 $y2" + exec gm convert -size ${dim_px}x${dim_py} -fill $color_arr($odd_p) -stroke $color_arr($odd_p) -draw "rectangle $x1,$y1 $x2,$y2" $cob_tmppathname $cob_tmppathname + } + # some OSes are less buggy with copy/delete instead of move on busy VMs apparently due to server/OS file memory hooks. + file copy $cob_tmppathname $cob_pathname + file delete $cob_tmppathname + } + } + } + } + if { $error_p } { + set return_val 0 + } else { + set return_val 1 + } + return $return_val +} + + + +ad_proc -public acc_fin::cobbler_html_view { + cobbler_filename +} { + Returns image url if available, otherwise empty string. +} { + #ns_log Notice "acc_fin::cobbler_html_view.309: cobbler_filename $cobbler_filename" + set cobbler_html "" + # acc_fin::file_sys_pathname gets webpath, so let's get it here to save a double + # trip on a positive case + # get web pathname + set web_path [acc_fin::file_web_pathname] + + set filepathname [acc_fin::file_sys_pathname $cobbler_filename $web_path] + if { [file exists $filepathname ] } { + append web_path "/" + append web_path $cobbler_filename + set cobbler_html $web_path + } + return $cobbler_html +} + +ad_proc -public acc_fin::cobbler_html_build_n_view { + cob_filename + curve_lists + maybe_x_list + maybe_y_list + {x_max_min_px "100"} + {x_max_max_px "500"} + {y_max_min_px "100"} + {y_max_max_px "500"} + {color1 ""} + {color2 ""} +} { + returns html string or empty string if error. + resolution adjusts automatically to fit smallest slice for pixel range of x_max_* by y_max_* + defaults: + x_max_min_px 100, x_max_max_px 500, y_max_min_px 100, y_max_max_px 500, color1 #999999, color2 #cccccc +} { + set error_p 0 + set instance_id [ad_conn package_id] + set user_id [ad_conn user_id] + set cob_html "" + set name_list [acc_fin::chart_file_names $cob_filename $instance_id] + set cob_pathname [lindex $name_list 0] + if { [file exists $cob_pathname] && ![file isdirectory $cob_pathname] } { + # display image + set cob_webpathname [lindex $name_list 1] + set dim_px "" + set dim_py "" + set suffix [string range [file extension $cob_pathname] 1 end] + if { [string match -nocase $suffix {[pjg][npi][gf]} ] } { + set dims_list [ns_imgsize $cob_pathname] + set dim_px " width=\"" + set dim_py " height=\"" + append dim_px [lindex $dims_list 0] + append dim_py [lindex $dims_list 1] + append dim_px "\"" + append dim_py "\"" + } + + set cob_html "\"See" + + } else { + # display html in lieu of image. + # set alternating colors + if { [regexp {[\#]?([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])} $color1 ] } { + set color_arr(1) "#$color1" + } else { + set color_arr(1) "#cccccc" + } + if { [regexp {[\#]?([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])} $color2 ] } { + set color_arr(1) "#$color2" + } else { + set color_arr(0) "#999999" + } + # verify that color pixel files exist. If not, generate using graphicsmagick + + if { ![qf_is_natural_number $x_max_min_px] } { + set x_max_min_px 100 + } + if { ![qf_is_natural_number $x_max_max_px] } { + set x_max_max_px 500 + } + if { ![qf_is_natural_number $y_max_min_px] } { + set y_max_min_px 100 + } + if { ![qf_is_natural_number $y_max_min_px] } { + set y_max_min_px 500 + } + + if { $error_p == 0 } { + set success_p [acc_fin::table_data_stats ] + set error_p [expr { abs( $success_p - 1 ) } ] + + if { $error_p == 0 } { + # style cobbler (square pie) chart + + # Try to provide image resolution at least one pixel per degree and/or 1% of range of y. + + # r_case1 is resolution along min size of (x) 1 pixel for min width + set rx [f::max $x_max_min_px [f::min $x_max_max_px [expr { $x_sum / ( $x_min + 0. )} ]]] + # r_case2 is resolution along range of y. + set ry [f::max $y_max_min_px [f::min $y_max_max_px [expr { $y_max - $y_min + 0. } ]]] + set dim_px [expr { round( $rx + .99 ) } ] + set dim_py [expr { round( $ry / 3.6 ) } ] + set cob_html "
\n" + + set x0 0 + set y0 $dim_py + set x2 $x0 + set y2 $y0 + set k1 [expr { $dim_px / ( $x_sum + 0. ) } ] + set k2 [expr { $dim_py / ( $y_max + 0. ) } ] + set bar_width 0. + set xy_list [list x y] + set comb_bar_curv_lol [list $xy_list] + set xy_delim "" + set xy_html "" + set batch_y_list [list] + set bars_count 1 + set bar_width_accum 0. + set maybe_x_list_len [llength $maybe_x_list] + set odd_p 1 + for {set j 0} { $j < $maybe_x_list_len } {incr j } { + set x [lindex $maybe_x_list $j] + set y [lindex $maybe_y_list $j] + set bar_width [expr { round( $x * $k1 ) } ] + set bar_height [expr { round( $y * $k2 ) } ] + + set bar_width_accum [expr { $bar_width_accum + $bar_width } ] + #set bar_height [expr { $y * $k2 } ] + #ns_log Notice "acc_fin::cobbler_html_view.433 j $j x $x y $y bar_width $bar_width bar_height $bar_height" + if { $bar_width_accum >= 1. } { + if { $bar_width > 3 } { + set bars_count [llength $comb_bar_curv_lol] + if { $bars_count > 1 } { + # split this into two bars for presentation purposes. First bar is the fractional ones + incr bars_count -1 + #ns_log Notice "acc_fin::cobbler_html_view.443 bars_count $bars_count [llength $batch_y_list] $batch_y_list" + if { $bars_count > 1 } { + set bar_height [expr { round( [f::lmax [lrange $batch_y_list 0 end-1]] / $bars_count ) } ] + } else { + set bar_height [lindex $batch_y_list 0] + } + append cob_html "
\"${xy_html}\"
" + + # reset values to print last bar in set + set xy_html "" + set xy_delim "" + set batch_y_list [list ] + set comb_bar_curv_lol [list $xy_list] + set odd_p [expr { 1 + $odd_p - int( ( $odd_p + 1 ) / 2 ) * 2 } ] + } + } else { + set bar_width [expr { round( $bar_width ) } ] + } + set bars_count [llength $comb_bar_curv_lol] + if { $bars_count > 1 } { + set bar_list [list $x $y] + lappend comb_bar_curv_lol $bar_list + #set bar_height [expr { round([acc_fin::pretti_geom_avg_of_curve $comb_bar_curv_lol]) } ] + set bar_height [expr { round( [f::lmax $batch_y_list] / $bars_count ) } ] + } else { + set bar_height [expr { round( $bar_height ) } ] + } + append xy_html $xy_delim + append xy_html "y=$y x=$x" + #ns_log Notice "acc_fin::cobbler_html_view.452 j $j x $x y $y bar_width $bar_width bar_height $bar_height xy_html $xy_html" + append cob_html "
" + #append cob_html "\"${xy_html}\"" + append cob_html "\"${xy_html}\"" + append cob_html "
" + set bar_width 0. + set bar_width_accum 0. + set comb_bar_curv_lol [list $xy_list] + set batch_y_list [list ] + set xy_delim "" + set xy_html "" + set odd_p [expr { 1 + $odd_p - int( ( $odd_p + 1 ) / 2 ) * 2 } ] + } else { + # keep info to combine bars to match resolution + set bar_list [list $bar_width $bar_height] + lappend comb_bar_curv_lol $bar_list + lappend batch_y_list $bar_height + append xy_html $xy_delim + append xy_html "y=$y x=$x" + set xy_delim ", \n" + } + #ns_log Notice "acc_fin::cobbler_html_view.465 j $j bar_width $bar_width bars_count $bars_count" + } + set bars_count [llength $comb_bar_curv_lol] + + if { $bars_count > 0 } { + #ns_log Notice "acc_fin::cobbler_html_view.470 catching dangling tail bar(s) bar_width $bar_width bars_count $bars_count" + set bar_width [f::max 1 [expr { round( $bar_width ) } ]] + # catch any dangling tail bars + set odd_p [expr { 1 + $j - int( ( $j + 1 ) / 2 ) * 2 } ] + set bar_list [list $bar_width $bar_height] + lappend comb_bar_curv_lol $bar_list + lappend batch_y_list $bar_height + set bar_height [f::max [f::lmin $batch_y_list] [expr { round([acc_fin::pretti_geom_avg_of_curve $comb_bar_curv_lol]) } ]] + append cob_html "
\"${xy_html}\"
" + } + append cob_html "
" + } + } + # end display html cobbler + } + + if { $error_p } { + set cob_html "" + } + return $cob_html +} + +ad_proc -public acc_fin::pretti_pie_filename { + table_id +} { + Returns a consistent pie filename for use with PRETTI tables. +} { + #ns_log Notice "acc_fin::pretti_pie_filename.521: table_id $table_id" + # pie chart + set pie_filename "pretti-dc-${table_id}-pie.png" + return $pie_filename +} + + +ad_proc -public acc_fin::pretti_cobbler_filename { + table_id +} { + Returns a consistent cobbler filename for use with PRETTI tables. +} { + #ns_log Notice "acc_fin::pretti_cobbler_filename.515: table_id $table_id" + # cobbler chart + set cob_filename "pretti-dc-${table_id}-cob.png" + return $cob_filename +} + +ad_proc -public acc_fin::file_sys_pathname { + {filename ""} + {webpath ""} + {instance_id ""} +} { + Returns a consistent full system pathname for use with static files such as images. If filename is not empty, includes filename in pathname. +} { + #ns_log Notice "acc_fin::file_sys_pathname.534: filename $filename webpath $webpath instance_id $instance_id" + if { $webpath eq "" } { + set webpath [acc_fin::file_web_pathname $instance_id] + } + set acsroot [acs_root_dir] + set fileroot [file join $acsroot "www"] + set sys_pathname "${fileroot}${webpath}" + if { $filename ne "" } { + append sys_pathname "/" + append sys_pathname $filename + } + return $sys_pathname +} + + +ad_proc -public acc_fin::file_web_pathname { + {instance_id ""} +} { + Returns a consistent web path for use with static files such as images. +} { + #ns_log Notice "acc_fin::file_web_pathname.554: instance_id $instance_id" + if { $instance_id eq "" } { + set instance_id [ad_conn package_id] + } + set pkg_url [apm_package_url_from_id $instance_id] + if { [string range $pkg_url 0 0] eq "/" } { + set pkg_url [string range $pkg_url 1 end] + } + set webpath [file join "/resources" $pkg_url] + return $webpath +} + + +ad_proc -public acc_fin::pie_file_create_from_table { + table_id + {user_id ""} + {instance_id ""} +} { + This is a wrapper for acc_fin::pie_file_create to conveniently pass data to scheduled proc add_fin::schedule_do. table_id is a qss_simple_table id. +} { + if { $instance_id eq "" } { + ns_log Warning "acc_fin::pie_file_create_from_table.566: No instance_id supplied." + set instance_id [ad_conn package_id] + } + if { $user_id eq "" } { + ns_log Warning "acc_fin::pie_file_create_from_table.570: No user_id supplied." + set user_id [ad_conn user_id] + } + set pie_filename [acc_fin::pretti_pie_filename $table_id] + set curve_lists [qss_table_read $table_id $instance_id $user_id] + set return_val [acc_fin::pie_file_create $pie_filename $curve_lists $instance_id] + return $return_val +} + +ad_proc -public acc_fin::pie_file_create { + pie_filename + curve_lists + {instance_id ""} + {maybe_x_list ""} + {maybe_y_list ""} + {x_max_min_px "100"} + {x_max_max_px "1000"} + {y_max_min_px "100"} + {y_max_max_px "1000"} + {color1 ""} + {color2 ""} +} { + returns filepathname or empty string if error. depends on graphicsmagick. Creates image if it doesn't exist. + resolution adjusts automatically to fit smallest slice for pixel range of x_max_* by y_max_* where x is angle theta, y is radius. + defaults: + x_max_min_px 100, x_max_max_px 1000, y_max_min_px 100, y_max_max_px 1000, color1 #999999, color2 #cccccc + If url is anything other than web or list, then a filesystem pathname is returned. + If web, the web url is returned. + If url is 'list', then a list of both filesystem-pathname and web-pathname are returned. +} { + set error_p 0 + + # set alternating colors + if { [regexp {[\#]?([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])} $color1 ] } { + set color_arr(1) "#$color1" + } else { + set color_arr(1) "#cccccc" + } + if { [regexp {[\#]?([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])} $color2 ] } { + set color_arr(1) "#$color2" + } else { + set color_arr(0) "#999999" + } + if { ![qf_is_natural_number $x_max_min_px] } { + set x_max_min_px 100 + } + if { ![qf_is_natural_number $x_max_max_px] } { + set x_max_max_px 1000 + } + if { ![qf_is_natural_number $y_max_min_px] } { + set y_max_min_px 100 + } + if { ![qf_is_natural_number $y_max_min_px] } { + set y_max_min_px 1000 + } + + + set name_list [acc_fin::chart_file_names $pie_filename $instance_id] + set pie_pathname [lindex $name_list 0] + set pie_path [file dirname $pie_pathname] + if { [file exists $pie_path] } { + if { ![file isdirectory $pie_path] } { + ns_log Warning "acc_fin::pie_file_create.480: unable to create filename, because '${pie_path}' is not a directory" + set error_p 1 + } + } else { + file mkdir -p $pie_path + } + + set pie_tmppathname [lindex $name_list 2] + set tempdir [file dirname $pie_tmppathname] + if { [file exists $tempdir] } { + if { ![file isdirectory $tempdir] } { + ns_log Warning "acc_fin::pie_file_create.508: unable to create filename, because '${tempdir}' is not a directory" + set error_p 1 + } + } else { + file mkdir -p $tempdir + } + + if { $error_p == 0 } { + set pie_webpathname [lindex $name_list 1] + + if { ![file exists $pie_pathname] } { + set success_p [acc_fin::table_data_stats ] + set error_p [expr { abs( $success_p - 1 ) } ] + + if { $error_p == 0 } { + # style pie (square pie) chart + # make chart as png image? + if { ![file exists $pie_pathname] } { + + set pi [expr { atan2( 0. , -1. ) } ] + set 2pi [expr { 2. * $pi } ] + # Create canvas image + # to create a solid red canvas image: + # gm convert -size 640x480 "xc:#f00" canvas.png + # from: www.graphicsmagick.org/FAQ.html + # Assume the same border for the farsides. It may be easier for a user to clip than to add margin. + # Image 0 point should be at twelve oclock. (subtract 90 from angle) + # split any angle over 180 degrees into two angles < 180. + # Try to provide image resolution at least one pixel per degree and/or 1% of range of y. + + # r_case1 is resolution along min size of (x) 1 pixel for min width + set r_case1 [f::max $x_max_min_px [f::min $x_max_max_px [expr { $x_sum / $2pi * $x_min } ]]] + # r_case2 is resolution along range of y. + set r_case2 [f::max $y_max_min_px [f::min $y_max_max_px [expr { $y_max - $y_min } ]]] + set r [f::max $r_case1 $r_case2 ] + set dim_px [expr { 2 * round( $r + .99 ) } ] + exec gm convert -size ${dim_px}x${dim_px} "xc:#ffffff" $pie_tmppathname + set x0 [expr { int( $r ) + 1 } ] + incr x0 + set y0 $x0 + # set theta_d degrees + # set theta_r radians + set theta_d2 -90. + set theta_r2 [expr { -1. * $pi / 2. } ] + set x2 $x0 + set y2 [expr { round( $y0 + $r ) } ] + set k1 [expr { 360. / $x_sum } ] + set k2 [expr { ( $y_max - $y_min ) } ] + set k3 [expr { $k2 * 2. } ] + set k4 [expr { $2pi / $x_sum } ] + set k5 [expr { $r / $y_max } ] + # convert rads to degs: + set k0 [expr { 360. / $2pi } ] + set maybe_x_list_len [llength $maybe_x_list] + for {set j 0} { $j < $maybe_x_list_len } {incr j } { + set odd_p [expr { 1 + $j - int( ( $j + 1 ) / 2 ) * 2 } ] + set x [lindex $maybe_x_list $j] + set y [lindex $maybe_y_list $j] + set arc_degs [expr { $k1 * $x } ] + set arc_rads [expr { $k4 * $x } ] + set ry [expr { $y * $k5 } ] + if { $arc_degs > 180. } { + set arc_rads [expr { $arc_rads / 2. } ] + set angle_list [list $arc_rads $arc_rads] + } else { + set angle_list [list $arc_rads ] + } + foreach angle $angle_list { + set theta_d1 $theta_d2 + set theta_r1 $theta_r2 + set theta_d2 [expr { $theta_d2 + $arc_rads * $k0 } ] + set theta_r2 [expr { $theta_r2 + $arc_rads } ] + set x1 [expr { round( $ry * cos( $theta_r1 ) + $x0 ) } ] + set y1 [expr { round( $ry * sin( $theta_r1 ) + $y0 ) } ] + set x2 [expr { round( $ry * cos( $theta_r2 ) + $x0 ) } ] + set y2 [expr { round( $ry * sin( $theta_r2 ) + $y0 ) } ] + exec gm convert -size ${dim_px}x${dim_px} -fill $color_arr($odd_p) -stroke $color_arr($odd_p) -draw "path 'M $x0 $y0 L $x1 $y1 L $x2 $y2 L $x0 $y0'" $pie_tmppathname $pie_tmppathname + exec gm convert -size ${dim_px}x${dim_px} -fill $color_arr($odd_p) -stroke $color_arr($odd_p) -draw "ellipse $x0,$y0 $ry,$ry ${theta_d1},${theta_d2}" $pie_tmppathname $pie_tmppathname + } + } + set y3 [expr { round( $y0 - $ry ) } ] + exec gm convert -size ${dim_px}x${dim_px} -strokewidth 1 -stroke $color_arr(0) -draw "path 'M $x0 $y0 L $x0 $y3'" $pie_tmppathname $pie_tmppathname + # move on busy servers can cause issues with OS file memory hooks. Use copy. + file copy $pie_tmppathname $pie_pathname + file delete $pie_tmppathname + } else { + ns_log Notice "acc_fin::pie_file_create.609 Filename already exists for ${pie_pathname}. exiting without processing or error." + } + } + } + } + if { $error_p } { + set return_val 0 + } else { + set return_val 1 + } + return $return_val +} + + +ad_proc -public acc_fin::pie_html_view { + pie_filename +} { + Returns image url if available, otherwise empty string. +} { + #ns_log Notice "acc_fin::pie_html_view.32: pie_filename $pie_filename" + set pie_html "" + # acc_fin::file_sys_pathname gets webpath, so let's get it here to save a double + # trip on a positive case + # get web pathname + set web_path [acc_fin::file_web_pathname] + + set filepathname [acc_fin::file_sys_pathname $pie_filename $web_path] + if { [file exists $filepathname ] } { + append web_path "/" + append web_path $pie_filename + set pie_html $web_path + } + return $pie_html +} + + +ad_proc -public acc_fin::gray_from_color { + hexcolor +} { + Converts an html color into it's grey with similar contrast. +} { + # add brightnesses + set error_p 0 + if { [string range $hexcolor 0 0] eq "#" } { + set hexcolor [string range $hexcolor 1 end] + } + set hex_list [split $hexcolor ""] + set dec_list [list ] + set hexnum_list [list 0 1 2 3 4 5 6 7 8 9 a b c d e f] + foreach hex_dig $hex_list { + lappend dec_list [lsearch -exact $hexnum_list $hex_dig] + } + set dec_sum 0 + set dec_list_len [llength $dec_list ] + if { $dec_list_len == 6 } { + foreach {exp1 exp0} $dec_list { + set dec_sum [expr { $dec_sum + $exp1 * 16 + $exp0 } ] + } + } elseif { $dec_list_len == 3 } { + foreach exp1 $dec_list { + set dec_sum [expr { $dec_sum + $exp1 * 16 } ] + } + } else { + # don't understand. Return average grey 3 * 127 + set dec_sum 381 + } + + set dec_avg [expr { round( $dec_sum / 3. ) }] + set dec1 [expr { int( $dec_avg / 16. ) } ] + set hex1 [lindex $hexnum_list $dec1 ] + set dec0 [expr { $dec_avg - $dec1 * 16 } ] + set hex0 [lindex $hexnum_list $dec0 ] + set hexgrey "${hex1}${hex0}${hex1}${hex0}${hex1}${hex0}" + + return $hexgrey +} Index: openacs-4/packages/accounts-finance/tcl/test/pretti-test-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/test/pretti-test-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/tcl/test/pretti-test-procs.tcl 14 Nov 2014 18:20:17 -0000 1.1 @@ -0,0 +1,536 @@ +ad_library { + Automated tests for accounts-finance + + @creation-date 2014-04-30 +} + +aa_register_case pert_OMP_curve_conversions { + Test acc_fin::pretti_geom_avg_of_curve proc +} { + + aa_run_with_teardown \ + -rollback \ + -test_code { +ns_log Notice "aa_register_case.14: Begin test" + + # Use examples from + # http://en.wikipedia.org/wiki/Program_Evaluation_and_Review_Technique + # Te = time_expected + set table_text [lindex [acc_fin::example_table p20a] 2] + set line_break "\n +" + set delimiter "," + set table_rows_list [split $table_text $line_break] + set x [expr { 1. / 6. } ] + # cut down the empty table_rows from table_rows_list (length of 17 s/b 7) + foreach table_row [lrange $table_rows_list 1 end] { + if { $table_row ne "" } { + set row_cells_list [split $table_row $delimiter] + set curve_lol [list [list y x label]] + set activity [lindex $row_cells_list 0] + set expected_time [lindex $row_cells_list 4] + regsub -all -- {[^0-9\.]} $expected_time {} expected_time + set expected_time_len [string length $expected_time] + set expected_decimals [string first "." $expected_time] + if { $expected_decimals eq -1 } { + set expected_decimals 0 + } else { + set expected_decimals [expr { $expected_time_len - ( $expected_decimals + 1 ) } ] + } + foreach y [lrange $row_cells_list 1 3] { + set row [list $y $x [ad_generate_random_string]] + lappend curve_lol $row + } + + # test making a curve based on min/med/max values + set optimistic [lindex $row_cells_list 1] + set opti_dec [string first "." $optimistic] + if { $opti_dec > -1 } { + set opt_dec_count [expr { [string length $optimistic] - $opti_dec - 1 } ] + } else { + set opt_dec_count 0 + } + set optimistic [expr { $optimistic + 0. } ] + + set median [lindex $row_cells_list 2] + set med_dec [string first "." $median] + if { $med_dec > -1 } { + set med_dec_count [expr { [string length $median] - $med_dec - 1 } ] + } else { + set med_dec_count 0 + } + set median [expr { [lindex $row_cells_list 2] + 0. } ] + + set pessimistic [lindex $row_cells_list 3] + set pes_dec [string first "." $pessimistic] + if { $pes_dec > -1 } { + set pes_dec_count [expr { [string length $pessimistic] - $pes_dec - 1 } ] + } else { + set pes_dec_count 0 + } + set pessimistic [expr { [lindex $row_cells_list 3] + 0. } ] + + # test Time expected geometric average + + set geo_avg [expr { ( $optimistic + 4. * $median + $pessimistic ) / 6. } ] + set geo_avg_fmt [qaf_round_to_decimals $geo_avg $expected_decimals] + aa_equals "Test1 for ${activity}: calced Te vs. pre-calced Te" $geo_avg_fmt $expected_time +# set n_points_list [list 3 5 9 16 18 24 51 127] + set n_points_list [list 18 24 51 127] +# set n_points_list [list 24 51 60] + set tolerance_list [list .01 .02 .05 .1 .2] + # set tolerance_list [list .01] + foreach n_points $n_points_list { + aa_log "testing OMP values to curve using acc_fin::pert_omp_to_normal_dc" + # confirm curve's representation at critical original parameters o,m,p: + set curve2_lol [acc_fin::pert_omp_to_normal_dc $optimistic $median $pessimistic $n_points] + ns_log Notice "accounts-finance/tcl/test/pretti-test-procs.tcl: curve2_lol $curve2_lol" + set optimistic2 [qaf_y_of_x_dist_curve 0 $curve2_lol 0] + set median2 [qaf_y_of_x_dist_curve .5 $curve2_lol 0] + set pessimistic2 [qaf_y_of_x_dist_curve 1 $curve2_lol 0] + set optimistic2 [qaf_round_to_decimals $optimistic2 $opt_dec_count] + set median2 [qaf_round_to_decimals $median2 $med_dec_count] + set pessimistic2 [qaf_round_to_decimals $pessimistic2 $pes_dec_count] + aa_equals "Test2N for '${activity}' w/ ${n_points}-point Normal curve matches @ optimistic" $optimistic2 $optimistic + aa_equals "Test3N for '${activity}' w/ ${n_points}-point Normal curve matches @ median" $median2 $median + aa_equals "Test4N for '${activity}' w/ ${n_points}-point Normal curve matches @ pessimistic" $pessimistic2 $pessimistic + # create a strict curve to test against. + set curve3_lol [acc_fin::pert_omp_to_strict_dc $optimistic $median $pessimistic] + set optimistic3 [qaf_y_of_x_dist_curve 0 $curve3_lol 0] + set median3 [qaf_y_of_x_dist_curve .5 $curve3_lol 0] + set pessimistic3 [qaf_y_of_x_dist_curve 1 $curve3_lol 0] + aa_equals "Test2S for '${activity}' w/ 3-point Strict curve matches @ optimistic" $optimistic3 $optimistic + aa_equals "Test3S for '${activity}' w/ 3-point Strict curve matches @ median" $median3 $median + aa_equals "Test4S for '${activity}' w/ 3-point Strict curve matches @ pessimistic" $pessimistic3 $pessimistic + + + aa_log "testing acc_fin::pretti_geom_avg_of_curve" + #set curv_geo_avg [acc_fin::pretti_geom_avg_of_curve $curve2_lol -1] + set curve_t_expected [expr { ( $optimistic2 + 4. * $median2 + $pessimistic2 ) / 6. } ] + set curv_avg_fmt [qaf_round_to_decimals $curve_t_expected $expected_decimals] + set test5_p [expr { $curv_avg_fmt >= $expected_time } ] + aa_true "Test5N for Te of ${activity} w/ ${n_points}-point normal curve ${curv_avg_fmt} not less than pre-calced Te ${expected_time}" $test5_p + + set curv_geo_avg2 [acc_fin::pretti_geom_avg_of_curve $curve3_lol] + set curv_avg_fmt2 [qaf_round_to_decimals $curv_geo_avg2 $expected_decimals] + aa_equals "Test5S for median of ${activity}'s Strict Curve matches pre-calced median" $curv_avg_fmt2 $expected_time + + foreach tolerance $tolerance_list { + set t_pct [expr { int( $tolerance * 100. ) } ] + set optimistic_p [expr { ( abs( $optimistic2 - $optimistic ) / $optimistic ) < $tolerance } ] + set median_p [expr { ( abs( $median2 - $median ) / $median ) < $tolerance } ] + set pessimistic_p [expr { ( abs( $pessimistic2 - $pessimistic ) / $pessimistic ) < $tolerance } ] + aa_true "Test6N for '${activity}' w/ ${n_points}-point normal curve within $t_pct % margin @optimistic" $optimistic_p + aa_true "Test7N for '${activity}' w/ ${n_points}-point normal curve within $t_pct % margin @median" $median_p + aa_true "Test8N for '${activity}' w/ ${n_points}-point normal curve within $t_pct % margin @pessimistic" $pessimistic_p + } + } + } + } + } +} + + +aa_register_case list_filter { + Test acc_fin::list_filter proc +} { + + aa_run_with_teardown \ + -rollback \ + -test_code { + set unfiltered_name_list [list ] + for { set i 1} { $i < 20} { incr i } { + set name [ad_generate_random_string] + lappend unfiltered_name_list $name + } + set filtered_name_list [acc_fin::list_filter alphanum $unfiltered_name_list] + set success_p 1 + set violations "" + set violations_list [list ] + foreach name $filtered_name_list { + + if { [regexp -nocase -- {[^0-9a-z,]} name violations] } { + set success_p 0 + lappend violations_list $violations + } + } + if { $success_p } { + aa_true "Test9 filtering gremlin characters in names." $success_p + } else { + aa_true "Test9 filtering gremlin characters in names. Fail for '${violations_list}'" $success_p + } + } +} + +aa_register_case larr_set { + Test acc_fin::larr_set proc +} { + + aa_run_with_teardown \ + -rollback \ + -test_code { + set unsorted_name_list [list ] + set unique_counter 0 + set larr_max 0 + set jcount [string range [clock clicks -microseconds] end end] + incr jcount + for { set j 0} { $j < $jcount } { incr j } { + set val [string range [clock clicks -microseconds] end end] + set larr_counter [acc_fin::larr_set test_arr $val] + set larr_max [f::max $larr_counter $larr_max] + if { [info exists count_arr($val)] } { + # do nothing, larr_counter already counted + incr count_arr($val) + } else { + set count_arr($val) 1 + incr unique_counter + } + lappend unsorted_name_list $val + } + set sorted_name_list [lsort -unique $unsorted_name_list] + # compare count_arr index count with test_arr index count (s/b same) and identical to llength $sorted_name_list + set sorted_uniques_count [llength $sorted_name_list] + # larr_counter includes 0 in count + incr larr_max + set success_p [expr { $sorted_uniques_count eq $larr_max && $larr_max eq $unique_counter } ] + + aa_true "Test acc_fin::larr_set sorted_uniques ${sorted_uniques_count} larr ${larr_max} uniques ${unique_counter}" $success_p + } +} + +aa_register_case curve_import { + Test acc_fin::curve_import proc +} { + + aa_run_with_teardown \ + -rollback \ + -test_code { + # case + # 1. If a curve exists in c_x_list, c_y_list (, c_label_list), use it. + set c_x_list [list ] + set c_y_list [list ] + set c_label_list [list ] + set curve_lists [list ] + + set dot_count [expr { int( [random] * ( 10 - 1 + .99 ) ) + 1 } ] + set 1or2 [expr { int( [random] * ( 2 - 1 + .5 ) ) + 1 } ] + for {set i 0} { $i < $dot_count} {incr i} { + foreach col_list [lrange [list x y label] 0 $1or2] { + switch -exact $col_list { + x { + # a random amount, assume hours for a task for example + lappend c_x_list [expr { int( [random] * 256. + 5. ) / 6. } ] + } + y { + # these could be usd or btc for example + lappend c_y_list [expr { int( [random] * 30000. + 90. ) / 100. } ] + } + label { + lappend c_label_list [ad_generate_random_string] + } + } + } + } + + set minimum [expr { int( [random] * 256. + 5. ) / 6. } ] + set median [expr { int( [random] * 512. + 5. ) / 6. + 256. } ] + set maximum [expr { int( [random] * 1024. + 5. ) / 6. + 1024 } ] + set x_len [llength $c_x_list] + if { $c_label_list eq "" } { + set titles [list x y] + set expected [list $titles] + for {set i 0} {$i < $x_len} {incr i} { + set row [list [lindex $c_x_list $i] [lindex $c_y_list $i]] + lappend expected $row + } + } else { + set titles [list x y label] + set expected [list $titles] + for {set i 0} {$i < $x_len} {incr i} { + set row [list [lindex $c_x_list $i] [lindex $c_y_list $i] [lindex $c_label_list $i]] + lappend expected $row + } + } + set default_lists $expected + set curve_lists $expected + + set test1 [acc_fin::curve_import $c_x_list $c_y_list $c_label_list $curve_lists $minimum $median $maximum $default_lists] + set affirm_p [qss_tables_are_equiv_p $test1 $expected] + if { $affirm_p } { + aa_true "Case 1" $affirm_p + } else { + aa_true "Case 1" $affirm_p + aa_log "Case 1 \n $test1 \n != $expected \n" + } + # 2. If a curve exists in curve_lists where each element is a list of x,y(,label), use it. + set c_x_list [list ] + set c_y_list [list ] + set c_label_list [list ] + + set test2 [acc_fin::curve_import $c_x_list $c_y_list $c_label_list $curve_lists $minimum $median $maximum $default_lists] + set affirm_p [qss_tables_are_equiv_p $test2 $curve_lists] + if { $affirm_p } { + aa_true "Case 2" $affirm_p + } else { + aa_true "Case 2" $affirm_p + aa_log "Case 2 \n $test2 \n != $curve_lists \n" + } + # 3. If a minimum, median, and maximum is available, make a curve of it. + set curve_lists [list ] + set test3 [acc_fin::curve_import $c_x_list $c_y_list $c_label_list $curve_lists $minimum $median $maximum $default_lists] + set c_lists [acc_fin::pert_omp_to_normal_dc $minimum $median $maximum ] + set affirm_p [qss_tables_are_equiv_p $test3 $c_lists] + if { $affirm_p } { + aa_true "Case 3" $affirm_p + } else { + aa_true "Case 3" $affirm_p + aa_log "Case 3 \n $test3 \n != $c_lists \n" + } + + # 4. if a median value is available, make a curve of it + set minimum "" + set maximum "" + set test4 [acc_fin::curve_import $c_x_list $c_y_list $c_label_list $curve_lists $minimum $median $maximum $default_lists] + set med_label "med" + if { $minimum eq "" } { + set minimum $median + set min_label $med_label + } else { + set min_label "min" + } + if { $maximum eq "" } { + set maximum $median + set max_label $med_label + } else { + set max_label "max" + } + set c_lists [acc_fin::pert_omp_to_normal_dc $minimum $median $maximum ] + set affirm_p [qss_tables_are_equiv_p $test4 $c_lists] + if { $affirm_p } { + aa_true "Case 4" $affirm_p + } else { + aa_true "Case 4" $affirm_p + aa_log "Case 4 \n $test4 \n != $c_lists \n" + } + + # 5. if an ordered list of lists x,y,label exists, use it as a fallback default, otherwise + set median "" + set test5 [acc_fin::curve_import $c_x_list $c_y_list $c_label_list $curve_lists $minimum $median $maximum $default_lists] + set affirm_p [qss_tables_are_equiv_p $test5 $default_lists] + if { $affirm_p } { + aa_true "Case 5" $affirm_p + } else { + aa_true "Case 5" $affirm_p + aa_log "Case 5 \n $test5 \n != $default_lists \n" + } + + # 6. return a representation of a normalized curve as a list of lists similar to curve_lists + set default_lists [list ] + set test6 [acc_fin::curve_import $c_x_list $c_y_list $c_label_list $curve_lists $minimum $median $maximum $default_lists] + set minimum 0.5 + set median 1. + set maximum 2. + set tc_larr(y) [list y $minimum $median $median $median $median $maximum] + # using approximate cumulative distribution y values for standard deviation of 1. + set portion [expr { 1. / 6. } ] + set tc_larr(x) [list x $portion $portion $portion $portion $portion $portion ] + set tc_larr(label) [list label "outlier" "standard deviation 2" "standard deviation 1" "standard deviation 1" "standard deviation 2" "outlier" ] + set c_lists [list ] + for {set i 0} {$i < 7} {incr i} { + lappend c_lists [list [lindex $tc_larr(x) $i] [lindex $tc_larr(y) $i] [lindex $tc_larr(label) $i]] + } + + set affirm_p [qss_tables_are_equiv_p $test6 $c_lists] + if { $affirm_p } { + aa_true "Case 6" $affirm_p + } else { + aa_true "Case 6" $affirm_p + aa_log "Case 6 \n $test6 \n != $c_lists \n" + } + + } +} + + +aa_register_case scenario_prettify_test1 { + Test acc_fin::scenario_prettify proc +} { + + aa_run_with_teardown \ + -rollback \ + -test_code { + # scenario_prettify requires: + # p1 scenario table + # p2 activity table + # optional: + # p3 activity_type table + # dc distribution curves + + # p1 data refers to p2 table. Create p2 table before p1. + # p2 data refers to dc or p3 tables. Create dc or p3 tables before p2. + # all above is handled in acc_fin::pretti_example_maker + set scenario_tid [acc_fin::pretti_example_maker ] + acc_fin::scenario_prettify $scenario_tid + + + + #set date [dt_ansi_to_julian_single_arg "2003-01-01 01:01:01"] + #aa_equals "Returns correct julian date" $date "2452641" + + } +} + +aa_register_case pretti_curve_tc_multiply { + Test acc_fin::pretti_curve_time_multiply and acc_fin::pretti_curve_cost_multiply proc +} { + + aa_run_with_teardown \ + -rollback \ + -test_code { + + # To test these procs, a single point curve is passed to test all cases. + + # The tested procedures determine the longest run within constraints based on equations. + + # To test, this procedure checks all cases from coefficient to 1 to see + # which parameters are the best fit, then checks values against values + # returned from the tested procs. + + # set defaults + set activity "pretti_curve_tc_multiply" + set user_id 0 + set instance_id [ad_conn package_id] + set scenario_id 0 + set base_curve_lol [list ] + lappend base_curve_lol [list x y] + set tcurvenum "" + set ccurvenum "" + set use_t_run_p 1 + + # Instead of random, to consider all cases, a combination of distributed numbers are used. + # For simplicity, the combinations are run through a base_n number count. + set base_n 5 + set combo_set_count 4 + set permutations_count [expr { pow( $base_n , $combo_set_count ) } ] + set permutations_length [acc_fin::base $base_n $permutations_count] + set i 0 + set random_list [list ] + for {set ii 0} { $ii < $base_n } { incr ii } { + set random_arr($ii) [qaf_round_to_decimals [random] 3] + } + set zeros [string range "000000000000000" 1 $combo_set_count] + while { $i < $permutations_count } { + + set i_n $zeros + set i_n2 [acc_fin::base $base_n $i] + append i_n $i_n2 + ns_log Notice "accounts-finance/tcl/test/pretti-test-procs.tcl.425: ********* loop i $i i_n2 $i_n2" + set offset [expr { $combo_set_count - 1 } ] + set i0 [string range $i_n end-$offset end] + set i_list [split $i0 ""] + #ns_log Notice "accounts-finance/tcl/test/pretti-test-procs.tcl.429: i0 $i0 i_list '$i_list'" + lassign $i_list ri(1) ri(2) ri(3) ri(4) ri(5) + #ns_log Notice "accounts-finance/tcl/test/pretti-test-procs.tcl.430: ri(1) $ri(1) ri(2) $ri(2) ri(3) $ri(3) ri(4) $ri(4) ri(5) $ri(5) ri(6) $ri(6) ri(7) $ri(7) ri(8) $ri(8)" + #ns_log Notice "accounts-finance/tcl/test/pretti-test-procs.tcl.431: i_list '$i_list'" + for {set ii 1} {$ii <= $combo_set_count} {incr ii} { + set r($ii) $random_arr($ri($ii)) + #ns_log Notice "accounts-finance/tcl/test/pretti-test-procs.tcl.436: r($ii) $r($ii) ri($ii) $ri($ii) random_arr(ri($ii)) $random_arr($ri($ii))" + } + set coefficient [expr { ceil( $r(1) * 1024 ) } ] + set y_time [qaf_round_to_decimals [expr { $r(2) * 100. + .0125 } ] 5] + # Set the constraints: + set max_overlap_pct $r(1) + set max_concurrent [expr { ceil( $coefficient * $r(2) * 1.1 + .001 ) } ] + set max_run_time [expr { $y_time * $coefficient * $r(3) * 1.1 } ] + set max_tasks_per_run [expr { ceil( $coefficient * $r(4) * 1.1 ) } ] + set max_discount_pct $r(2) + # using r(3) in y_cost to save in combinations. + set y_cost [qaf_round_to_decimals [expr { $r(3) * 10000. } ] 3] + + # initializations. assume no constraints + set t_test_curve_lol $base_curve_lol + set row [list 1 $y_time] + lappend t_test_curve_lol $row + set c_test_curve_lol $base_curve_lol + set row [list 1 $y_cost] + lappend c_test_curve_lol $row + #ns_log Notice "acc_fin::pretti_curve_time_multiply.455: y_cost $y_cost c_test_curve_lol $c_test_curve_lol t_test_curve_lol $t_test_curve_lol" + + # if max_concurrent is unlimited, then 1 tasks_per_run + set tasks_per_run 1 + set run_count 1 + + # if max_concurrent were 1, then tasks_per_run would be $coefficient + + # block_count is coefficient constrained by max_concurrent + set block_count [expr { round( ceil( $coefficient / $max_concurrent ) + 0. ) } ] + + set max_dedicated_pct [expr { 1. - $max_overlap_pct } ] + set max_batch_rate_pct [expr { 1. - $max_discount_pct } ] + + # multiple activity length + set test_run_count 1 + set test_tasks_per_run $block_count + set test_coef [expr { 1. * $test_tasks_per_run * $max_dedicated_pct + $max_overlap_pct } ] + set test_time [expr { $test_coef * $y_time } ] + set limited_p 0 + # What are run_count and tasks_per_run, and subsequently y_new using brute force testing? + while { ( $test_coef > $max_tasks_per_run || $test_time > $max_run_time) && $test_tasks_per_run > 1 } { + incr test_tasks_per_run -1 + set limited_p 1 + set test_coef [expr { 1. * $test_tasks_per_run * $max_dedicated_pct + $max_overlap_pct } ] + set test_run_count [expr { ceil( $block_count / ( $test_tasks_per_run + 0. ) ) } ] + set test_time [expr { $test_coef * $y_time } ] + } + set test_time_runs [expr { $test_time * $test_run_count } ] + + # set t and test_time_runs_fmtd to same decimals as y_time + set tdecimals 0 + set tdecimal_idx [string first "." $y_time] + if { $tdecimal_idx > -1 } { + set tdecimals [expr { [string length $y_time] - $tdecimal_idx - 1 } ] + } + + + set test_cost [expr { $test_run_count * $y_cost * ( 1. * ( $test_tasks_per_run + 0. ) * $max_batch_rate_pct + $max_discount_pct ) } ] + + # set c and test_cost to same decimals as y_cost + set cdecimals 0 + set cdecimal_idx [string first "." $y_cost] + if { $cdecimal_idx > -1 } { + set cdecimals [expr { [string length $y_cost] - $cdecimal_idx - 1 } ] + } + # test brute force against procs + # setup procs with preliminary environmental variables + set use_t_run_p 0 + set t_constrained_by_time_p 0 + set tcurve_lol [acc_fin::pretti_curve_time_multiply $t_test_curve_lol "" $coefficient $scenario_id $user_id $instance_id ] + set y_idx [lsearch -exact [lindex $tcurve_lol 0] "y"] + set t [qaf_round_to_decimals [lindex [lindex $tcurve_lol 1] $y_idx] $tdecimals] + set test_time_runs_fmtd [qaf_round_to_decimals $test_time_runs $tdecimals] + + set ccurve_lol [acc_fin::pretti_curve_cost_multiply $c_test_curve_lol "" $coefficient $scenario_id $user_id $instance_id ] + set y_idx [lsearch -exact [lindex $ccurve_lol 0] "y"] + set c [qaf_round_to_decimals [lindex [lindex $ccurve_lol 1] $y_idx] $cdecimals] + set test_cost_fmtd [qaf_round_to_decimals $test_cost $cdecimals] + # check against proc + if { ![aa_equals "Test $i for T with coef ${coefficient} limited_p $limited_p test_tasks_per_run ${test_tasks_per_run} test_time_runs_fmtd ${test_time_runs_fmtd} t $t" $t $test_time_runs_fmtd] } { + # log all the parameters.. + aa_log "y_time $y_time max_overlap_pct ${max_overlap_pct} max_concurrent ${max_concurrent} max_run_time ${max_run_time} max_tasks_per_run ${max_tasks_per_run}" + aa_log "caclulated: block_count ${block_count} max_dedicated_pct ${max_dedicated_pct} test_coef ${test_coef} test_run_count ${test_run_count}" + + } + if { ![aa_equals "Test $i for C with coef ${coefficient} limited_p $limited_p test_tasks_per_run ${test_tasks_per_run} test_cost_fmtd ${test_cost_fmtd} c $c" $c $test_cost_fmtd] } { + # log all the parameters.. + aa_log "max_overlap_pct ${max_overlap_pct} max_concurrent ${max_concurrent} max_run_time ${max_run_time} max_tasks_per_run ${max_tasks_per_run}" + aa_log "y_cost $y_cost max_discount_pct ${max_discount_pct}" + aa_log "caclulated: block_count ${block_count} max_dedicated_pct ${max_dedicated_pct} test_coef ${test_coef} test_run_count ${test_run_count}" + aa_log "use_t_run_p ${use_t_run_p} t_constrained_by_time_p ${t_constrained_by_time_p}" + + + } + incr i + } + } +} + Index: openacs-4/packages/accounts-finance/www/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/index.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/index.adp 14 Nov 2014 18:20:18 -0000 1.1 @@ -0,0 +1,18 @@ + +@title;noquote@ +@context;noquote@ + +

Demo Apps

+ Index: openacs-4/packages/accounts-finance/www/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/index.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/index.tcl 14 Nov 2014 18:20:18 -0000 1.1 @@ -0,0 +1,12 @@ +ad_page_contract { + accounts-finance home page + @creation-date 2014-09-28 +} { +} + +set title "Accounts Finance" +set context [list $title] +set user_id [ad_conn user_id] +set instance_id [ad_conn package_id] +set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + Index: openacs-4/packages/accounts-finance/www/admin/affiliate.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/admin/affiliate.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/admin/affiliate.adp 14 Nov 2014 18:20:18 -0000 1.1 @@ -0,0 +1,195 @@ + + @title;noquote@ + @context;noquote@ +

@title@

+ +@menu_html;noquote@ + + + +
    +@user_message_html;noquote@ +
+
+ + + +@form_html;noquote@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
commissions_eq1 = trangular equation distribution, largest first. 2 = harmonic equation, largest first. 3 = geometric tuned equation of the trianglular distribution biased to sales revenue for each affiliate. +
growth_curve_eq0 = ignore. 1 = Logistic curve, 2 = Positive Sign curve. +These equations are set to take intervals anywhere between 0 to 12 inclusive. Fractional decimals are fine. +For the Logistic curve, the target_revenue is reached at about 12. +For the Positive Sign curve, target_revenue is reached at interval 6 and decreases to 0% at 12 --useful to test extreme negative growth scenarios. +
interpolate_last_band_pSet this to 1 to have the largest sale tier iterpolated. (default = 0) +This is useful for modeling infrequent, large sales volumes with varying, significant quantities.
interval_countNumber of intervals iterated.
interval_sizeadded to period_start for each interval
interval_startThe value for the first period's interval
pct_pooledthe commission from total revenue (as a decimal percentage)
period_unitThe unit that represents each period.
revenue_targetthe target amount of sales. The total revenue for each period is one sale above target.
sale_maxthe maximum value of a single sale.
sales_curve_nameName of sales curve to use. Name must be unique
sales_curve_tidTable ID of sales_curve to use.
sample_ratePercentage of rows per period to be sampled. (The percent is represented as decimal: 100% = 1).
+
+@initial_conditions_html;noquote@ +
+ + +@sales_curve_html;noquote@ + + + +
    +@compute_message_html;noquote@ +
+
+ + +@computation_report_html;noquote@ + + + +@table_stats_html;noquote@ + + + Index: openacs-4/packages/accounts-finance/www/admin/affiliate.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/admin/affiliate.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/admin/affiliate.tcl 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,1121 @@ +# generic header for static .adp pages + +set title "Affiliate program" +set context [list $title] + +set package_id [ad_conn package_id] +set user_id [ad_conn user_id] +set write_p [permission::permission_p -party_id $user_id -object_id $package_id -privilege write] +set admin_p [permission::permission_p -party_id $user_id -object_id $package_id -privilege admin] +set delete_p [permission::permission_p -party_id $user_id -object_id $package_id -privilege delete] +# randmize rand with seed from clock +expr { srand([clock clicks]) } + +# affiliate program based on Triangular numbers +# see http://en.wikipedia.org/wiki/Triangular_number +# context: One one context for this app +# table_id product_sales_curve or +# table_id initial_conditions: +# growth_curve_eq_ref +# interval_start +# units_per_period s/b period_unitunit +# iterations_count + +# input default values +# data (title,price, pct of total sales) +# price must be listed in lowest to highest +# last sale is a threashold of a range to 100% that gets interpolated up to $sale_max +# sale (as a percentage of total sale) for each sale amount measured +# These values must be in 1:1 coorespondence with sales list + +# to make it real easy, we are creating a text table to fill a list_of_lists +# and thus to replaces the list equivalents: +# price_list +# sales_pct_list +# product_label_list + +# now becomes: + +# revenue_curve_list_of_lists +# row1 {price sales_pct label} +# row2 .. +# price_list [list 1 5 10 20]\ +# sales_pct_list [list 12.5 50. 25. 12.5]\ + + +# case_id "" = initial_conditions_tid + sales_curve_tid +# period_size "" ; in units +# interval_start "" +# iterations_count "" +# action --> mode +# context + +# tid = table_id + +#### kill this app if user is not admin. It is not demo ready +if { !$admin_p } { + ad_script_abort +} + +array set input_array [list \ + sales_curve_tid ""\ + initial_conditions_tid ""\ + revenue_target 22222.\ + sale_max 10000.\ + initial_conditions_lists [list [list sale_max 10000] [list revenue_target 100000] [list pct_pooled .10] [list interpolate_last_band_p 0] [list growth_curve_eq 1] [list commissions_eq 1] [list interval_start 1] [list interval_size 3] [list interval_count 4] [list sales_curve_name ""] [list sales_curve_tid ""]]\ + initial_conditions_text ""\ + sales_curve_lists [list [list 1 .125 bar1] [list 5 .5 bar2] [list 10 .25 bar3] [list 20 .125 bar4]]\ + sales_curve_text ""\ + sample_rate 1\ + period_unit period\ + pct_pooled 1.\ + commissions_eq 1\ + interpolate_last_band_p 0\ + ic_name ""\ + ic_title ""\ + ic_comments ""\ + ic_template_id ""\ + ic_flags ""\ + sc_name ""\ + sc_title ""\ + sc_comments ""\ + sc_template_id ""\ + sc_flags ""\ + submit "" \ + reset "" \ + mode "p" \ + next_mode "p" \ + ] + +array set title_array [list \ + submit "Submit" \ + reset "Reset" \ + ] + +set user_message_list [list ] +set sales_curve_default [qss_lists_to_text $input_array(sales_curve_lists)] +set initial_conditions_default [qss_lists_to_text $input_array(initial_conditions_lists)] + +# get previous form inputs if they exist +set form_posted [qf_get_inputs_as_array input_array] +set mode $input_array(mode) +set next_mode $input_array(next_mode) + +if { $form_posted } { + if { [info exists input_array(x) ] } { + unset input_array(x) + } + if { [info exists input_array(y) ] } { + unset input_array(y) + } + + set sales_curve_tid $input_array(sales_curve_tid) + set initial_conditions_tid $input_array(initial_conditions_tid) + set initial_conditions_lists $input_array(initial_conditions_lists) + set sales_curve_lists $input_array(sales_curve_lists) + set ic_template_id $input_array(ic_template_id) + set ic_flags $input_array(ic_flags) + set sc_template_id $input_array(sc_template_id) + set sc_flags $input_array(sc_flags) + # validate input + # cleanse, validate mode + # determine input completeness + # form has modal inputs, so validation is a matter of cleansing data and verifying references + set validated 0 + + switch -exact -- $mode { + e { + ns_log Notice "app-model.tcl validated for e" + set validated 1 + if { ![qf_is_natural_number $initial_conditions_tid] && ![qf_is_natural_number $sales_curve_tid] } { + set mode "n" + set next_mode "" + } + } + d { + ns_log Notice "app-model.tcl validated for d" + set validated 1 + if { ( ![qf_is_natural_number $initial_conditions_tid] && ![qf_is_natural_number $sales_curve_tid] ) || !$delete_p } { + set mode "p" + set next_mode "" + } + } + t { + ns_log Notice "app-model.tcl validated for t" + set validated 1 + if { ![qf_is_natural_number $initial_conditions_tid] && ![qf_is_natural_number $sales_curve_tid] } { + set mode "p" + set next_mode "" + } + } + c { + ns_log Notice "app-model.tcl validated for c" + set validated 1 + if { ![qf_is_natural_number $initial_conditions_tid] } { + lappend user_message_list "Table for Initial Conditions has not been specified." + set validated 0 + set mode "p" + set next_mode "" + } + if { ![qf_is_natural_number $sales_curve_tid] } { + lappend user_message_list "Table for Sales Curve has not been specified." + set validated 0 + set mode "p" + set next_mode "" + } + set interpolate_last_band_p $input_array(interpolate_last_band_p) + set sample_rate $input_array(sample_rate) + set period_unit $input_array(period_unit) + set commissions_eq $input_array(commissions_eq) + } + w { + set initial_conditions_text $input_array(initial_conditions_text) + set sales_curve_text $input_array(sales_curve_text) + set validated 1 + ns_log Notice "app-model.tcl validated for w" + } + n { + set validated 1 + ns_log Notice "app-model.tcl validated for n" + } + r { + set validated 1 + ns_log Notice "app-model.tcl validated for r" + } + default { + ns_log Notice "app-model.tcl validated for v" + if { [qf_is_natural_number $initial_conditions_tid] || [qf_is_natural_number $sales_curve_tid] } { + set validated 1 + set mode "v" + } else { + set mode "p" + set next_mode "" + } + } + + } + # end switch + + if { $validated } { + # execute validated input + + if { $mode eq "w" } { + # write the data + # a different user_id makes new context based on current context, otherwise modifies same context + # or create a new context if no context provided. + # given: + # ic_* is initial_conditions_ + # sc_* is sales_curve_ + if { [string length $initial_conditions_text] > 0 && $initial_conditions_text ne $initial_conditions_default } { + # ic_name Table Name + + if { $input_array(ic_name) eq "" && $initial_conditions_tid eq "" } { + set ic_name "ic[clock format [clock seconds] -format %Y%m%d-%X]" + } elseif { $input_array(ic_name) eq "" } { + set ic_name "initCon${initial_conditions_tid}" + } else { + set ic_name $input_array(ic_name) + } + # ic_title Table title + if { $input_array(ic_title) eq "" && $initial_conditions_tid eq "" } { + set ic_title "Initial conditions [clock format [clock seconds] -format %Y%m%d-%X]" + } elseif { $input_array(ic_title) eq "" } { + set ic_title "Initial conditions ${initial_conditions_tid}" + } else { + set ic_title $input_array(ic_title) + } + ns_log Notice "app-model.tcl ic_name '${ic_name}' [string length $ic_name]" + # ic_comments Comments + set ic_comments $input_array(ic_comments) + # initial_conditions_text + + # convert tables from _text to _list + set line_break "\n" + set delimiter "," + # linebreak_char delimiter rows_count columns_count + set ic_text_stats [qss_txt_table_stats $initial_conditions_text] + ns_log Notice "app-model.tcl: ic_text_stats $ic_text_stats" + set line_break [lindex $ic_text_stats 0] + set delimiter [lindex $ic_text_stats 1] + ns_log Notice "app-model.tcl: initial_conditions_text ${initial_conditions_text}" + set ic_lists [qss_txt_to_tcl_list_of_lists $initial_conditions_text $line_break $delimiter] + ns_log Notice "app-model.tcl: set ic_lists ${ic_lists}" + # cleanup input + set ic_lists_new [list ] + foreach condition_list $ic_lists { + set row_new [list ] + foreach cell $condition_list { + set cell_new [string trim $cell] + regsub -all -- {[ ][ ]*} $cell_new { } cell_new + lappend row_new $cell_new + #ns_log Notice "app-model.tcl new cell '$cell_new'" + } + if { [llength $row_new] > 0 } { + lappend ic_lists_new $row_new + } + } + set ic_lists $ic_lists_new + ns_log Notice "app-model.tcl: create/write table" + ns_log Notice "app-model.tcl: llength ic_lists [llength $ic_lists]" + if { [qf_is_natural_number $initial_conditions_tid] } { + set table_stats [qss_table_stats $initial_conditions_tid] + set name_old [lindex $table_stats 0] + set title_old [lindex $table_stats 1] + if { $name_old eq $ic_name && $title_old eq $ic_title } { + ns_log Notice "app-model.tcl: qss_table_write table_id ${initial_conditions_tid}" + qss_table_write $ic_lists $ic_name $ic_title $ic_comments $initial_conditions_tid $ic_template_id $ic_flags $package_id $user_id + } else { + # changed name. assume this is a new table + ns_log Notice "app-model.tcl: qss_table_create new table initial_conditions because name/title changed" + qss_table_create $ic_lists $ic_name $ic_title $ic_comments $ic_template_id $ic_flags $package_id $user_id + + } + } else { + ns_log Notice "app-model.tcl: qss_table_create new table initial_conditions" + qss_table_create $ic_lists $ic_name $ic_title $ic_comments $ic_template_id $ic_flags $package_id $user_id + } + + } + if { [string length $sales_curve_text] > 0 && $sales_curve_text ne $sales_curve_default } { + # sc_name Table Name + if { $input_array(sc_name) eq "" && $sales_curve_tid eq "" } { + set sc_name "sc[clock format [clock seconds] -format %Y%m%d-%X]" + } elseif { $input_array(sc_name) eq "" } { + set sc_name "Sales Curve ${sales_curve_tid}" + } else { + set sc_name $input_array(sc_name) + } + ns_log Notice "app-model.tcl sc_name '${sc_name}' [string length $sc_name]" + # sc_title Table title + if { $input_array(sc_title) eq "" && $initial_conditions_tid eq "" } { + set sc_title "Sales Curve [clock format [clock seconds] -format %Y%m%d-%X]" + } elseif { $input_array(sc_title) eq "" } { + set sc_title "Sales Curve ${sales_curve_tid}" + } else { + set sc_title $input_array(sc_title) + } + # sc_comments Comments + set sc_comments $input_array(sc_comments) + # sales_curve_text + + # convert tables from _text to _list + set line_break "\n" + set delimiter "," + # linebreak_char delimiter rows_count columns_count + set sc_text_stats [qss_txt_table_stats $sales_curve_text] + set line_break [lindex $sc_text_stats 0] + ns_log Notice "app-model.tcl: sales_curve_text ${sales_curve_text}" + set sc_lists [qss_txt_to_tcl_list_of_lists $sales_curve_text $line_break $delimiter] + ns_log Notice "app-model.tcl: set sc_lists ${sc_lists}" + # cleanup input + set sc_lists_new [list ] + foreach curve_list $sc_lists { + set row_new [list ] + foreach cell $curve_list { + set cell_new [string trim $cell] + regsub -all -- {[ ][ ]*} $cell_new { } cell_new + lappend row_new $cell_new + } + if { [llength $row_new] > 0 } { + lappend sc_lists_new $row_new + } + } + set sc_lists $sc_lists_new + + set sales_pct_list [list ] + foreach curve_list $sc_lists { + # area under curve aka probability is second item in list + lappend sales_pct_list [lindex $curve_list 1] + } + + # normalize sales_pct_list curve. Total should equal 1. (100%) + set rcp_total 0. + set curve_error 0 + foreach sales_pct $sales_pct_list { + # sales_pct must be a number + if { [ad_var_type_check_number_p $sales_pct] } { + set rcp_total [expr { $rcp_total + $sales_pct } ] + } else { + set curve_error 1 + } + } + if { $rcp_total > 0 } { + set adj_factor [expr { 1. / $rcp_total } ] + + if { $adj_factor != 1. } { + # edit the probability values + set new_rcp_list [list ] + foreach sales_pct $sales_pct_list { + if { [ad_var_type_check_number_p $sales_pct] } { + set sales_pct_adj [expr { $adj_factor * $sales_pct } ] + lappend new_rcp_list $sales_pct_adj + } else { + lappend "${sales_pct} (ignored)" + set curve_error 1 + } + } + set sales_pct_list $new_rcp_list + # now we need to add them back into sc_lists + set sc_lists_new [list ] + set row_nbr 0 + foreach curve_list $sc_lists { + set row_new [lreplace $curve_list 1 1 [lindex $sales_pct_list $row_nbr]] + lappend sc_lists_new $row_new + incr row_nbr + } + set sc_lists $sc_lists_new + ns_log Notice "app-model.tcl: adjust probability value sum to 1: results" + ns_log Notice "app-model.tcl: set sc_lists ${sc_lists}" + } + # sort $price_list (and the cooresponding lists). + if { !$curve_error } { + set sc_lists [lsort -index 0 -real $sc_lists] + } + } else { + ns_log Notice "app-model.tcl: sales_curve $sales_curve_tid cannot be normalized." + lappend user_message_list "Unable to normalize Sales Curve. Saved as is." + } + ns_log Notice "app-model.tcl: sorted sc_lists. Results:" + ns_log Notice "app-model.tcl: set sc_lists ${sc_lists}" + + ns_log Notice "app-model.tcl: create/write table" + ns_log Notice "app-model.tcl: length sc_lists [llength $sc_lists]" + + + if { [qf_is_natural_number $sales_curve_tid] } { + set table_stats [qss_table_stats $sales_curve_tid] + set name_old [lindex $table_stats 0] + set title_old [lindex $table_stats 1] + if { $name_old eq $sc_name && $title_old eq $sc_title } { + ns_log Notice "app-model.tcl: qss_table_write table_id ${sales_curve_tid}" + qss_table_write $sc_lists $sc_name $sc_title $sc_comments $sales_curve_tid $sc_template_id $sc_flags $package_id $user_id + } else { + # changed name. assume this is a new table + ns_log Notice "app-model.tcl: qss_table_create new table sales_curve" + qss_table_create $sc_lists $sc_name $sc_title $sc_comments $sc_template_id $sc_flags $package_id $user_id + } + } else { + ns_log Notice "app-model.tcl: qss_table_create new table sales_curve" + qss_table_create $sc_lists $sc_name $sc_title $sc_comments $sc_template_id $sc_flags $package_id $user_id + } + } + + set mode $next_mode + set next_mode "" + } + if { $mode eq "d" } { + # delete.... removes context + ns_log Notice "app-model.tcl mode = delete" + #requires initial_conditions_tid or sales_curve_tid + # delete initial_conditions_tid or sales_curve_tid or both, if both supplied + if { [qf_is_natural_number $sales_curve_tid] } { + qss_table_delete $sales_curve_tid + } + if { [qf_is_natural_number $initial_conditions_tid] } { + qss_table_delete $initial_conditions_tid + } + set mode $next_mode + set next_mode "" + } + if { $mode eq "t" } { + # trash + ns_log Notice "app-model.tcl mode = trash" + #requires initial_conditions_tid or sales_curve_tid + # delete initial_conditions_tid or sales_curve_tid or both, if both supplied + if { [qf_is_natural_number $sales_curve_tid] && $write_p } { + set trashed_p [lindex [qss_table_stats $sales_curve_tid] 7] + if { $trashed_p == 1 } { + set trash 0 + } else { + set trash 1 + } + qss_table_trash $trash $sales_curve_tid + } + if { [qf_is_natural_number $initial_conditions_tid] && $write_p } { + set trashed_p [lindex [qss_table_stats $initial_conditions_tid] 7] + if { $trashed_p == 1 } { + set trash 0 + } else { + set trash 1 + } + qss_table_trash $trash $initial_conditions_tid + } + set mode "p" + set next_mode "" + } + + } + # end validated input if + +} + + +set menu_list [list [list App-Model ""]] + +if { $write_p } { + lappend menu_list [list new mode=n] +} + +switch -exact -- $mode { + e { + # edit...... edit/form mode of current context + ns_log Notice "app-model.tcl mode = edit" + #requires initial_conditions_tid, sales_curve_tid + # make a form to edit + # get table from ID + + + qf_form action app-model method get id 20120531 + + qf_input type hidden value w name mode label "" + + if { [qf_is_natural_number $initial_conditions_tid] } { + set ic_stats_list [qss_table_stats $initial_conditions_tid] + set ic_name [lindex $ic_stats_list 0] + set ic_title [lindex $ic_stats_list 1] + set ic_comments [lindex $ic_stats_list 2] + set ic_flags [lindex $ic_stats_list 6] + set ic_template_id [lindex $ic_stats_list 5] + + set initial_conditions_lists [qss_table_read $initial_conditions_tid] + set initial_conditions_text [qss_lists_to_text $initial_conditions_lists] + + qf_input type hidden value $initial_conditions_tid name initial_conditions_tid label "" + qf_input type hidden value $ic_flags name ic_flags label "" + qf_input type hidden value $ic_template_id name ic_template_id label "" + qf_append html "

Initial conditions

" + qf_append html "
" + qf_input type text value $ic_name name ic_name label "Table name:" size 40 maxlength 40 + qf_append html "
" + qf_input type text value $ic_title name ic_title label "Title:" size 40 maxlength 80 + qf_append html "
" + qf_textarea value $ic_comments cols 40 rows 3 name ic_comments label "Comments:" + qf_append html "
" + qf_textarea value $initial_conditions_text cols 40 rows 6 name initial_conditions_text label "Table data:" + qf_append html "
" + } + if { [qf_is_natural_number $sales_curve_tid] } { + # get table from ID + set sc_stats_list [qss_table_stats $sales_curve_tid] + set sc_name [lindex $sc_stats_list 0] + set sc_title [lindex $sc_stats_list 1] + set sc_comments [lindex $sc_stats_list 2] + set sc_flags [lindex $sc_stats_list 6] + set sc_template_id [lindex $sc_stats_list 5] + + set sales_curve_lists [qss_table_read $sales_curve_tid] + set sales_curve_text [qss_lists_to_text $sales_curve_lists] + + qf_input type hidden value $sales_curve_tid name sales_curve_tid label "" + qf_input type hidden value $sc_flags name sc_flags label "" + qf_input type hidden value $sc_template_id name sc_template_id label "" + qf_append html "

Sales curve

" + qf_append html "
" + qf_input type text value $sc_name name sc_name label "Table name:" size 40 maxlength 40 + qf_append html "
" + qf_input type text value $sc_title name sc_title label "Title:" size 40 maxlength 80 + # qf_append html "
" + qf_append html "
" + qf_textarea value $sc_comments cols 40 rows 3 name sc_comments label "Comments:" + # qf_append html "

" + qf_append html "
" + qf_textarea value $sales_curve_text cols 40 rows 20 name sales_curve_text label "Table data:" + qf_append html "
" + } + + qf_input type submit value "Save" + qf_close + set form_html [qf_read] + + } + w { + # save..... (write) initial_conditions_tid and sales_curve_tid + # should already have been handled above + ns_log Notice "app-model.tcl mode = save THIS SHOULD NOT BE CALLED." + # it's called in validation section. + } + n { + # new....... creates new, blank context (form) + ns_log Notice "app-model.tcl mode = new" + #requires no initial_conditions_tid, sales_curve_tid + set initial_conditions_text [qss_lists_to_text $initial_conditions_lists] + set sales_curve_text [qss_lists_to_text $sales_curve_lists] + + # make a form with no existing initial_conditions_tid and sales_curve_tid + + qf_form action app-model method get id 20120530 + + qf_input type hidden value w name mode label "" + if { $initial_conditions_tid > 0 && $sales_curve_tid > 0 } { + ns_log Warning "mode n while initial_conditions_tid and sales_curve_tid exist" + } + qf_append html "

Initial conditions

" + qf_append html "
" + qf_input type text value "" name ic_name label "Table name:" size 40 maxlength 40 + qf_append html "
" + qf_input type text value "" name ic_title label "Title:" size 40 maxlength 80 + qf_append html "
" + qf_textarea value "" cols 40 rows 3 name ic_comments label "Comments:" + qf_append html "
" + qf_textarea value $initial_conditions_text cols 40 rows 6 name initial_conditions_text label "Table data:" + qf_append html "
" + + qf_append html "

Sales curve

" + qf_append html "
" + qf_input type text value "" name sc_name label "Table name:" size 40 maxlength 40 + qf_append html "
" + qf_input type text value "" name sc_title label "Title:" size 40 maxlength 80 + # qf_append html "
" + qf_append html "
" + qf_textarea value "" cols 40 rows 3 name sc_comments label "Comments:" + # qf_append html "

" + qf_append html "
" + qf_textarea value $sales_curve_text cols 40 rows 20 name sales_curve_text label "Table data:" + qf_append html "
" + + qf_input type submit value "Save" + qf_close + set form_html [qf_read] + } + c { + # compute... compute/process (and cache) output, present post_calc results + ns_log Notice "app-model.tcl mode = compute" + #requires initial_conditions_tid, sales_curve_tid + # given initial_conditions_tid and sales_curve_tid + set error_fail 0 + set initial_conditions_lists [qss_table_read $initial_conditions_tid] + set constants_list [list sale_max revenue_target pct_pooled interpolate_last_band_p growth_curve_eq commissions_eq interval_start interval_size interval_count sample_rate sales_curve_name sales_curve_tid period_unit] + set constants_required_list [list revenue_target pct_pooled sales_curve_name sales_curve_tid] + foreach condition_list $initial_conditions_lists { + set constant [lindex $condition_list 0] + if { [lsearch -exact $constants_list $constant] > -1 } { + set input_array($constant) [lindex $condition_list 1] + set $constant $input_array($constant) + } + } + if { [info exists sales_curve_name] } { + # set sales_curve_tid + set table_ids_list [qss_tables $package_id] + foreach table_id $table_ids_list { + if { [lindex [qss_table_stats $table_id] 0] eq $sales_curve_name } { + set sales_curve_tid $table_id + } + } + + } + if { [info exists sales_curve_tid] } { + set sales_curve_name [lindex [qss_table_stats $sales_curve_tid] 0] + } + set constants_exist_p 1 + set compute_message_list [list ] + foreach constant $constants_required_list { + if { ![info exists $constant] || ( [info exists $constant] && [set $constant] eq "" ) } { + set constants_exist_p 0 + lappend compute_message_list "Initial condition constant '${constant}' is required but does not exist." + set error_fail 1 + } + } + + # interpolate_last_band_p : interpolate last sale item? choose this if you have a large sale item that you want to vary over the value range + + # Get revenue_curve_data + set revenue_curve_data_lists [qss_table_read $sales_curve_tid] + + # make the distribution curve accessible as lists + set price_list [list ] + set probability_list [list ] + set price_label_list [list ] + set value_probability_lists [list ] + foreach curve_band_list $revenue_curve_data_lists { + lappend price_list [lindex $curve_band_list 0] + lappend probability_list [lindex $curve_band_list 1] + lappend price_label_list [lindex $curve_band_list 2] + lappend value_probability_lists [list $price_list $probability_list] + } + # ns_log Notice "app-model.tcl price_list $price_list" + ##### looped, varying initial conditions include: + # put lists and html in a separate arrays from the scalars + # scalar_arr abbreviated as s_arr + # list_arr + # html_arr pdt_html, stat_html, sum_html + + # data_set_list + # commission_list + # pdt_list ; distribution curve for data_set + # shares_list (function of triangle_numbers etc) + # apt_lists + + # revenue_target + # sale_count + # revenue + # commissions_pot + # shares_tot + # share_value + # commissions_tot + # the_time Time calculation completed + + # html + set computation_report_html "" + if { [info exists interval_count] && $interval_count > 1 } { + set interval_end [expr { $interval_start + ( $interval_size * $interval_count ) } ] + set intervals_list [list ] + for { set i $interval_start } { $i <= $interval_end } { set i [expr { $i + $interval_size } ] } { + lappend intervals_list $i + # generate target_revenue for each interval + switch -exact $growth_curve_eq { + 1 { + # logistic curve input 0 = circa 0% to 12 =circa 100% revenue_target + set x [expr { $i * 5. / 3. - 10. } ] + set y [acc_fin::logistic_curve $x] + set gr_i [expr { $y * $revenue_target} ] + } + 2 { + # logistic curve input 0 = circa 0% to 6 =circa 100% revenue_target, 12 = circa 0% + set x [expr { $i * 30. } ] + set y [acc_fin::pos_sine_cycle $x] + set gr_i [expr { $y * $revenue_target / 2. } ] + } + default { + # no modification of revenue_target + set gr_i $revenue_target + } + } + set scalar_arr(revenue_target-$i) $gr_i + } + } elseif { [info exists interval_start] } { + set intervals_list [list $interval_start ] + set scalar_arr(revenue_target-${interval_start}) $revenue_target + } else { + set interval_start 1 + set intervals_list [list $interval_start ] + set scalar_arr(revenue_target-${interval_start}) $revenue_target + } + + foreach i $intervals_list { + + # generate the data points + set list_arr(data_set_list-$i) [qaf_distribution_points_create $revenue_curve_data_lists "" $scalar_arr(revenue_target-$i)] + set scalar_arr(sale_count-$i) [llength $list_arr(data_set_list-$i)] + set scalar_arr(revenue-$i) [f::sum $list_arr(data_set_list-$i)] + set list_arr(ddr_list-$i) [qaf_discrete_dist_report $list_arr(data_set_list-$i)] + set scalar_arr(pct_pooled-$i) $pct_pooled + + foreach {sale_value frequency} $list_arr(ddr_list-$i) { + + # find same sale under original curve + set sale_idx [lsearch -exact $price_list $sale_value] + if { $sale_idx > -1 } { + set sale_freq [lindex $probability_list $sale_idx] + set sale_label [lindex $price_label_list $sale_idx] + } else { + set sale_freq 0 + set sale_label "" + } + + # add column and format + if { [ad_var_type_check_number_p $frequency] } { + set frequency_fmtd "[format "% 1.4f" $frequency]%" + } else { + set frequency_fmtd $frequency + } + set row_new [list $sale_label $sale_value $frequency_fmtd] + lappend row_new "[format "% 1.4f" ${sale_freq}]%" + # add row to report + lappend list_arr(pdt_list-$i) $row_new + } + + + switch -exact $commissions_eq { + 2 { + set list_arr(shares_list-$i) [qaf_harmonic_terms $scalar_arr(sale_count-$i)] + } + 3 { + set triangle_list [lreverse [qaf_triangular_numbers $scalar_arr(sale_count-$i)]] + if { [llength $triangle_list] > 0 } { + set triangle_tot [f::sum $triangle_list] + } else { + set triangle_tot 0. + } + set geometric_list [list ] + set revenue_tot $scalar_arr(revenue-$i) + set sales_list $list_arr(data_set_list-$i) + set sale_idx 0 + foreach triangle_nbr $triangle_list { + set sales_amt [lindex $sales_list $sale_idx] + if { [ad_var_type_check_number_p $sales_amt] } { +#ns_log Notice "app-model.tcl(l739): ( triangle_nbr $triangle_nbr revenue_tot $revenue_tot sales_amt $sales_amt triangle_tot $triangle_tot " + lappend geometric_list [expr { ( $triangle_nbr * $revenue_tot ) + ( $sales_amt * $triangle_tot ) } ] + } else { + lappend geometric_list 0. + } + incr sale_idx + } + set list_arr(shares_list-$i) $geometric_list + } + default { + # 1. this is the triangular equation + set list_arr(shares_list-$i) [lreverse [qaf_triangular_numbers $scalar_arr(sale_count-$i)]] + } + } + + # replace above using qaf_harmonic_terms or qaf_trianguar_numbers + + if { [llength $list_arr(shares_list-$i)] > 0 } { + set scalar_arr(shares_tot-$i) [f::sum $list_arr(shares_list-$i)] + } else { + set scalar_arr(shares_tot-$i) 0 + } + + set scalar_arr(commissions_pot-$i) [expr { $scalar_arr(revenue-$i) * $scalar_arr(pct_pooled-$i) } ] + + if { [ad_var_type_check_number_p $scalar_arr(shares_tot-$i) ] && $scalar_arr(shares_tot-$i) != 0 } { + set scalar_arr(share_value-$i) [expr { $scalar_arr(commissions_pot-$i) / $scalar_arr(shares_tot-$i) } ] + } else { + set scalar_arr(share_value-$i) 0 + } + + # build list of commissions for period + set list_arr(commission_list-$i) [list ] + set share_value $scalar_arr(share_value-$i) + foreach shares_count $list_arr(shares_list-$i) { +# set commission [expr { int( $shares_count * $scalar_arr(commissions_pot-$i) * 100. ) / ( 100. * $scalar_arr(shares_tot-$i) ) } ] + set commission [expr { int( $share_value * $shares_count * 100. ) / 100. } ] + lappend list_arr(commission_list-$i) $commission + } + set scalar_arr(commissions_tot-$i) [f::sum $list_arr(commission_list-$i)] + + set commissions_diff [expr { abs( $scalar_arr(commissions_pot-$i) - $scalar_arr(commissions_tot-$i) ) } ] + if { $commissions_diff < 0 } { + lappend user_messages_lists "Audit note: Commission pot for period $i is less than the sum of the comissions by ${commissions_diff}" + } + if { $scalar_arr(revenue-$i) != 0 } { + set scalar_arr(pct_of_sales-$i) "% [format "% 8.2f" [expr { $scalar_arr(commissions_tot-$i) / $scalar_arr(revenue-$i) * 100. } ] ]" + } else { + set scalar_arr(pct_of_sales-$i) "% div by 0!" + } + + # summary report numbers, make pretty + set scalar_arr(commissions_tot-$i) [util_commify_number [format "%0.2f" $scalar_arr(commissions_tot-$i)]] + set scalar_arr(commissions_pot-$i) [util_commify_number [format "%0.2f" $scalar_arr(commissions_pot-$i)]] + set scalar_arr(revenue-$i) [util_commify_number [format "%0.2f" $scalar_arr(revenue-$i)]] + set scalar_arr(revenue_target-$i) [util_commify_number [format "%0.2f" $scalar_arr(revenue_target-$i)]] + set scalar_arr(shares_tot-$i) [util_commify_number [format "%0.0f" $scalar_arr(shares_tot-$i)]] + set scalar_arr(the_time-$i) [clock format [clock seconds] -format "%Y %b %d %H:%M:%S"] + + set compute_message_html "" + foreach compute_message $compute_message_list { + append compute_message_html "
  • ${compute_message}
  • " + } + } + # end interval calculations + + # affiliate calculations table + set apt_html "

    Computation report

    " + # for each data_set, loop through that sample_rate (%) of times to get a pool of rows, + set rows_list [list 0] + foreach i $intervals_list { + set last_row [expr { $scalar_arr(sale_count-$i) - 1 } ] + # add boundary rows (first and last) + lappend rows_list $last_row + set row_step [expr { 1. / $sample_rate } ] + for { set ii 0 } { $ii < $last_row } { set ii [expr { $ii + $row_step } ] } { +# ns_log Notice "app-model.tcl i $i last_row $last_row row_step $row_step ii $ii" + set row_idx [expr { int( $ii ) } ] + lappend rows_list $row_idx + } + } + set rows_list [lsort -integer -unique $rows_list] + + # build main columns and prepare formatting lists + set header_list [list "Affiliate number"] + set rows_max 0 + # first row of formatting is blank + set apt_format_list [list [list ]] + # setup formating for these columns + set column_formats_list [list [list align right]] + # add columns for each period + foreach i $intervals_list { + lappend header_list "${period_unit} $i Revenue" + lappend column_formats_list [list align right bgcolor #ffcccc] + lappend header_list "${period_unit} $i Micropayments" + lappend column_formats_list [list align right bgcolor #ccffcc] + lappend header_list "${period_unit} $i Commissions" + lappend column_formats_list [list align right bgcolor #ccccff] + # while we loop through $i, lets determine the max rows for this table + if { $scalar_arr(sale_count-$i) > $rows_max } { + set rows_max $scalar_arr(sale_count-$i) + } + } + set apt_lists [list $header_list] + set table_attribute_list [list border 1 bgcolor #ffffff cellpadding 3 cellspacing 0] + lappend apt_format_list $column_formats_list + + # combine the lists(columns) into one apt_lists table of them all + foreach row_idx $rows_list { + + set affiliate_ii [expr { $row_idx + 1 } ] + set calc_list [list $affiliate_ii] + foreach i $intervals_list { + set sale_count $scalar_arr(sale_count-$i) + if { $row_idx < $sale_count } { + # in original loop, ii is set here, and now known as row_idx + set commission_ii [lindex $list_arr(commission_list-$i) $row_idx] + if { [ad_var_type_check_number_p $commission_ii] } { + set commission_ii [util_commify_number [format "%0.2f" $commission_ii]] + } + set revenue_ii [lindex $list_arr(data_set_list-$i) $row_idx] + if { [ad_var_type_check_number_p $revenue_ii] } { + set revenue_ii [util_commify_number [format "%0.2f" $revenue_ii]] + } + set micropayment_ii [lindex $list_arr(shares_list-$i) $row_idx] + if { [ad_var_type_check_number_p $micropayment_ii] } { + if { $micropayment_ii > 2 } { + set micropayment_ii [util_commify_number [format "%1.0f" $micropayment_ii]] + } else { + set micropayment_ii [util_commify_number [format "%1.6f" $micropayment_ii]] + } + } + + lappend calc_list $revenue_ii + lappend calc_list $micropayment_ii + lappend calc_list $commission_ii + } else { + lappend calc_list "" "" "" + } + } + lappend apt_lists $calc_list + } + append apt_html [qss_list_of_lists_to_html_table $apt_lists $table_attribute_list $apt_format_list] + append computation_report_html $apt_html + + set sum_html "

    Summary

    \n" + # build summary table + set sum_list [list [list ${period_unit} Revenue_target "Total revenue" "Commissions pool" "Total commissions" "% of revenue dedicated to referrals" "Number of affiliates" "Number of 'parts' (micropaymens)" "Micropayment value ($)"] ] + set sum_format_list [list [list ] [list [list align right] [list align right] [list align right] [list align right] [list align right] [list align right] [list align right] [list align right] [list align right]]] + foreach i $intervals_list { + regsub -all -- {,} $scalar_arr(shares_tot-$i) {} shares_tot_i + regsub -all -- {,} $scalar_arr(commissions_tot-$i) {} commissions_tot_i + if { [ad_var_type_check_number_p $commissions_tot_i ] && [ad_var_type_check_number_p $shares_tot_i ] } { + set micropayment_val [format "%1.14f" [expr { $commissions_tot_i / $shares_tot_i } ]] + } else { + set micropayment_val " " + } + lappend sum_list [list $i $scalar_arr(revenue_target-$i) $scalar_arr(revenue-$i) $scalar_arr(commissions_pot-$i) $scalar_arr(commissions_tot-$i) $scalar_arr(pct_of_sales-$i) $scalar_arr(sale_count-$i) $scalar_arr(shares_tot-$i) $micropayment_val] + } + append sum_html [qss_list_of_lists_to_html_table $sum_list $table_attribute_list $sum_format_list] + append computation_report_html $sum_html + # determine distribution curve for this set of data + set stat_html "

    Statistics

    " + set stat_header_list [list "Product/sale label" "Value" "Original frequency"] + set stat_row2_list [list "" [list align right] [list align right] ] + set column_nbr 3 + foreach i $intervals_list { + lappend stat_header_list "${period_unit} $i frequency" + if { [f::odd_p $column_nbr ] } { + lappend stat_row2_list [list align right] + } else { + lappend stat_row2_list [list align right bgcolor #cccccc] + } + incr column_nbr + } + set stat_list [list $stat_header_list] + set table_attribute_list [list border 1 bgcolor ffffff cellpadding 3 cellspacing 0] + set stat_format_list [list [list ] $stat_row2_list] + + ##### build rows by: foreach original sales_curve value + # first create hash of each period, for quick, accurate referencing + foreach i $intervals_list { + foreach { sale_value frequency} $list_arr(ddr_list-$i) { + set scalar_arr(ddr-idx-$i-${sale_value}) "[format "% 1.4f" ${frequency}]%" + } + } + set price_idx 0 + foreach price $price_list { + set frequency_orig [lindex $probability_list $price_idx] + set frequency_orig "[format "% 1.4f" ${frequency_orig}]%" + set row_list [list [lindex $price_label_list $price_idx] [qaf_round_to_decimals $price] $frequency_orig ] + foreach i $intervals_list { + if { [info exists scalar_arr(ddr-idx-$i-$price)] } { + lappend row_list $scalar_arr(ddr-idx-$i-$price) + } else { + lappend row_list 0 + } + } + lappend stat_list $row_list + incr price_idx + } + + + append stat_html [qss_list_of_lists_to_html_table $stat_list $table_attribute_list $stat_format_list] + append computation_report_html $stat_html + + + } + r { + # review.... show computed output + ns_log Notice "app-model.tcl mode = review" + #requires initial_conditions_tid, sales_curve_tid + + # option not used for this app. No Calcs saved. + } + v { + # view table(s) (standard, html page document/report) + ns_log Notice "app-model.tcl mode = $mode ie. view table" + if { [qf_is_natural_number $initial_conditions_tid] && [qf_is_natural_number $sales_curve_tid] && $write_p } { + lappend menu_list [list edit "initial_conditions_tid=${initial_conditions_tid}&sales_curve_tid=${sales_curve_tid}&mode=e"] + set menu_e_p 1 + } else { + set menu_e_p 0 + } + if { [qf_is_natural_number $initial_conditions_tid] } { + set ic_stats_list [qss_table_stats $initial_conditions_tid] + set ic_name [lindex $ic_stats_list 0] + set ic_title [lindex $ic_stats_list 1] + set ic_comments [lindex $ic_stats_list 2] + set initial_conditions_html "

    ${ic_title} (${ic_name})

    \n" + set ic_lists [qss_table_read $initial_conditions_tid] + set ic_text [qss_lists_to_text $ic_lists] + set table_tag_atts_list [list border 1 cellpadding 3 cellspacing 0] + append initial_conditions_html [qss_list_of_lists_to_html_table $ic_lists $table_tag_atts_list] + append initial_conditions_html "

    ${ic_comments}

    " + if { ![qf_is_natural_number $sales_curve_tid] } { + # can sales_curve_tid be extracted from initial_conditions? + set constants_list [list sales_curve_tid] + foreach condition_list $ic_lists { + set constant [lindex $condition_list 0] + if { [lsearch -exact $constants_list $constant] > -1 } { + set input_array($constant) [lindex $condition_list 1] + set $constant $input_array($constant) + ns_log Notice "app-model.tcl: constant $constant set to $input_array($constant)" + } + } + } + if { !$menu_e_p && $write_p } { + + lappend menu_list [list edit "initial_conditions_tid=${initial_conditions_tid}&mode=e"] + } + } + if { [qf_is_natural_number $sales_curve_tid] } { + set sc_stats_list [qss_table_stats $sales_curve_tid] + set sc_name [lindex $sc_stats_list 0] + set sc_title [lindex $sc_stats_list 1] + set sc_comments [lindex $sc_stats_list 2] + set sales_curve_html "

    ${sc_title} (${sc_name})

    \n" + + # get table from ID + set sc_lists [qss_table_read $sales_curve_tid] + set sc_text [qss_lists_to_text $sales_curve_lists] + set table_tag_atts_list [list border 1 cellpadding 3 cellspacing 0] + append sales_curve_html [qss_list_of_lists_to_html_table $sc_lists $table_tag_atts_list] + append sales_curve_html "

    ${sc_comments}

    " + if { !$menu_e_p && ![qf_is_natural_number $initial_conditions_tid] && $write_p } { + lappend menu_list [list edit "sales_curve_tid=${sales_curve_tid}&mode=e"] + } + } + if { [qf_is_natural_number $initial_conditions_tid] && [qf_is_natural_number $sales_curve_tid] } { + lappend menu_list [list compute "initial_conditions_tid=${initial_conditions_tid}&sales_curve_tid=${sales_curve_tid}&mode=c"] + } + } + default { + # default includes v,p + + # present...... presents a list of contexts/scenarios to choose from + ns_log Notice "app-model.tcl mode = $mode ie. default" + + + # show initial_conditions, sales_curve tables + # sort by template_id, columns + + set table_ids_list [qss_tables $package_id] + set table_stats_lists [list ] + set table_trashed_lists [list ] + set cell_formating_list [list ] + set tables_stats_lists [list ] + # we get the entire list, to sort it before processing + foreach table_id $table_ids_list { + + set stats_mod_list [list $table_id] + set stats_orig_list [qss_table_stats $table_id] + foreach stat $stats_orig_list { + lappend stats_mod_list $stat + } + # table_id, name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + lappend tables_stats_lists $stats_mod_list + } + set tables_stats_lists [lsort -index 6 -real $tables_stats_lists] + + foreach stats_orig_list $tables_stats_lists { + set stats_list [lrange $stats_orig_list 0 5] + set table_id [lindex $stats_list 0] + set name [lindex $stats_list 1] + set template_id [lindex $stats_orig_list 6] + set table_user_id [lindex $stats_orig_list 12] + set trashed_p [lindex $stats_orig_list 8] + # adding average col. length + set denominator [expr { [lindex $stats_list 5] } ] + if { $denominator > 0 } { + set col_length [expr { [lindex $stats_list 4] / ( [lindex $stats_list 5] * 1. ) } ] + } else { + set col_length 0. + } + lappend stats_list $col_length + + # convert table row for use with html + # change name to an active link + if { $col_length != 3 || $template_id == 10040 } { + set table_ref_name initial_conditions_tid + + } else { + set table_ref_name sales_curve_tid + } + + set active_link "$name" + + if { ( $admin_p || $table_user_id == $user_id ) && $trashed_p == 1 } { + set trash_label "untrash" + append active_link " \[${trash_label}\]" + } elseif { $table_user_id == $user_id || $admin_p } { + set trash_label "trash" + append active_link " \[${trash_label}\]" + } + if { $delete_p && $trashed_p == 1 } { + append active_link " \[delete\]" + } + set stats_list [lreplace $stats_list 0 1 $active_link] + if { $trashed_p == 1 } { + lappend table_trashed_lists $stats_list + } else { + lappend table_stats_lists $stats_list + } + + } + # sort for now. Later, just get initial_conditions_tables with same template_id + set table_stats_sorted_lists $table_stats_lists + set table_stats_sorted_lists [linsert $table_stats_sorted_lists 0 [list Name Title Comments "Cell count" "Row count" "Columns (avg)"] ] + set table_tag_atts_list [list border 1 cellspacing 0 cellpadding 3] + set table_stats_html [qss_list_of_lists_to_html_table $table_stats_sorted_lists $table_tag_atts_list $cell_formating_list] + # trashed + if { [llength $table_trashed_lists] > 0 && $write_p } { + set table_trashed_sorted_lists $table_trashed_lists + set table_trashed_sorted_lists [linsert $table_trashed_sorted_lists 0 [list Name Title Comments "Cell count" "Row count" "Columns (avg)"] ] + set table_tag_atts_list [list border 1 cellspacing 0 cellpadding 3] + + set table_trashed_html "

    Trashed tables

    \n" + append table_trashed_html [qss_list_of_lists_to_html_table $table_trashed_sorted_lists $table_tag_atts_list $cell_formating_list] + append table_stats_html $table_trashed_html + } + } +} +# end of switches + +set menu_html "" +foreach item_list $menu_list { + set label [lindex $item_list 0] + set url [lindex $item_list 1] + append menu_html "${label} " +} + +set user_message_html "" +foreach user_message $user_message_list { + append user_message_html "
  • ${user_message}
  • " +} Index: openacs-4/packages/accounts-finance/www/admin/example-maker.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/admin/example-maker.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/admin/example-maker.tcl 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,30 @@ +# generic header for static .adp pages + +set instance_id [ad_conn package_id] +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] +if { $read_p } { + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + if { $write_p } { + set delete_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege delete] + if { $delete_p } { + set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + } else { + set admin_p 0 + } + } else { + set admin_p 0 + set delete_p 0 + } +} else { + set write_p 0 + set admin_p 0 + set delete_p 0 +} + +if { $admin_p } { + acc_fin::pretti_example_maker +} +set url [ad_conn package_url] +append url "/pretti" +ad_returnredirect $url Index: openacs-4/packages/accounts-finance/www/admin/model.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/admin/model.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/admin/model.adp 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,4 @@ + +@title;noquote@ +@context;noquote@ +@window_content;noquote@ Index: openacs-4/packages/accounts-finance/www/admin/model.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/admin/model.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/admin/model.tcl 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,94 @@ +ad_page_contract { + model display/edit page + returns @window_content@ + @author Benjamin Brink + @creation-date 2010-08-10 + +} { + {case_id ""} + {iterations_count ""} + {action ""} + {context ""} +} + +# the UI is based on xowiki UI. +# edit - revisions - template - new - delete - search - index.. + +# action: +# view...... default (no action) (standard, html page document/report) +# viewN..... as table or other options to export in csv or tab delimited format, email, copy to clipboard etc +# list...... list other current versions of context +# explore... compact, api-doc like where each symbol links to more info about it +# edit...... edits current context +# revisions. shows revisions list of context item with options +# template.. makes new template based on current context +# new....... creates new, blank context +# delete.... removes all versions of current context +# search.... searches current versions of all contexts +# compute... compute/process (and cache) output, present post_calc results +# review.... show computed output + +# web only additions: notifications - admin + +# context: +# case....... compute/run (init_conditions,model_id,tracking_vars_id,post_compute_calcs_id,iterations_count), possibly mini graph +# init....... initial conditions +# model...... model program +# tracking... variables to track +# log........ data logged during run (if computed) +# post_calcs. calculations on data after compute +# graph...... output of table in graph format(s), simple graph showing relative values over iteration with automatic limits + + +# each revision has author, size, last_modified, notes, current revision?, delete/trash, diff to prev, version_number +# version_number is dynamically created, a trashed revision does not disrupt sequence (a new sequence is displayed) + +# create procs that read and update data (create new if none, or new id where data changes) + +set title "Model" +set context [list $title] +set package_id [ad_conn package_id] + + +set window_content "" + + +set user_id [ad_conn user_id] +set write_p [permission::permission_p -party_id $user_id -object_id $package_id -privilege write] +set admin_p [permission::permission_p -party_id $user_id -object_id $package_id -privilege admin] +if { $admin_p } { + + #set model [acc_fin::template_model 0] + + if { $action eq "view" } { + + set computed_model [acc_fin::model_compute $model 120] + set formatting_list [list ] + set error_table [lindex $computed_model 0] + set error_table_html [qaf_tcl_list_of_lists_to_html_table $error_table $formatting_list 1 0 0] + set data_model [lrange $computed_model 1 end] + set computed_model_html [qaf_tcl_list_of_lists_to_html_table $data_model $formatting_list 1 0 2] + + } + + + if { $action eq "compute" } { + set computed_model [acc_fin::model_compute $model 120] + set formatting_list [list ] + set error_table [lindex $computed_model 0] + set error_table_html [qaf_tcl_list_of_lists_to_html_table $error_table $formatting_list 1 0 0] + set data_model [lrange $computed_model 1 end] + set computed_model_html [qaf_tcl_list_of_lists_to_html_table $data_model $formatting_list 1 0 2] + } + + if { $action eq "compile" } { + set computed_model [acc_fin::model_compute $model 120] + set error_table [lindex $computed_model 0] + set error_table_html [qaf_tcl_list_of_lists_to_html_table $error_table $formatting_list 1 0 0] + set data_model [lrange $computed_model 1 end] + set computed_model_html [qaf_tcl_list_of_lists_to_html_table $data_model $formatting_list 1 0 2] + + + } + +} Index: openacs-4/packages/accounts-finance/www/doc/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/index.adp,v diff -u -r1.1 -r1.2 --- openacs-4/packages/accounts-finance/www/doc/index.adp 3 Jul 2006 19:20:11 -0000 1.1 +++ openacs-4/packages/accounts-finance/www/doc/index.adp 14 Nov 2014 18:20:19 -0000 1.2 @@ -1,4 +1,68 @@ +@title;noquote@ +@context;noquote@ + +

    Finance Package @title@

    + +

    Finance Package provides some tools for forecasting and reporting

    + +

    The lastest released version of the code is available at: + http://github.com/xdcpm/accounts-finance +

    +The development reference is at http://github.com/tekbasse/accounts-finance +

    +

    introduction

    + +

    +Finance package provides a growing library of procedures for use with financial accounting +and related topics, including long-term debt, fixed assets, forecasting and data analysis. +

    + +

    license

    -will be porting in sql-ledger RP.pm and rp.pl
    +Copyright (c) 2014 Benjamin Brink
    +po box 20, Marylhurst, OR 97036-0020 usa
    +email: tekbasse@yahoo.com
    +
    +Finance Package is open source and published under the GNU General Public License, 
    +consistent with the OpenACS system license: http://www.gnu.org/licenses/gpl.html
    +A local copy is available at accounts-finance/www/doc/LICENSE.html
    +
    +    This program is free software: you can redistribute it and/or modify
    +    it under the terms of the GNU General Public License as published by
    +    the Free Software Foundation, either version 3 of the License, or
    +    (at your option) any later version.
    +
    +    This program is distributed in the hope that it will be useful,
    +    but WITHOUT ANY WARRANTY; without even the implied warranty of
    +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +    GNU General Public License for more details.
    +
    +    You should have received a copy of the GNU General Public License
    +    along with this program.  If not, see .
     
    + +

    contents

    + + +

    Package Features

    +
    • +Project Reporting Evaluation and Track Task Interpretation (PRETTI) charts. +
    +

    +Example apps on how to use the code are linked from the www directory of this package. +

    +

    +For a list of available procedures, see account-finance's procedure library via /api-doc/ on +a site running OpenACS with account-finance installed. +

    Index: openacs-4/packages/accounts-finance/www/doc/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/index.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/index.tcl 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,19 @@ +set title "Documentation" +set context [list $title] + +set examples_html "" +set examples_list [list ] +set i_max 5 +for {set i 1} {$i <= $i_max} {incr i} { + set a [string range "1abcdefghijklmnopqrstuvwxyz" $i $i] + set row_list [list "PRETTI Example ${i}" pretti-example-$i [lindex [acc_fin::example_table p20${a}] 0]] + lappend examples_list $row_list +} +foreach e_list $examples_list { + lassign $e_list text url description + regsub -all -- { ([h][t][t][p][s]?[\:][\/][\/][A-Za-z0-9\:\.\-\/\_]+) } $description { \1 } description + append examples_html "
  • " + append examples_html "${text} " + append examples_html $description + append examples_html "
  • " +} Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-1.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-1.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-1.adp 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,32 @@ + +@title;noquote@ +@context;noquote@ + +

    @title@

    + +

    Copy and paste these into the PRETTI app for a working example.

    +

    This example is from http://en.wikipedia.org/wiki/Program_evaluation_and_review_technique_%28PERT%29#Implementation.

    + +

    P1 Table: PRETTI example scenario 1

    +@p1_html;noquote@ + +

    P2 Table: PRETTI Example 1 (tasks)

    +@p2_html;noquote@ + +

    P3 Table: Task Types

    +

    (not used)

    + +

    DC Tables: Distribution Curves

    +

    (not used)

    + +

    P1 table with some optional settings

    +

    This shows some optional settings added to P1.
    +pert_omp,strict tells PRETTI to use PERT's expected time formula.
    +precision,0.001 sets the general display precision.
    +tprecision,0.01 sets the display precision for time variables.

    + +@p1b_html;noquote@ + +

    P4 is the result table. See glossary for acronym meanings and faqs.

    + +@p4_html;noquote@ Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-1.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-1.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-1.tcl 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,54 @@ +set title "PRETTI Example 1" +set context [list [list index "Documentation"] $title] + +set p1_html "
    "
    +set p1_list [acc_fin::example_table p10a]
    +foreach row $p1_list {
    +    append p1_html [join $row "," ]
    +    append p1_html "\n"
    +}
    +append p1_html "
    " + +set p2_html "
    "
    +append p2_html [lindex [acc_fin::example_table p20a] 2]
    +append p2_html "
    " + +set p3_html "

    * not used

    " + +set p1b_html {

    name: PRETTI example scenario 1
    + tid: 10412
    +
    + + + + + + + + + + + + + +
    namevalue
    activity_table_namePRETTI Example 1
    activity_table_tid10352
    time_est_short5
    time_est_median8
    time_est_long12
    time_probability_point0.5
    db_formatexpand
    pert_ompstrict
    precision0.001
    tprecision0.01
    +} + +set p4_html {

    PRETTI Example 1.p4

    + +
    name: PRETTI Example 1.p4
    + tid: 10415
    +
    + +

    Computation report

    + + + + + +
    path_1path_2path_3
    A
    t:4.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    B
    t:5.33
    tw:5.33
    tn:5.33
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    A
    t:4.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    C
    t:5.17
    tw:9.17
    tn:9.17
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(A)
    E
    t:5.17
    tw:10.5
    tn:14.33
    fw:3.83
     c:1.0
    cw:2.0
    cn:4.0
    d:(B C)
    D
    t:6.33
    tw:10.33
    tn:10.33
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(A)
    E
    t:5.17
    tw:14.33
    tn:14.33
    fw:0.0
     c:1.0
    cw:3.0
    cn:4.0
    d:(B C)
    G
    t:5.17
    tw:15.67
    tn:19.5
    fw:3.83
     c:1.0
    cw:3.0
    cn:5.0
    d:(E)
    F
    t:4.5
    tw:14.83
    tn:14.83
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(D)
    G
    t:5.17
    tw:19.5
    tn:19.5
    fw:0.0
     c:1.0
    cw:4.0
    cn:5.0
    d:(E)
      
    + + +

    +Scenario report for PRETTI example scenario 1: scenario_name PRETTI Example 1 , cp_duration_at_pm 19.500000000000004 , cp_cost_pm 4.0 , max_act_count_per_track 4 , time_probability_point 0.5 , cost_probability_point 0.5 , setup_time 0 , main_processing_time 0 seconds , time/date finished processing 2014 Aug 02 21:30:17 , _tDcSource 3.1 , _cDcSource 6 , precision 0.001 , tprecision 0.01 , cprecision 0.001 , color_mask_sig_idx 3 , color_mask_oth_idx 5 , colorswap_p 0 +

    } Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-2.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-2.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-2.adp 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,29 @@ + +@title;noquote@ +@context;noquote@ + +

    @title@

    + +

    Copy and paste these into the PRETTI app for a working example.

    + +

    @subtitle_html;noquote@

    + +

    @comments_html;noquote@

    + +

    P1 Table: PRETTI example 2 scenario

    +@p1_html;noquote@ + +

    P2 Table: PRETTI Example 2 (tasks)

    +@p2_html;noquote@ + +

    P3 Table: Task Types

    +

    (not used)

    + +

    DC Tables: Distribution Curves

    +

    (not used)

    + +@p1b_html;noquote@ + +

    P4 is the result table. See glossary for acronym meanings and faqs.

    + +@p4_html;noquote@ Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-2.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-2.tcl 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,62 @@ +set title "PRETTI Example 2" +set context [list [list index "Documentation"] $title] + +set p1_html "
    "
    +set p1_list [acc_fin::example_table p10b]
    +foreach row $p1_list {
    +    append p1_html [join $row "," ]
    +    append p1_html "\n"
    +}
    +append p1_html "
    " + +set p2_html "
    "
    +set p2_list [lindex [acc_fin::example_table p20b]]
    +append p2_html [lindex $p2_list 2]
    +append p2_html "
    " +set subtitle_html [lindex $p2_list 0] +set comments_html [lindex $p2_list 1] +regsub -all -- { ([h][t][t][p][s]?[:][\/][\/][A-Za-z0-9\.\:\-\/\_]+)} $comments_html { \1 } comments_html + +set p3_html "

    * not used

    " + +set p1b_html {

    name: WikipediaPERTchartScenario
    +    tid: 10122
    +  
    + + + + +
    namevalue
    activity_table_nameWikipediaPERTchart
    } + +set p4_html {

    WikipediaPERTchart scenario.p4 t=0.5 c=0.5

    + + + +
    name: WikipediaPERTchartScenario.p4t0.5c0.5
    +    tid: 10126
    +  
    + +

    Computation report

    + + + + + + + + +
    path_1path_2path_3
    10
    t:0.0
    tw:0.0
    tn:0.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    10
    t:0.0
    tw:0.0
    tn:0.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    10
    t:0.0
    tw:0.0
    tn:0.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    A
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(10)
    B
    t:4.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(10)
    A
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(10)
    30
    t:0.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(A)
    20
    t:0.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(B)
    30
    t:0.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(A)
    D
    t:1.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(30)
    C
    t:3.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(20)
    E
    t:3.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(30)
    40
    t:0.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(D)
    50
    t:0.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:15.0
    d:(F E C)
    50
    t:0.0
    tw:6.0
    tn:7.0
    fw:1.0
     c:1.0
    cw:5.0
    cn:15.0
    d:(F E C)
    F
    t:3.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(40)
      
    50
    t:0.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:15.0
    d:(F E C)
      
    + + +

    + Scenario report for WikipediaPERTchart scenario: scenario_name WikipediaPERTchartScenario , cp_duration_at_pm 7.0 , cp_cost_pm 7.0 , max_act_count_per_track 7 , time_probability_point 0.5 , cost_probability_point 0.5 , setup_time 0 , main_processing_time 0 seconds , time/date finished processing 2014 Sep 27 22:47:55 , _tDcSource 6 , _cDcSource 6 , precision , tprecision , cprecision , color_mask_sig_idx 3 , color_mask_oth_idx 5 , colorswap_p 0 +

    + + +

    Legend

    + + + + + +
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    } Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-3.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-3.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-3.adp 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,29 @@ + +@title;noquote@ +@context;noquote@ + +

    @title@

    + +

    Copy and paste these into the PRETTI app for a working example.

    + +

    @subtitle_html;noquote@

    + +

    @comments_html;noquote@

    + +

    P1 Table: PRETTI example 3 scenario

    +@p1_html;noquote@ + +

    P2 Table: PRETTI Example 3 (tasks)

    +@p2_html;noquote@ + +

    P3 Table: Task Types

    +

    (not used)

    + +

    DC Tables: Distribution Curves

    +

    (not used)

    + +@p1b_html;noquote@ + +

    P4 is the result table. See glossary for acronym meanings and faqs.

    + +@p4_html;noquote@ Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-3.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-3.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-3.tcl 14 Nov 2014 18:20:19 -0000 1.1 @@ -0,0 +1,64 @@ +set title "PRETTI Example 3" +set context [list [list index "Documentation"] $title] + +set p1_html "
    "
    +set p1_list [acc_fin::example_table p10c]
    +foreach row $p1_list {
    +    append p1_html [join $row "," ]
    +    append p1_html "\n"
    +}
    +append p1_html "
    " + +set p2_html "
    "
    +set p2_list [lindex [acc_fin::example_table p20c]]
    +append p2_html [lindex $p2_list 2]
    +append p2_html "
    " +set subtitle_html [lindex $p2_list 0] +set comments_html [lindex $p2_list 1] +regsub -all -- { ([h][t][t][p][s]?[\:][\/][\/][A-Za-z0-9\.\-\/\_]+) } $comments_html { \1 } comments_html + +set p3_html "

    * not used

    " + +set p1b_html {

    name: PRETTI example 3 fedorataskworkflow scenario
    + tid: 10098
    +
    + + + + +
    namevalue
    activity_table_namefedorataskworkflow
    +} + +set p4_html {

    PRETTI Example.p4

    +
    name: fedorataskworkflow.p4
    + tid: 10120
    +
    +

    Computation report

    + + + + + + + + + + + + +
    path_1path_2path_3
    planning_development
    t:90.0
    tw:90.0
    tn:90.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    planning_development
    t:90.0
    tw:90.0
    tn:90.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    planning_development
    t:90.0
    tw:90.0
    tn:90.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    development
    t:90.0
    tw:180.0
    tn:180.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(planning_development)
    development
    t:90.0
    tw:180.0
    tn:180.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(planning_development)
    development
    t:90.0
    tw:180.0
    tn:180.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(planning_development)
    branch_alpha
    t:14.0
    tw:194.0
    tn:194.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(development)
    branch_alpha
    t:14.0
    tw:194.0
    tn:194.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(development)
    branch_alpha
    t:14.0
    tw:194.0
    tn:194.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(development)
    alpha_testing
    t:23.0
    tw:217.0
    tn:217.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(branch_alpha)
    bodhi_cycling
    t:72.0
    tw:266.0
    tn:266.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(branch_alpha)
    translations
    t:72.0
    tw:266.0
    tn:266.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(branch_alpha)
    alpha_cycles
    t:14.0
    tw:231.0
    tn:231.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(alpha_testing)
      
    alpha_release
    t:7.0
    tw:238.0
    tn:238.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(alpha_cycles)
      
    beta_testing
    t:7.0
    tw:245.0
    tn:245.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(alpha_release)
      
    beta_cycles
    t:14.0
    tw:259.0
    tn:259.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_testing)
      
    beta_release
    t:7.0
    tw:266.0
    tn:266.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(beta_cycles)
      
    final_cycles
    t:14.0
    tw:280.0
    tn:280.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(beta_release)
      
    final_release
    t:5.0
    tw:285.0
    tn:285.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(final_cycles)
      
    + + +

    + Scenario report for FTW Scenario: scenario_name fedorataskworkflowscenario , cp_duration_at_pm 285.0 , cp_cost_pm 11.0 , max_act_count_per_track 11 , time_probability_point 0.5 , cost_probability_point 0.5 , setup_time 0 , main_processing_time 0 seconds , time/date finished processing 2014 Sep 27 20:56:59 , _tDcSource 6 , _cDcSource 6 , precision , tprecision , cprecision , color_mask_sig_idx 3 , color_mask_oth_idx 5 , colorswap_p 0 +

    + + +

    Legend

    + + + + + +
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    +} Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-4.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-4.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-4.adp 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,29 @@ + +@title;noquote@ +@context;noquote@ + +

    @title@

    + +

    Copy and paste these into the PRETTI app for a working example.

    + +

    @subtitle_html;noquote@

    + +

    @comments_html;noquote@

    + +

    P1 Table: PRETTI example 4 scenario

    +@p1_html;noquote@ + +

    P2 Table: PRETTI Example 4 (tasks)

    +@p2_html;noquote@ + +

    P3 Table: Task Types

    +

    (not used)

    + +

    DC Tables: Distribution Curves

    +

    (not used)

    + +@p1b_html;noquote@ + +

    P4 is the result table. See glossary for acronym meanings and faqs.

    + +@p4_html;noquote@ Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-4.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-4.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-4.tcl 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,60 @@ +set title "PRETTI Example 4" +set context [list [list index "Documentation"] $title] + +set p1_html "
    "
    +set p1_list [acc_fin::example_table p10d]
    +foreach row $p1_list {
    +    append p1_html [join $row "," ]
    +    append p1_html "\n"
    +}
    +append p1_html "
    " + +set p2_html "
    "
    +set p2_list [lindex [acc_fin::example_table p20d]]
    +append p2_html [lindex $p2_list 2]
    +append p2_html "
    " +set subtitle_html [lindex $p2_list 0] +set comments_html [lindex $p2_list 1] +regsub -all -- { ([h][t][t][p][s]?[\:][\/][\/][A-Za-z0-9\.\-\/\_]+) } $comments_html { \1 } comments_html + +set p3_html "

    * not used

    " + +set p1b_html {

    name: fedoraDocScenario
    +    tid: 10094
    +  
    + + + + +
    namevalue
    activity_table_namefedoradocworkflow
    } + +set p4_html {
    name: fedoraDocScenario.p4t0.5c0.5
    +    tid: 10129
    +  
    + +

    Computation report

    + + + + + + + + +
    path_1path_2path_3path_4path_5path_6path_7path_8path_9path_10path_11
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    collect_input
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    write_wiki
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(collect_input)
    write_wiki
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(collect_input)
    write_wiki
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(collect_input)
    wiki
    t:1.0
    tw:2.0
    tn:3.0
    fw:1.0
     c:1.0
    cw:2.0
    cn:4.0
    d:(collect_input write_wiki)
    wiki
    t:1.0
    tw:2.0
    tn:3.0
    fw:1.0
     c:1.0
    cw:2.0
    cn:4.0
    d:(collect_input write_wiki)
    wiki
    t:1.0
    tw:2.0
    tn:3.0
    fw:1.0
     c:1.0
    cw:2.0
    cn:4.0
    d:(collect_input write_wiki)
    write_xml
    t:1.0
    tw:2.0
    tn:4.0
    fw:2.0
     c:1.0
    cw:2.0
    cn:6.0
    d:(wiki collect_input)
    write_wiki
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(collect_input)
    write_xml
    t:1.0
    tw:2.0
    tn:4.0
    fw:2.0
     c:1.0
    cw:2.0
    cn:6.0
    d:(wiki collect_input)
    write_xml
    t:1.0
    tw:2.0
    tn:4.0
    fw:2.0
     c:1.0
    cw:2.0
    cn:6.0
    d:(wiki collect_input)
    wiki
    t:1.0
    tw:2.0
    tn:3.0
    fw:1.0
     c:1.0
    cw:2.0
    cn:4.0
    d:(collect_input write_wiki)
    wiki
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:4.0
    d:(collect_input write_wiki)
    wiki
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:4.0
    d:(collect_input write_wiki)
    wiki
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:4.0
    d:(collect_input write_wiki)
    write_xml
    t:1.0
    tw:3.0
    tn:4.0
    fw:1.0
     c:1.0
    cw:3.0
    cn:6.0
    d:(wiki collect_input)
    write_xml
    t:1.0
    tw:3.0
    tn:4.0
    fw:1.0
     c:1.0
    cw:3.0
    cn:6.0
    d:(wiki collect_input)
    write_xml
    t:1.0
    tw:3.0
    tn:4.0
    fw:1.0
     c:1.0
    cw:3.0
    cn:6.0
    d:(wiki collect_input)
    git
    t:1.0
    tw:3.0
    tn:5.0
    fw:2.0
     c:1.0
    cw:3.0
    cn:7.0
    d:(write_xml)
    wiki
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:4.0
    d:(collect_input write_wiki)
    git
    t:1.0
    tw:3.0
    tn:5.0
    fw:2.0
     c:1.0
    cw:3.0
    cn:7.0
    d:(write_xml)
    git
    t:1.0
    tw:3.0
    tn:5.0
    fw:2.0
     c:1.0
    cw:3.0
    cn:7.0
    d:(write_xml)
    review_wiki
    t:1.0
    tw:3.0
    tn:4.0
    fw:1.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(wiki)
    write_xml
    t:1.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:6.0
    d:(wiki collect_input)
    write_xml
    t:1.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:6.0
    d:(wiki collect_input)
    write_xml
    t:1.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:6.0
    d:(wiki collect_input)
    git
    t:1.0
    tw:4.0
    tn:5.0
    fw:1.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(write_xml)
    git
    t:1.0
    tw:4.0
    tn:5.0
    fw:1.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(write_xml)
    git
    t:1.0
    tw:4.0
    tn:5.0
    fw:1.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(write_xml)
    package_docs
    t:1.0
    tw:4.0
    tn:6.0
    fw:2.0
     c:1.0
    cw:4.0
    cn:8.0
    d:(git)
    review_wiki
    t:1.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:5.0
    d:(wiki)
    review_xml
    t:1.0
    tw:4.0
    tn:6.0
    fw:2.0
     c:1.0
    cw:4.0
    cn:8.0
    d:(git)
    publish
    t:1.0
    tw:4.0
    tn:6.0
    fw:2.0
     c:1.0
    cw:4.0
    cn:8.0
    d:(git)
     
    git
    t:1.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:7.0
    d:(write_xml)
    git
    t:1.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:7.0
    d:(write_xml)
    git
    t:1.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:7.0
    d:(write_xml)
    package_docs
    t:1.0
    tw:5.0
    tn:6.0
    fw:1.0
     c:1.0
    cw:5.0
    cn:8.0
    d:(git)
    review_xml
    t:1.0
    tw:5.0
    tn:6.0
    fw:1.0
     c:1.0
    cw:5.0
    cn:8.0
    d:(git)
    publish
    t:1.0
    tw:5.0
    tn:6.0
    fw:1.0
     c:1.0
    cw:5.0
    cn:8.0
    d:(git)
    push_to_fedora
    t:1.0
    tw:5.0
    tn:7.0
    fw:2.0
     c:1.0
    cw:5.0
    cn:9.0
    d:(package_docs)
        
    package_docs
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:8.0
    d:(git)
    review_xml
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:8.0
    d:(git)
    publish
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:8.0
    d:(git)
    push_to_fedora
    t:1.0
    tw:6.0
    tn:7.0
    fw:1.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(package_docs)
           
    push_to_fedora
    t:1.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:9.0
    d:(package_docs)
              
    + + +

    + Scenario report for Fedora Docs Scenario: scenario_name fedoraDocScenario , cp_duration_at_pm 7.0 , cp_cost_pm 7.0 , max_act_count_per_track 7 , time_probability_point 0.5 , cost_probability_point 0.5 , setup_time 0 , main_processing_time 0 seconds , time/date finished processing 2014 Sep 28 00:20:48 , _tDcSource 6 , _cDcSource 6 , precision , tprecision , cprecision , color_mask_sig_idx 3 , color_mask_oth_idx 5 , colorswap_p 0 +

    + + + + +

    Legend

    + + + + + +
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    } Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-5.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-5.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-5.adp 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,72 @@ + +@title;noquote@ +@context;noquote@ + +

    @title@

    + +

    Copy and paste these into the PRETTI app for a working example.

    + +

    @subtitle_html;noquote@

    + +

    @comments_html;noquote@

    + +

    P1 Table: PRETTI example 5 scenario

    +@p1_html;noquote@ + +

    P2 Table: PRETTI example 5 (tasks)

    +@p2_html;noquote@ + +

    P3 Table: Task Types

    +

    (not used)

    + +

    DC Tables: Distribution Curves

    +

    (not used)

    + +@p1b_html;noquote@ + +

    P4 is the result table. See glossary for acronym meanings and faqs.

    + +
    name: fedora20scenario.p4t0.5c0.5
    +    tid: 10135
    +  
    + +

    Computation report

    + + + + + + + + + + + + + + + + + + + + +
    path_1path_2path_3path_4path_5path_6path_7path_8path_9path_10path_11path_12path_13path_14path_15path_16path_17path_18path_19path_20path_21path_22path_23path_24path_25path_26path_27path_28path_29path_30path_31path_32path_33path_34path_35path_36path_37path_38path_39path_40path_41path_42path_43path_44path_45path_46path_47path_48path_49path_50path_51path_52path_53path_54path_55path_56path_57path_58path_59path_60path_61path_62path_63path_64path_65path_66path_67path_68path_69path_70path_71path_72path_73path_74path_75path_76path_77path_78path_79path_80path_81path_82path_83path_84path_85path_86path_87path_88path_89path_90path_91path_92path_93path_94path_95path_96path_97path_98path_99path_100path_101path_102path_103path_104path_105path_106path_107path_108path_109path_110path_111path_112path_113path_114path_115path_116path_117path_118path_119path_120path_121path_122path_123path_124path_125path_126path_127path_128path_129path_130path_131path_132path_133path_134path_135path_136path_137path_138path_139path_140path_141path_142path_143path_144path_145path_146path_147path_148path_149path_150path_151path_152path_153path_154path_155path_156path_157path_158path_159path_160path_161path_162path_163path_164path_165path_166path_167path_168path_169path_170path_171path_172path_173path_174path_175path_176path_177path_178path_179path_180path_181path_182path_183path_184path_185path_186path_187path_188path_189path_190path_191path_192path_193path_194path_195path_196path_197path_198path_199path_200path_201path_202path_203path_204path_205path_206path_207path_208path_209path_210path_211path_212path_213path_214path_215path_216path_217path_218path_219path_220path_221path_222path_223path_224path_225path_226path_227path_228path_229path_230path_231path_232path_233path_234path_235path_236path_237path_238path_239path_240path_241path_242path_243path_244path_245path_246path_247path_248path_249path_250path_251path_252path_253path_254path_255path_256path_257path_258path_259path_260path_261path_262path_263path_264path_265path_266path_267path_268path_269path_270path_271path_272path_273path_274path_275path_276path_277path_278path_279path_280path_281path_282path_283path_284path_285path_286path_287path_288path_289path_290path_291path_292path_293path_294path_295path_296path_297path_298path_299path_300path_301path_302path_303path_304path_305path_306path_307path_308path_309path_310path_311path_312path_313path_314path_315
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    develop
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    continue_guides_trans
    t:70.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_release_notes
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    buy_usb_keys
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    assess_press_kit
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    web_graphics_discuss
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    TestingPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    video_schedule
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    video_schedule
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    video
    t:25.0
    tw:25.0
    tn:25.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    ga_press_release_draft
    t:10.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    video_schedule
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    video_schedule
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_release_blog_draft
    t:10.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_submit_remind_1_week
    t:11.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    create_posters
    t:10.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    gather
    t:5.5
    tw:5.5
    tn:5.5
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    software_translation
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    TestingPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    ceo_prepare_final_rc
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_submission_deadline
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    distribute_usb_keys
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    software_translation
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    software_translation
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_rawhide_install
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spotlight_feature1_draft
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_submit_remind_1_week
    t:11.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    create_ga_announce
    t:7.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    coordinate_swag_design
    t:10.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spotlight_feature2_draft
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    ceo_prepare_final_rc
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_submission_deadline
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    software_translation
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    create_alpha_tc
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spotlight_feature3
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_submit_remind_2_weeks
    t:6.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    create_final_tc
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spotlight_feature3_draft
    t:5.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    ceo_prepare_final_rc
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_create_banner
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_releng_tickets
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_submission_deadline
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_banner
    t:3.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    create_final_tc
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    create_final_tc
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spotlight_feature2_drop
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    ceo_prepare_final_rc
    t:2.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spotlight_feature3
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    first_day
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    PlanningPhase_end
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    DevelopmentPhase_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    devel_start
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    TestingPhase_end
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spins_freeze
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    branch_rawhide
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    rawhide_rebase
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_check_remind
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spins_wiki_update
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    feature_submission_deadline_announce
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    spins_submission_deadline
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    warn_rawhide_rebase
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    ticket_rawhide_rebase
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_release_notes
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_spins_ks
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_meeting_announce
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_installer_build1
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    LaunchPhase
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    rc
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    kernel_debug
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    final_wallpaper
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    final_splash
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    ga_release_notes
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    final_release_note_wiki_reminder
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    final_installer_build1
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    all_guides
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    guides_trans_deadline
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    publish_guides
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    elections
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    naming
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    pr
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    beta_release_blog
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    usb_keys_prebriefs
    t:1.0
    tw:1.0
    tn:1.0
    fw:0.0
     c:1.0
    cw:1.0
    cn:1.0
    d:()
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    supplement_wallpaper_submit
    t:82.0
    tw:83.0
    tn:83.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    design_concept
    t:30.0
    tw:31.0
    tn:31.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    alpha_deadline
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    DevelopmentPhase_end
    t:1.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(develop)
    design_concept
    t:30.0
    tw:31.0
    tn:31.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    design_concept
    t:30.0
    tw:31.0
    tn:31.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
     solicit
    t:7.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(remind)
    solicit
    t:7.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(remind)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    solicit
    t:7.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(remind)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    beta_wiki_freeze
    t:2.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta)
    solicit
    t:7.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(remind)
    solicit
    t:7.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(remind)
    software_string_freeze
    t:6.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    start_features_cal
    t:25.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    start_features_cal
    t:25.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    ga_pot_trans
    t:24.0
    tw:25.0
    tn:33.0
    fw:8.0
     c:1.0
    cw:2.0
    cn:6.0
    d:(beta_release_notes trans_release_notes_deadline)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    prepare_usb_keys
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(buy_usb_keys)
    update_press_one_sheet
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(assess_press_kit)
    web_promo_to_brand
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(web_graphics_discuss)
    alpha_start
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(TestingPhase_start)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    video1
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(video_schedule)
    video2
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(video_schedule)
    talking_points
    t:5.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
     beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    ga_press_release_legal
    t:5.0
    tw:15.0
    tn:15.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(ga_press_release_draft)
    video1
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(video_schedule)
    video2
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(video_schedule)
    beta_release_blog_legal
    t:5.0
    tw:15.0
    tn:15.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_release_blog_draft)
    fedora17_eol
    t:20.0
    tw:21.0
    tn:21.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    qa_alpha_compose1
    t:2.0
    tw:13.0
    tn:13.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_submit_remind_1_week)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    polish_poster
    t:9.0
    tw:19.0
    tn:19.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(create_posters)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    board
    t:3.0
    tw:8.5
    tn:8.5
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(gather)
    request_review_image
    t:4.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(software_translation)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    alpha_start
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(TestingPhase_start)
    alpha_meeting_reminder
    t:10.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    start_alpha_beats
    t:6.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    ceo_send_final_rc
    t:2.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(ceo_prepare_final_rc)
    qa_alpha_compose2
    t:3.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_submission_deadline)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    media_prebriefs
    t:6.0
    tw:13.0
    tn:26.0
    fw:13.0
     c:1.0
    cw:2.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    request_review_image
    t:4.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(software_translation)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    request_review_image
    t:4.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(software_translation)
    create_beta_tc
    t:2.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_rawhide_install)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    spotlight_feature1_legal
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(spotlight_feature1_draft)
    alpha_installer_build1
    t:1.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_submit_remind_1_week)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    translate_ga_announce
    t:5.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(create_ga_announce)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    file_ticket
    t:10.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    validate_beat_writers
    t:5.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    beta_wiki_freeze
    t:2.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
     beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    spotlight_feature2_legal
    t:5.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(spotlight_feature2_draft)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    solicit
    t:7.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(remind)
    solicit
    t:7.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(remind)
    ceo_send_final_rc
    t:2.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(ceo_prepare_final_rc)
    qa_alpha_compose2
    t:3.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_submission_deadline)
    beta_wiki_freeze
    t:2.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    alpha_deadline_remind
    t:6.0
    tw:7.0
    tn:77.0
    fw:70.0
     c:1.0
    cw:2.0
    cn:4.0
    d:(feature_freeze alpha_deadline)
    feature_incomplete_fesco
    t:6.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    request_review_image
    t:4.0
    tw:5.0
    tn:5.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(software_translation)
    test_alpha_tc
    t:6.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(create_alpha_tc)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    spotlight_feature3_legal
    t:5.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(spotlight_feature3)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    rawhide_spins
    t:5.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
     trans_software_rebuild1
    t:5.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    test_final_tc
    t:4.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(create_final_tc)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:2.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(alpha_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
    beta_publish_banner
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(beta_create_banner)
     ceo_send_final_rc
    t:2.0
    tw:4.0
    tn:4.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(ceo_prepare_final_rc)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:3.0
    tn:108.0
    fw:105.0
     c:1.0
    cw:2.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
     alpha_installer_build2
    t:2.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_submission_deadline)
     package_spins_ks
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(create_final_tc)
    freeze_spins_ks
    t:1.0
    tw:3.0
    tn:3.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(create_final_tc)
    spotlight_feature2
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(spotlight_feature2_drop)
    ceo_blog
    t:1.0
    tw:3.0
    tn:134.0
    fw:131.0
     c:1.0
    cw:2.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
    bug_trackers
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    supplement_wallpaper_start
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(PlanningPhase_start)
    feature_incomplete_nag
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    orphan
    t:1.0
    tw:2.0
    tn:2.0
    fw:0.0
     c:1.0
    cw:2.0
    cn:2.0
    d:(feature_freeze)
    spotlight_feature_blogs
    t:1.0
    tw:2.0
    tn:13.0
    fw:11.0
     c:1.0
    cw:2.0
    cn:8.0
    d:(spotlight_feature3 spotlight_feature2 spotlight_feature1)
                                      
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    decide_supplement_wallpaper
    t:1.0
    tw:84.0
    tn:84.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(supplement_wallpaper_submit)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    alpha_infrastructure_freeze
    t:10.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    wallpaper_design
    t:35.0
    tw:66.0
    tn:66.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(design_concept)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    alpha_deadline_remind
    t:6.0
    tw:77.0
    tn:77.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:4.0
    d:(feature_freeze alpha_deadline)
    create_alpha_compose
    t:2.0
    tw:73.0
    tn:73.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    alpha_deadline_announce
    t:1.0
    tw:72.0
    tn:72.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    alpha_spins_ks
    t:1.0
    tw:72.0
    tn:72.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    alpha_kernel_build
    t:1.0
    tw:72.0
    tn:72.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    alpha_installer_build
    t:1.0
    tw:72.0
    tn:72.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
    notify_devel_relnotes
    t:1.0
    tw:72.0
    tn:72.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_deadline)
     wallpaper_design
    t:35.0
    tw:66.0
    tn:66.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(design_concept)
    wallpaper_design
    t:35.0
    tw:66.0
    tn:66.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(design_concept)
     announce_nominations
    t:25.0
    tw:33.0
    tn:33.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(solicit)
    announce_nominations
    t:25.0
    tw:33.0
    tn:33.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(solicit)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    announce_nominations
    t:25.0
    tw:33.0
    tn:33.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(solicit)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    trans_review_beta
    t:5.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(beta_wiki_freeze)
    announce_nominations
    t:25.0
    tw:33.0
    tn:33.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(solicit)
    announce_nominations
    t:25.0
    tw:33.0
    tn:33.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(solicit)
    trans_software
    t:25.0
    tw:32.0
    tn:32.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(software_string_freeze)
    clean_market_wiki
    t:5.0
    tw:31.0
    tn:31.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(start_features_cal)
    cycle_market_wiki
    t:5.0
    tw:31.0
    tn:31.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(start_features_cal)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    ga_release_notes_po
    t:1.0
    tw:26.0
    tn:34.0
    fw:8.0
     c:1.0
    cw:3.0
    cn:7.0
    d:(ga_pot_trans)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    send_usb_keys
    t:10.0
    tw:20.0
    tn:20.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(prepare_usb_keys update_press_one_sheet)
    web_copy_review
    t:5.0
    tw:15.0
    tn:15.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(web_promo_to_brand)
    alpha_blocker1
    t:5.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_start)
    unclaimed_beats
    t:6.0
    tw:10.0
    tn:88.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    review_release_video
    t:20.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(video1 video2)
    review_release_video
    t:20.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:5.0
    d:(video1 video2)
    feature_profiles
    t:20.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(talking_points)
    unclaimed_beats
    t:6.0
    tw:10.0
    tn:88.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
     web_content_update
    t:5.0
    tw:8.0
    tn:113.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    web_content_update
    t:5.0
    tw:8.0
    tn:113.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    ga_press_release_intl
    t:6.0
    tw:21.0
    tn:21.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(ga_press_release_legal)
    review_spotlight1_video
    t:15.0
    tw:21.0
    tn:21.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(video1)
    review_spotlight2_video
    t:15.0
    tw:21.0
    tn:21.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(video2)
    beta_release_blog_intl
    t:6.0
    tw:21.0
    tn:21.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(beta_release_blog_legal)
     beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    beta_wallpaper
    t:13.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_rawhide_install1
    t:6.0
    tw:19.0
    tn:19.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(qa_alpha_compose1)
    start_splash_screens
    t:9.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    beta_wallpaper
    t:13.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
     beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    legal
    t:5.0
    tw:13.5
    tn:13.5
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(board)
    build_trans_software
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(request_review_image)
    start_splash_screens
    t:9.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    prep_ga_notes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    prep_ga_notes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    alpha_blocker1
    t:5.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_start)
    alpha_meeting
    t:3.0
    tw:14.0
    tn:14.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(alpha_meeting_reminder)
    comb_alpha_beats
    t:2.0
    tw:9.0
    tn:9.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(start_alpha_beats)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    ceo_solicit_feedback
    t:4.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(ceo_send_final_rc)
    alpha_rawhide_install2
    t:5.0
    tw:9.0
    tn:9.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(qa_alpha_compose2)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    final
    t:1.0
    tw:14.0
    tn:132.0
    fw:118.0
     c:1.0
    cw:3.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    build_trans_software
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(request_review_image)
    unclaimed_beats
    t:6.0
    tw:10.0
    tn:88.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    build_trans_software
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(request_review_image)
    test_beta_tc
    t:6.0
    tw:13.0
    tn:13.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(create_beta_tc)
    irc_sessions
    t:10.0
    tw:13.0
    tn:118.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    media
    t:10.0
    tw:13.0
    tn:118.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    spotlight_feature1_drop
    t:1.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(spotlight_feature1_legal)
     swag_poc
    t:8.0
    tw:12.0
    tn:90.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    swag_funding_request
    t:8.0
    tw:12.0
    tn:90.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
     beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
     ambassador_start
    t:7.0
    tw:11.0
    tn:89.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    start_swag
    t:7.0
    tw:11.0
    tn:89.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    recruite_beat_writers
    t:5.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(validate_beat_writers)
    trans_review_beta
    t:5.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(beta_wiki_freeze)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
     zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
     zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    test_guides_beta
    t:4.0
    tw:7.0
    tn:112.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    test_guides_beta
    t:4.0
    tw:7.0
    tn:112.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    wiki_update
    t:1.0
    tw:9.0
    tn:9.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(solicit)
    advertise_elections
    t:1.0
    tw:9.0
    tn:9.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(solicit)
    ceo_solicit_feedback
    t:4.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(ceo_send_final_rc)
    alpha_installer_build3
    t:4.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(qa_alpha_compose2)
    build_trans_review
    t:5.0
    tw:8.0
    tn:8.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(beta_wiki_freeze)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
      build_trans_software
    t:1.0
    tw:6.0
    tn:6.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(request_review_image)
     beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    spotlight_feature3_drop
    t:1.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:3.0
    cn:3.0
    d:(spotlight_feature3_legal)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
        zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    start_splash_screens_cal
    t:1.0
    tw:5.0
    tn:83.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:10.0
    d:(alpha_drop)
    alpha_drop
    t:1.0
    tw:4.0
    tn:82.0
    fw:78.0
     c:1.0
    cw:3.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:4.0
    tn:108.0
    fw:104.0
     c:1.0
    cw:3.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
     ceo_blog
    t:1.0
    tw:5.0
    tn:134.0
    fw:129.0
     c:1.0
    cw:3.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
    websites_trans_reminder
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    release_posters
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:15.0
    d:(beta_drop)
    beta_release_blog_drop
    t:1.0
    tw:4.0
    tn:109.0
    fw:105.0
     c:1.0
    cw:3.0
    cn:18.0
    d:(beta_drop beta_release_blog_intl)
         spotlight_feature_blogs
    t:1.0
    tw:3.0
    tn:13.0
    fw:10.0
     c:1.0
    cw:3.0
    cn:8.0
    d:(spotlight_feature3 spotlight_feature2 spotlight_feature1)
                                            
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    supplement_license_review
    t:10.0
    tw:94.0
    tn:94.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(decide_supplement_wallpaper)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    remind_beta_blocker1
    t:9.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
     finalize_alpha_wallpaper
    t:3.0
    tw:69.0
    tn:69.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(wallpaper_design)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
    test_alpha_candidate
    t:5.0
    tw:78.0
    tn:78.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
     alpha_go_not
    t:4.0
    tw:77.0
    tn:77.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(create_alpha_compose)
          finalize_alpha_wallpaper
    t:3.0
    tw:69.0
    tn:69.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(wallpaper_design)
    finalize_alpha_wallpaper
    t:3.0
    tw:69.0
    tn:69.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(wallpaper_design)
     collect_questions
    t:8.0
    tw:41.0
    tn:41.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(announce_nominations)
    collect_questions
    t:8.0
    tw:41.0
    tn:41.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(announce_nominations)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    collect_questions
    t:8.0
    tw:41.0
    tn:41.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(announce_nominations)
    event_reports
    t:23.0
    tw:37.0
    tn:155.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:40.0
    d:(final)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    trans_release_notes_deadline
    t:1.0
    tw:9.0
    tn:9.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(trans_review_beta)
    open_questions
    t:1.0
    tw:34.0
    tn:34.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(announce_nominations)
    announce_town
    t:1.0
    tw:34.0
    tn:34.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(announce_nominations)
       media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    ga_release_notes_rpm
    t:2.0
    tw:28.0
    tn:36.0
    fw:8.0
     c:1.0
    cw:4.0
    cn:8.0
    d:(ga_release_notes_po)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    media_prebriefs
    t:6.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:7.0
    d:(send_usb_keys distribute_usb_keys)
    web_copy_send_update
    t:11.0
    tw:26.0
    tn:26.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(web_copy_review)
    alpha_blocker2
    t:5.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(alpha_blocker1)
    port_wiki_publican
    t:3.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:11.0
    d:(unclaimed_beats)
    unclaimed_beats
    t:6.0
    tw:10.0
    tn:88.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
    release_video
    t:1.0
    tw:27.0
    tn:133.0
    fw:106.0
     c:1.0
    cw:4.0
    cn:45.0
    d:(final review_release_video)
    release_video
    t:1.0
    tw:27.0
    tn:133.0
    fw:106.0
     c:1.0
    cw:4.0
    cn:45.0
    d:(final review_release_video)
     port_wiki_publican
    t:3.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:11.0
    d:(unclaimed_beats)
    unclaimed_beats
    t:6.0
    tw:10.0
    tn:88.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
    web_content_update
    t:5.0
    tw:9.0
    tn:113.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    web_content_update
    t:5.0
    tw:9.0
    tn:113.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
     web_freeze
    t:1.0
    tw:9.0
    tn:114.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(web_content_update)
    web_freeze
    t:1.0
    tw:9.0
    tn:114.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(web_content_update)
    marketing_post
    t:10.0
    tw:24.0
    tn:142.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:40.0
    d:(final)
    ga_press_release_drop
    t:1.0
    tw:22.0
    tn:133.0
    fw:111.0
     c:1.0
    cw:4.0
    cn:43.0
    d:(final ga_press_release_intl)
    release_spotlight1_video
    t:1.0
    tw:22.0
    tn:22.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(review_spotlight1_video)
    release_spotlight2_video
    t:1.0
    tw:22.0
    tn:22.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(review_spotlight2_video)
    beta_release_blog_drop
    t:1.0
    tw:22.0
    tn:109.0
    fw:87.0
     c:1.0
    cw:4.0
    cn:18.0
    d:(beta_drop beta_release_blog_intl)
     zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    zero_day_trans
    t:6.0
    tw:10.0
    tn:115.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(zero_day_relnotes)
    package_supplemental_wallpaper
    t:1.0
    tw:18.0
    tn:96.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:11.0
    d:(beta_wallpaper)
    beta_wallpaper
    t:13.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
     finalize_splash_screens
    t:4.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:11.0
    d:(start_splash_screens)
    start_splash_screens
    t:9.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
    package_beta_wallpaper
    t:2.0
    tw:19.0
    tn:97.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:11.0
    d:(beta_wallpaper)
    beta_wallpaper
    t:13.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
     prep_ga_notes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    prep_ga_notes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    vote
    t:4.0
    tw:17.5
    tn:17.5
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(legal)
    trans_software_review
    t:6.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(build_trans_software)
    finalize_splash_screens
    t:4.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:11.0
    d:(start_splash_screens)
    start_splash_screens
    t:9.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
    ga_release_notes_freeze
    t:4.0
    tw:8.0
    tn:113.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(prep_ga_notes)
    ga_release_notes_freeze
    t:4.0
    tw:8.0
    tn:113.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(prep_ga_notes)
    push_updates_rpm
    t:4.0
    tw:18.0
    tn:136.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:40.0
    d:(final)
    alpha_blocker2
    t:5.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(alpha_blocker1)
    alpha_announce
    t:2.0
    tw:16.0
    tn:16.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(alpha_meeting)
    prep_alpha_notes
    t:6.0
    tw:15.0
    tn:15.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(comb_alpha_beats)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    rh_web_goes_live
    t:1.0
    tw:15.0
    tn:133.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:44.0
    d:(final web_copy_send_update)
    ga_press_release_drop
    t:1.0
    tw:15.0
    tn:133.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:43.0
    d:(final ga_press_release_intl)
    ceo_blog_drop
    t:1.0
    tw:15.0
    tn:133.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:45.0
    d:(final ceo_blog_legal)
    ceo_blog_draft
    t:3.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(ceo_solicit_feedback)
    qa_alpha_compose3
    t:1.0
    tw:10.0
    tn:10.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(alpha_rawhide_install2)
    post_tech_notes
    t:1.0
    tw:15.0
    tn:133.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:40.0
    d:(final)
    final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    release_video
    t:1.0
    tw:15.0
    tn:133.0
    fw:118.0
     c:1.0
    cw:4.0
    cn:45.0
    d:(final review_release_video)
    trans_software_review
    t:6.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(build_trans_software)
    port_wiki_publican
    t:3.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:11.0
    d:(unclaimed_beats)
    unclaimed_beats
    t:6.0
    tw:10.0
    tn:88.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
    irc_sessions
    t:10.0
    tw:14.0
    tn:118.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    media
    t:10.0
    tw:14.0
    tn:118.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    trans_software_review
    t:6.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(build_trans_software)
       spotlight_feature1
    t:1.0
    tw:12.0
    tn:12.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(spotlight_feature1_drop)
      swag_poc
    t:8.0
    tw:12.0
    tn:90.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
     swag_funding_request
    t:8.0
    tw:12.0
    tn:90.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
     zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
      ambassador_start
    t:7.0
    tw:11.0
    tn:89.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
     start_swag
    t:7.0
    tw:11.0
    tn:89.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
     trans_release_notes_deadline
    t:1.0
    tw:9.0
    tn:9.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(trans_review_beta)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    zero_day_trans
    t:6.0
    tw:10.0
    tn:115.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(zero_day_relnotes)
     zero_day_web
    t:6.0
    tw:10.0
    tn:115.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_rpm
    t:6.0
    tw:10.0
    tn:115.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_pot
    t:6.0
    tw:10.0
    tn:115.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    test_guides_beta
    t:4.0
    tw:8.0
    tn:112.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    test_guides_beta
    t:4.0
    tw:8.0
    tn:112.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
     final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    refresh_pot
    t:1.0
    tw:8.0
    tn:113.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(test_guides_beta)
    republish_draft
    t:1.0
    tw:8.0
    tn:113.0
    fw:105.0
     c:1.0
    cw:4.0
    cn:16.0
    d:(test_guides_beta)
      ceo_blog
    t:1.0
    tw:9.0
    tn:134.0
    fw:125.0
     c:1.0
    cw:4.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
      zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
      compose_review_image
    t:1.0
    tw:7.0
    tn:7.0
    fw:0.0
     c:1.0
    cw:4.0
    cn:4.0
    d:(build_trans_software)
     zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
     final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
        final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:5.0
    tn:132.0
    fw:127.0
     c:1.0
    cw:4.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
     start_splash_screens_cal
    t:1.0
    tw:5.0
    tn:83.0
    fw:78.0
     c:1.0
    cw:4.0
    cn:10.0
    d:(alpha_drop)
    websites_trans_reminder
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    release_posters
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:15.0
    d:(beta_drop)
    beta_release_blog_drop
    t:1.0
    tw:5.0
    tn:109.0
    fw:104.0
     c:1.0
    cw:4.0
    cn:18.0
    d:(beta_drop beta_release_blog_intl)
                                                       
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
     stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    stage_alpha
    t:3.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
      package_alpha_wallpaper
    t:2.0
    tw:71.0
    tn:71.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(finalize_alpha_wallpaper)
    start_stage_alpha
    t:1.0
    tw:79.0
    tn:79.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
    start_stage_alpha
    t:1.0
    tw:79.0
    tn:79.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(test_alpha_candidate)
            alpha_wallpaper_deadline
    t:1.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(finalize_alpha_wallpaper)
    blog_alpha_wallpaper
    t:1.0
    tw:70.0
    tn:70.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(finalize_alpha_wallpaper)
     collect_answers
    t:7.0
    tw:48.0
    tn:48.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(collect_questions)
    collect_answers
    t:7.0
    tw:48.0
    tn:48.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(collect_questions)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    collect_answers
    t:7.0
    tw:48.0
    tn:48.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(collect_questions)
     final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    ga_pot_trans
    t:24.0
    tw:33.0
    tn:33.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:6.0
    d:(beta_release_notes trans_release_notes_deadline)
         final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
     final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    event_reports
    t:23.0
    tw:28.0
    tn:155.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:40.0
    d:(final)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:27.0
    tn:132.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    rh_web_goes_live
    t:1.0
    tw:27.0
    tn:133.0
    fw:106.0
     c:1.0
    cw:5.0
    cn:44.0
    d:(final web_copy_send_update)
    alpha_blocker3
    t:5.0
    tw:17.0
    tn:17.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(alpha_blocker2)
    trans_release_notes
    t:14.0
    tw:27.0
    tn:105.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:12.0
    d:(port_wiki_publican)
    port_wiki_publican
    t:3.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:11.0
    d:(unclaimed_beats)
       release_notes_pot1
    t:13.0
    tw:26.0
    tn:104.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:12.0
    d:(port_wiki_publican)
    port_wiki_publican
    t:3.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:11.0
    d:(unclaimed_beats)
    web_freeze
    t:1.0
    tw:10.0
    tn:114.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(web_content_update)
    web_freeze
    t:1.0
    tw:10.0
    tn:114.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(web_content_update)
     web_create_pot
    t:1.0
    tw:10.0
    tn:115.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(web_freeze)
    web_create_pot
    t:1.0
    tw:10.0
    tn:115.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(web_freeze)
     ga_press_release
    t:1.0
    tw:23.0
    tn:134.0
    fw:111.0
     c:1.0
    cw:5.0
    cn:44.0
    d:(ga_press_release_drop)
        zero_day_trans
    t:6.0
    tw:11.0
    tn:115.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_deadline
    t:10.0
    tw:20.0
    tn:125.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(zero_day_trans)
    supplement_wallpaper_end
    t:1.0
    tw:19.0
    tn:97.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:12.0
    d:(package_supplemental_wallpaper)
    package_supplemental_wallpaper
    t:1.0
    tw:18.0
    tn:96.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:11.0
    d:(beta_wallpaper)
     package_final_splash
    t:2.0
    tw:19.0
    tn:97.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:12.0
    d:(finalize_splash_screens)
    finalize_splash_screens
    t:4.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:11.0
    d:(start_splash_screens)
     package_beta_wallpaper
    t:2.0
    tw:19.0
    tn:97.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:11.0
    d:(beta_wallpaper)
     ga_release_notes_freeze
    t:4.0
    tw:9.0
    tn:113.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(prep_ga_notes)
    ga_release_notes_freeze
    t:4.0
    tw:9.0
    tn:113.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(prep_ga_notes)
    announce_name
    t:1.0
    tw:18.5
    tn:18.5
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(vote)
    trans_software_deadline
    t:1.0
    tw:13.0
    tn:13.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(trans_software_review)
    splash_deadline
    t:1.0
    tw:18.0
    tn:96.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:12.0
    d:(finalize_splash_screens)
    finalize_splash_screens
    t:4.0
    tw:17.0
    tn:95.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:11.0
    d:(start_splash_screens)
    wiki_ga_port
    t:5.0
    tw:13.0
    tn:118.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(ga_release_notes_freeze)
    wiki_ga_port
    t:5.0
    tw:13.0
    tn:118.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(ga_release_notes_freeze)
     daily_alpha_blocker
    t:4.0
    tw:16.0
    tn:16.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(alpha_blocker2)
     post_notes
    t:1.0
    tw:16.0
    tn:16.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(prep_alpha_notes)
    final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    redhat_com_update
    t:1.0
    tw:16.0
    tn:134.0
    fw:118.0
     c:1.0
    cw:5.0
    cn:45.0
    d:(rh_web_goes_live)
    ga_press_release
    t:1.0
    tw:16.0
    tn:134.0
    fw:118.0
     c:1.0
    cw:5.0
    cn:44.0
    d:(ga_press_release_drop)
    ceo_blog
    t:1.0
    tw:16.0
    tn:134.0
    fw:118.0
     c:1.0
    cw:5.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
    ceo_blog_legal
    t:3.0
    tw:14.0
    tn:14.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(ceo_blog_draft)
    alpha_rawhide_install3
    t:5.0
    tw:15.0
    tn:15.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(qa_alpha_compose3)
     marketing_post
    t:10.0
    tw:15.0
    tn:142.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:40.0
    d:(final)
     trans_software_deadline
    t:1.0
    tw:13.0
    tn:13.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(trans_software_review)
    start_release_notes_pot1
    t:1.0
    tw:14.0
    tn:92.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:12.0
    d:(port_wiki_publican)
    port_wiki_publican
    t:3.0
    tw:13.0
    tn:91.0
    fw:78.0
     c:1.0
    cw:5.0
    cn:11.0
    d:(unclaimed_beats)
      trans_software_rebuild2
    t:1.0
    tw:13.0
    tn:13.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(trans_software_review)
       spotlight_feature_blogs
    t:1.0
    tw:13.0
    tn:13.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:8.0
    d:(spotlight_feature3 spotlight_feature2 spotlight_feature1)
          zero_day_trans
    t:6.0
    tw:11.0
    tn:115.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(zero_day_relnotes)
          build_beta_relnotes
    t:2.0
    tw:11.0
    tn:11.0
    fw:0.0
     c:1.0
    cw:5.0
    cn:5.0
    d:(trans_release_notes_deadline)
    zero_day_web
    t:6.0
    tw:11.0
    tn:115.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_rpm
    t:6.0
    tw:11.0
    tn:115.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_pot
    t:6.0
    tw:11.0
    tn:115.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(zero_day_relnotes)
    web_post
    t:1.0
    tw:11.0
    tn:116.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(zero_day_trans)
        final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    refresh_pot
    t:1.0
    tw:9.0
    tn:113.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(test_guides_beta)
    republish_draft
    t:1.0
    tw:9.0
    tn:113.0
    fw:104.0
     c:1.0
    cw:5.0
    cn:16.0
    d:(test_guides_beta)
     push_updates_rpm
    t:4.0
    tw:9.0
    tn:136.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:40.0
    d:(final)
    notify_trans_refresh
    t:1.0
    tw:9.0
    tn:114.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(refresh_pot)
    notify_revised_draft
    t:1.0
    tw:9.0
    tn:114.0
    fw:105.0
     c:1.0
    cw:5.0
    cn:17.0
    d:(republish_draft)
         final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
        final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:6.0
    tn:132.0
    fw:126.0
     c:1.0
    cw:5.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
     rh_web_goes_live
    t:1.0
    tw:6.0
    tn:133.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:44.0
    d:(final web_copy_send_update)
    ga_press_release_drop
    t:1.0
    tw:6.0
    tn:133.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:43.0
    d:(final ga_press_release_intl)
    ceo_blog_drop
    t:1.0
    tw:6.0
    tn:133.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:45.0
    d:(final ceo_blog_legal)
        post_tech_notes
    t:1.0
    tw:6.0
    tn:133.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:40.0
    d:(final)
    release_video
    t:1.0
    tw:6.0
    tn:133.0
    fw:127.0
     c:1.0
    cw:5.0
    cn:45.0
    d:(final review_release_video)
                                                            
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_branch_guides
    t:10.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    beta_blocker1
    t:3.0
    tw:84.0
    tn:84.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    test_alpha
    t:15.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
     test_branch_guides
    t:10.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_branch_guides
    t:10.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    test_branch_guides
    t:10.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    beta_blocker1
    t:3.0
    tw:84.0
    tn:84.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    review_bookmarks
    t:5.0
    tw:86.0
    tn:86.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    beta_blocker1
    t:3.0
    tw:84.0
    tn:84.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    alpha_drop
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:9.0
    d:(stage_alpha alpha_banner alpha_publish_banner)
    beta_releng_tickets
    t:2.0
    tw:83.0
    tn:83.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
    nvr_testing
    t:1.0
    tw:82.0
    tn:82.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(stage_alpha)
      alpha_wallpaper_feedback
    t:10.0
    tw:81.0
    tn:81.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(package_alpha_wallpaper)
    notify_mirrors_alpha
    t:1.0
    tw:80.0
    tn:80.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(start_stage_alpha)
    alpha_export_control
    t:1.0
    tw:80.0
    tn:80.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(start_stage_alpha)
               present_answers
    t:2.0
    tw:50.0
    tn:50.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(collect_answers)
    present_answers
    t:2.0
    tw:50.0
    tn:50.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(collect_answers)
    event_reports
    t:23.0
    tw:50.0
    tn:155.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    event_reports
    t:23.0
    tw:50.0
    tn:155.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    question_deadline
    t:1.0
    tw:49.0
    tn:49.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(collect_answers)
     marketing_post
    t:10.0
    tw:37.0
    tn:142.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    marketing_post
    t:10.0
    tw:37.0
    tn:142.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    ga_release_notes_po
    t:1.0
    tw:34.0
    tn:34.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:7.0
    d:(ga_pot_trans)
         push_updates_rpm
    t:4.0
    tw:31.0
    tn:136.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    push_updates_rpm
    t:4.0
    tw:31.0
    tn:136.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    event_reports
    t:23.0
    tw:29.0
    tn:155.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    rh_web_goes_live
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:44.0
    d:(final web_copy_send_update)
    rh_web_goes_live
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:44.0
    d:(final web_copy_send_update)
    ga_press_release_drop
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:43.0
    d:(final ga_press_release_intl)
    ga_press_release_drop
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:43.0
    d:(final ga_press_release_intl)
    ceo_blog_drop
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(final ceo_blog_legal)
    ceo_blog_drop
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(final ceo_blog_legal)
     post_tech_notes
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    post_tech_notes
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
     release_video
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(final review_release_video)
    release_video
    t:1.0
    tw:28.0
    tn:133.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(final review_release_video)
    redhat_com_update
    t:1.0
    tw:28.0
    tn:134.0
    fw:106.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(rh_web_goes_live)
    alpha_blocker4
    t:5.0
    tw:22.0
    tn:22.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(alpha_blocker3)
     trans_release_notes
    t:14.0
    tw:27.0
    tn:105.0
    fw:78.0
     c:1.0
    cw:6.0
    cn:12.0
    d:(port_wiki_publican)
        release_notes_pot1
    t:13.0
    tw:26.0
    tn:104.0
    fw:78.0
     c:1.0
    cw:6.0
    cn:12.0
    d:(port_wiki_publican)
    web_create_pot
    t:1.0
    tw:11.0
    tn:115.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(web_freeze)
    web_create_pot
    t:1.0
    tw:11.0
    tn:115.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(web_freeze)
     trans_web
    t:9.0
    tw:19.0
    tn:124.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:18.0
    d:(web_create_pot)
    trans_web
    t:9.0
    tw:19.0
    tn:124.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:18.0
    d:(web_create_pot)
          zero_day_deadline
    t:10.0
    tw:21.0
    tn:125.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(zero_day_trans)
      supplement_wallpaper_end
    t:1.0
    tw:19.0
    tn:97.0
    fw:78.0
     c:1.0
    cw:6.0
    cn:12.0
    d:(package_supplemental_wallpaper)
      package_final_splash
    t:2.0
    tw:19.0
    tn:97.0
    fw:78.0
     c:1.0
    cw:6.0
    cn:12.0
    d:(finalize_splash_screens)
       wiki_ga_port
    t:5.0
    tw:14.0
    tn:118.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(ga_release_notes_freeze)
    wiki_ga_port
    t:5.0
    tw:14.0
    tn:118.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(ga_release_notes_freeze)
     trans_rebuild
    t:5.0
    tw:18.0
    tn:18.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(trans_software_deadline)
     splash_deadline
    t:1.0
    tw:18.0
    tn:96.0
    fw:78.0
     c:1.0
    cw:6.0
    cn:12.0
    d:(finalize_splash_screens)
    ga_release_notes_pot
    t:1.0
    tw:14.0
    tn:119.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:18.0
    d:(wiki_ga_port)
    ga_release_notes_pot
    t:1.0
    tw:14.0
    tn:119.0
    fw:105.0
     c:1.0
    cw:6.0
    cn:18.0
    d:(wiki_ga_port)
        marketing_post
    t:10.0
    tw:16.0
    tn:142.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
       ceo_blog_drop
    t:1.0
    tw:15.0
    tn:133.0
    fw:118.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(final ceo_blog_legal)
        start_trans_rebuild
    t:1.0
    tw:14.0
    tn:14.0
    fw:0.0
     c:1.0
    cw:6.0
    cn:6.0
    d:(trans_software_deadline)
     start_release_notes_pot1
    t:1.0
    tw:14.0
    tn:92.0
    fw:78.0
     c:1.0
    cw:6.0
    cn:12.0
    d:(port_wiki_publican)
                 web_post
    t:1.0
    tw:12.0
    tn:116.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(zero_day_trans)
                   push_updates_rpm
    t:4.0
    tw:10.0
    tn:136.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    notify_trans_refresh
    t:1.0
    tw:10.0
    tn:114.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(refresh_pot)
    notify_revised_draft
    t:1.0
    tw:10.0
    tn:114.0
    fw:104.0
     c:1.0
    cw:6.0
    cn:17.0
    d:(republish_draft)
             rh_web_goes_live
    t:1.0
    tw:7.0
    tn:133.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:44.0
    d:(final web_copy_send_update)
    ga_press_release_drop
    t:1.0
    tw:7.0
    tn:133.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:43.0
    d:(final ga_press_release_intl)
    ceo_blog_drop
    t:1.0
    tw:7.0
    tn:133.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(final ceo_blog_legal)
        post_tech_notes
    t:1.0
    tw:7.0
    tn:133.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:40.0
    d:(final)
    release_video
    t:1.0
    tw:7.0
    tn:133.0
    fw:126.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(final review_release_video)
     redhat_com_update
    t:1.0
    tw:7.0
    tn:134.0
    fw:127.0
     c:1.0
    cw:6.0
    cn:45.0
    d:(rh_web_goes_live)
    ga_press_release
    t:1.0
    tw:7.0
    tn:134.0
    fw:127.0
     c:1.0
    cw:6.0
    cn:44.0
    d:(ga_press_release_drop)
    ceo_blog
    t:1.0
    tw:7.0
    tn:134.0
    fw:127.0
     c:1.0
    cw:6.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
                                                                  
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    branch_guides
    t:1.0
    tw:92.0
    tn:92.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_branch_guides)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_infrastructure_freeze
    t:10.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    unclaimed_beats
    t:6.0
    tw:88.0
    tn:88.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    unclaimed_beats
    t:6.0
    tw:88.0
    tn:88.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    alpha_end
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_blocker2
    t:5.0
    tw:89.0
    tn:89.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(beta_blocker1)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_deadline
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    beta_wallpaper
    t:13.0
    tw:95.0
    tn:95.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    feature_complete
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_alpha)
    start_splash_screens
    t:9.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    beta_wallpaper
    t:13.0
    tw:95.0
    tn:95.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    start_splash_screens
    t:9.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
     branch_guides
    t:1.0
    tw:92.0
    tn:92.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_branch_guides)
    branch_guides
    t:1.0
    tw:92.0
    tn:92.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_branch_guides)
    branch_guides
    t:1.0
    tw:92.0
    tn:92.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(test_branch_guides)
    beta_blocker2
    t:5.0
    tw:89.0
    tn:89.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(beta_blocker1)
    unclaimed_beats
    t:6.0
    tw:88.0
    tn:88.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    swag_poc
    t:8.0
    tw:90.0
    tn:90.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    swag_funding_request
    t:8.0
    tw:90.0
    tn:90.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    ambassador_start
    t:7.0
    tw:89.0
    tn:89.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    start_swag
    t:7.0
    tw:89.0
    tn:89.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
    update_bookmarks
    t:2.0
    tw:88.0
    tn:88.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(review_bookmarks)
    remind_beta_blocker2
    t:3.0
    tw:87.0
    tn:87.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(beta_blocker1)
    start_splash_screens_cal
    t:1.0
    tw:83.0
    tn:83.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:10.0
    d:(alpha_drop)
                      post_questions
    t:1.0
    tw:51.0
    tn:51.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(present_answers)
    post_questions
    t:1.0
    tw:51.0
    tn:51.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(present_answers)
          ga_release_notes_rpm
    t:2.0
    tw:36.0
    tn:36.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:8.0
    d:(ga_release_notes_po)
            redhat_com_update
    t:1.0
    tw:29.0
    tn:134.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:45.0
    d:(rh_web_goes_live)
    redhat_com_update
    t:1.0
    tw:29.0
    tn:134.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:45.0
    d:(rh_web_goes_live)
    ga_press_release
    t:1.0
    tw:29.0
    tn:134.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:44.0
    d:(ga_press_release_drop)
    ga_press_release
    t:1.0
    tw:29.0
    tn:134.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:44.0
    d:(ga_press_release_drop)
    ceo_blog
    t:1.0
    tw:29.0
    tn:134.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
    ceo_blog
    t:1.0
    tw:29.0
    tn:134.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
           alpha_blocker5
    t:5.0
    tw:27.0
    tn:27.0
    fw:0.0
     c:1.0
    cw:7.0
    cn:7.0
    d:(alpha_blocker4)
           trans_web
    t:9.0
    tw:20.0
    tn:124.0
    fw:104.0
     c:1.0
    cw:7.0
    cn:18.0
    d:(web_create_pot)
    trans_web
    t:9.0
    tw:20.0
    tn:124.0
    fw:104.0
     c:1.0
    cw:7.0
    cn:18.0
    d:(web_create_pot)
     review_trans_web
    t:4.0
    tw:23.0
    tn:128.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:19.0
    d:(trans_web)
    review_trans_web
    t:4.0
    tw:23.0
    tn:128.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:19.0
    d:(trans_web)
                    ga_release_notes_pot
    t:1.0
    tw:15.0
    tn:119.0
    fw:104.0
     c:1.0
    cw:7.0
    cn:18.0
    d:(wiki_ga_port)
    ga_release_notes_pot
    t:1.0
    tw:15.0
    tn:119.0
    fw:104.0
     c:1.0
    cw:7.0
    cn:18.0
    d:(wiki_ga_port)
        build_trans_review_final
    t:4.0
    tw:18.0
    tn:123.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:19.0
    d:(ga_release_notes_pot)
    build_ga_trans_review
    t:4.0
    tw:18.0
    tn:123.0
    fw:105.0
     c:1.0
    cw:7.0
    cn:19.0
    d:(ga_release_notes_pot)
            ceo_blog
    t:1.0
    tw:16.0
    tn:134.0
    fw:118.0
     c:1.0
    cw:7.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
                                                    redhat_com_update
    t:1.0
    tw:8.0
    tn:134.0
    fw:126.0
     c:1.0
    cw:7.0
    cn:45.0
    d:(rh_web_goes_live)
    ga_press_release
    t:1.0
    tw:8.0
    tn:134.0
    fw:126.0
     c:1.0
    cw:7.0
    cn:44.0
    d:(ga_press_release_drop)
    ceo_blog
    t:1.0
    tw:8.0
    tn:134.0
    fw:126.0
     c:1.0
    cw:7.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
                                                                            
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    guides_pot
    t:1.0
    tw:93.0
    tn:93.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(branch_guides)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    call_for_events
    t:12.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_countdown
    t:10.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
     beta_meeting_reminder
    t:4.0
    tw:101.0
    tn:101.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    beta_meeting_reminder
    t:4.0
    tw:101.0
    tn:101.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    beta_meeting_reminder
    t:4.0
    tw:101.0
    tn:101.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    srpm_review
    t:6.0
    tw:103.0
    tn:103.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    port_wiki_publican
    t:3.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:11.0
    d:(unclaimed_beats)
    port_wiki_publican
    t:3.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:11.0
    d:(unclaimed_beats)
    final_release_notes_reminder
    t:7.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    create_beta_compose
    t:2.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    beta_marketing_notes
    t:5.0
    tw:102.0
    tn:102.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(alpha_end)
    brief_ambassadors
    t:5.0
    tw:102.0
    tn:102.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    beta_blocker3
    t:5.0
    tw:94.0
    tn:94.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_blocker2)
    final_feature_fesco
    t:1.0
    tw:98.0
    tn:98.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    beta_kernel_build
    t:1.0
    tw:98.0
    tn:98.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    beta_installer_build
    t:1.0
    tw:98.0
    tn:98.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_deadline)
    package_supplemental_wallpaper
    t:1.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:11.0
    d:(beta_wallpaper)
     finalize_splash_screens
    t:4.0
    tw:95.0
    tn:95.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:11.0
    d:(start_splash_screens)
    package_beta_wallpaper
    t:2.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:11.0
    d:(beta_wallpaper)
    finalize_splash_screens
    t:4.0
    tw:95.0
    tn:95.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:11.0
    d:(start_splash_screens)
     guides_pot
    t:1.0
    tw:93.0
    tn:93.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(branch_guides)
    guides_pot
    t:1.0
    tw:93.0
    tn:93.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(branch_guides)
    publish_draft
    t:1.0
    tw:93.0
    tn:93.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(branch_guides)
    daily_beta_blocker
    t:4.0
    tw:93.0
    tn:93.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(beta_blocker2)
    port_wiki_publican
    t:3.0
    tw:91.0
    tn:91.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:11.0
    d:(unclaimed_beats)
        tag_bookmarks
    t:1.0
    tw:89.0
    tn:89.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(update_bookmarks)
                        town_hall
    t:6.0
    tw:57.0
    tn:57.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(post_questions)
    town_hall
    t:6.0
    tw:57.0
    tn:57.0
    fw:0.0
     c:1.0
    cw:8.0
    cn:8.0
    d:(post_questions)
                                        review_trans_web
    t:4.0
    tw:24.0
    tn:128.0
    fw:104.0
     c:1.0
    cw:8.0
    cn:19.0
    d:(trans_web)
    review_trans_web
    t:4.0
    tw:24.0
    tn:128.0
    fw:104.0
     c:1.0
    cw:8.0
    cn:19.0
    d:(trans_web)
     finish_trans_web
    t:1.0
    tw:24.0
    tn:129.0
    fw:105.0
     c:1.0
    cw:8.0
    cn:20.0
    d:(review_trans_web)
    publish_trans_web
    t:1.0
    tw:24.0
    tn:129.0
    fw:105.0
     c:1.0
    cw:8.0
    cn:20.0
    d:(review_trans_web)
                    build_trans_review_final
    t:4.0
    tw:19.0
    tn:123.0
    fw:104.0
     c:1.0
    cw:8.0
    cn:19.0
    d:(ga_release_notes_pot)
    build_ga_trans_review
    t:4.0
    tw:19.0
    tn:123.0
    fw:104.0
     c:1.0
    cw:8.0
    cn:19.0
    d:(ga_release_notes_pot)
                                                                                                                                              
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    guides_trans
    t:39.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(guides_pot)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    logistics_budget
    t:10.0
    tw:119.0
    tn:119.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(call_for_events)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    publish_countdown
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_countdown)
     beta_meeting
    t:3.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(beta_meeting_reminder)
    beta_meeting
    t:3.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(beta_meeting_reminder)
    beta_meeting
    t:3.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(beta_meeting_reminder)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    test_beta2
    t:5.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
    guides_final_build
    t:3.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(srpm_review)
    trans_release_notes
    t:14.0
    tw:105.0
    tn:105.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:12.0
    d:(port_wiki_publican)
    release_notes_pot1
    t:13.0
    tw:104.0
    tn:104.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:12.0
    d:(port_wiki_publican)
     beta_go_not
    t:4.0
    tw:103.0
    tn:103.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(create_beta_compose)
      beta_blocker4
    t:5.0
    tw:99.0
    tn:99.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(beta_blocker3)
       supplement_wallpaper_end
    t:1.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:12.0
    d:(package_supplemental_wallpaper)
     package_final_splash
    t:2.0
    tw:97.0
    tn:97.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:12.0
    d:(finalize_splash_screens)
     splash_deadline
    t:1.0
    tw:96.0
    tn:96.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:12.0
    d:(finalize_splash_screens)
     notify_trans
    t:1.0
    tw:94.0
    tn:94.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(guides_pot)
    trans_all_guides
    t:1.0
    tw:94.0
    tn:94.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(guides_pot)
    annouce_publish_draft
    t:1.0
    tw:94.0
    tn:94.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(publish_draft)
     start_release_notes_pot1
    t:1.0
    tw:92.0
    tn:92.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:12.0
    d:(port_wiki_publican)
                             voting_application
    t:1.0
    tw:58.0
    tn:58.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(town_hall)
    voting_application
    t:1.0
    tw:58.0
    tn:58.0
    fw:0.0
     c:1.0
    cw:9.0
    cn:9.0
    d:(town_hall)
                                        finish_trans_web
    t:1.0
    tw:25.0
    tn:129.0
    fw:104.0
     c:1.0
    cw:9.0
    cn:20.0
    d:(review_trans_web)
    publish_trans_web
    t:1.0
    tw:25.0
    tn:129.0
    fw:104.0
     c:1.0
    cw:9.0
    cn:20.0
    d:(review_trans_web)
                                                                                                                                                                   
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
     stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    start_stage_beta
    t:1.0
    tw:105.0
    tn:105.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    event_deadline
    t:1.0
    tw:120.0
    tn:120.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(logistics_budget)
    start_stage_beta
    t:1.0
    tw:105.0
    tn:105.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    stage_beta
    t:3.0
    tw:107.0
    tn:107.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
      web_notes
    t:2.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(beta_meeting)
    tech_web_notes
    t:2.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(beta_meeting)
    beta_announce
    t:2.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(beta_meeting)
    start_stage_beta
    t:1.0
    tw:105.0
    tn:105.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
    start_stage_beta
    t:1.0
    tw:105.0
    tn:105.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(test_beta2)
                                                   voting
    t:6.0
    tw:64.0
    tn:64.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(voting_application)
    voting_start
    t:1.0
    tw:59.0
    tn:59.0
    fw:0.0
     c:1.0
    cw:10.0
    cn:10.0
    d:(voting_application)
                                                                                                                                                                                                         
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    screenshots
    t:5.0
    tw:112.0
    tn:112.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
     beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_test
    t:14.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    ga_blocker1
    t:1.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(start_stage_beta)
    budget_allocations
    t:1.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(event_deadline)
    ga_blocker1
    t:1.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(start_stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    screenshots
    t:5.0
    tw:112.0
    tn:112.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    screenshots
    t:5.0
    tw:112.0
    tn:112.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    screenshots
    t:5.0
    tw:112.0
    tn:112.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    rc_rawhide_install
    t:7.0
    tw:114.0
    tn:114.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
    final_releng_tickets
    t:2.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(stage_beta)
    beta_drop
    t:1.0
    tw:108.0
    tn:108.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:14.0
    d:(stage_beta beta_create_banner beta_publish_banner)
         notify_mirrors_beta
    t:1.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(start_stage_beta)
    beta_export_control
    t:1.0
    tw:106.0
    tn:106.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(start_stage_beta)
                                                   voting_end
    t:1.0
    tw:65.0
    tn:65.0
    fw:0.0
     c:1.0
    cw:11.0
    cn:11.0
    d:(voting)
                                                                                                                                                                                                          
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    monitor
    t:29.0
    tw:141.0
    tn:141.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(screenshots)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    testmile
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
     final_infrastructure_freeze
    t:10.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    web_content_update
    t:5.0
    tw:113.0
    tn:113.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    web_content_update
    t:5.0
    tw:113.0
    tn:113.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    final_meeting_reminder
    t:5.0
    tw:126.0
    tn:126.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    prep_ga_notes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    prep_ga_notes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    final_change_deadline
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    enable_updates
    t:2.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(beta_test)
    ga_blocker2
    t:5.0
    tw:111.0
    tn:111.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(ga_blocker1)
     ga_blocker2
    t:5.0
    tw:111.0
    tn:111.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(ga_blocker1)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    irc_sessions
    t:10.0
    tw:118.0
    tn:118.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    media
    t:10.0
    tw:118.0
    tn:118.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    final_screenshots
    t:5.0
    tw:117.0
    tn:117.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(screenshots)
    final_marketing_notes
    t:5.0
    tw:117.0
    tn:117.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(screenshots)
    briefings
    t:5.0
    tw:117.0
    tn:117.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(screenshots)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
     zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    test_guides_beta
    t:4.0
    tw:112.0
    tn:112.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    test_guides_beta
    t:4.0
    tw:112.0
    tn:112.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    zero_day_relnotes
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    websites_trans_reminder
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
    release_posters
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:15.0
    d:(beta_drop)
     beta_release_blog_drop
    t:1.0
    tw:109.0
    tn:109.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:18.0
    d:(beta_drop beta_release_blog_intl)
                                                          announce_results
    t:1.0
    tw:66.0
    tn:66.0
    fw:0.0
     c:1.0
    cw:12.0
    cn:12.0
    d:(voting_end)
                                                                                                                                                                                                          
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
     start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    ga_create_banners
    t:9.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(testmile)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
      start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    build_daily
    t:9.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    review_daily
    t:9.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    web_freeze
    t:1.0
    tw:114.0
    tn:114.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(web_content_update)
    web_freeze
    t:1.0
    tw:114.0
    tn:114.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(web_content_update)
    ga_meeting
    t:3.0
    tw:129.0
    tn:129.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_meeting_reminder)
    start_final_compose
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    zero_day_trans
    t:6.0
    tw:115.0
    tn:115.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(zero_day_relnotes)
    guides_string_freeze
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    guides_string_freeze
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    check_swag
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    announce_final_change_deadline
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    eol_warning
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
    ga_release_notes_freeze
    t:4.0
    tw:113.0
    tn:113.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(prep_ga_notes)
    ga_release_notes_freeze
    t:4.0
    tw:113.0
    tn:113.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(prep_ga_notes)
    final_installer_build
    t:1.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(final_change_deadline)
     ga_blocker3
    t:5.0
    tw:116.0
    tn:116.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(ga_blocker2)
     ga_blocker3
    t:5.0
    tw:116.0
    tn:116.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:13.0
    d:(ga_blocker2)
    final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
         zero_day_trans
    t:6.0
    tw:115.0
    tn:115.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_web
    t:6.0
    tw:115.0
    tn:115.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_rpm
    t:6.0
    tw:115.0
    tn:115.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(zero_day_relnotes)
    zero_day_pot
    t:6.0
    tw:115.0
    tn:115.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(zero_day_relnotes)
     final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    refresh_pot
    t:1.0
    tw:113.0
    tn:113.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(test_guides_beta)
    republish_draft
    t:1.0
    tw:113.0
    tn:113.0
    fw:0.0
     c:1.0
    cw:13.0
    cn:16.0
    d:(test_guides_beta)
    final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:110.0
    tn:132.0
    fw:22.0
     c:1.0
    cw:13.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
                                                                                                                                                                                                                                                                     
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
     deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    event_reports
    t:23.0
    tw:133.0
    tn:155.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:40.0
    d:(final)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    ga_publish_banners
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(ga_create_banners)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
      deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    deliver_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
      web_create_pot
    t:1.0
    tw:115.0
    tn:115.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(web_freeze)
    web_create_pot
    t:1.0
    tw:115.0
    tn:115.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(web_freeze)
     final_go_not
    t:4.0
    tw:127.0
    tn:127.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(start_final_compose)
    zero_day_deadline
    t:10.0
    tw:125.0
    tn:125.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(zero_day_trans)
    generate_final_pot
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(guides_string_freeze)
    notify_trans_final
    t:1.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(guides_string_freeze)
       wiki_ga_port
    t:5.0
    tw:118.0
    tn:118.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(ga_release_notes_freeze)
    wiki_ga_port
    t:5.0
    tw:118.0
    tn:118.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(ga_release_notes_freeze)
      ga_blocker4
    t:5.0
    tw:121.0
    tn:121.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(ga_blocker3)
     daily_ga_blocker
    t:4.0
    tw:120.0
    tn:120.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:14.0
    d:(ga_blocker3)
    marketing_post
    t:10.0
    tw:120.0
    tn:142.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:40.0
    d:(final)
         web_post
    t:1.0
    tw:116.0
    tn:116.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(zero_day_trans)
        push_updates_rpm
    t:4.0
    tw:114.0
    tn:136.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:40.0
    d:(final)
    notify_trans_refresh
    t:1.0
    tw:114.0
    tn:114.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(refresh_pot)
    notify_revised_draft
    t:1.0
    tw:114.0
    tn:114.0
    fw:0.0
     c:1.0
    cw:14.0
    cn:17.0
    d:(republish_draft)
    rh_web_goes_live
    t:1.0
    tw:111.0
    tn:133.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:44.0
    d:(final web_copy_send_update)
    ga_press_release_drop
    t:1.0
    tw:111.0
    tn:133.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:43.0
    d:(final ga_press_release_intl)
    ceo_blog_drop
    t:1.0
    tw:111.0
    tn:133.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:45.0
    d:(final ceo_blog_legal)
    post_tech_notes
    t:1.0
    tw:111.0
    tn:133.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:40.0
    d:(final)
    release_video
    t:1.0
    tw:111.0
    tn:133.0
    fw:22.0
     c:1.0
    cw:14.0
    cn:45.0
    d:(final review_release_video)
                                                                                                                                                                                                                                                                     
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
     test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
     test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
     test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
      test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
    test_final
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(deliver_final)
      trans_web
    t:9.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:18.0
    d:(web_create_pot)
    trans_web
    t:9.0
    tw:124.0
    tn:124.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:18.0
    d:(web_create_pot)
            ga_release_notes_pot
    t:1.0
    tw:119.0
    tn:119.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:18.0
    d:(wiki_ga_port)
    ga_release_notes_pot
    t:1.0
    tw:119.0
    tn:119.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:18.0
    d:(wiki_ga_port)
      ga_blocker5
    t:1.0
    tw:122.0
    tn:122.0
    fw:0.0
     c:1.0
    cw:15.0
    cn:15.0
    d:(ga_blocker4)
                    redhat_com_update
    t:1.0
    tw:112.0
    tn:134.0
    fw:22.0
     c:1.0
    cw:15.0
    cn:45.0
    d:(rh_web_goes_live)
    ga_press_release
    t:1.0
    tw:112.0
    tn:134.0
    fw:22.0
     c:1.0
    cw:15.0
    cn:44.0
    d:(ga_press_release_drop)
    ceo_blog
    t:1.0
    tw:112.0
    tn:134.0
    fw:22.0
     c:1.0
    cw:15.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
                                                                                                                                                                                                                                                                       
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
     stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    regional_marketing
    t:5.0
    tw:133.0
    tn:133.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
     stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
     stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    stage_final
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
      early_iso
    t:3.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    start_stage_final
    t:2.0
    tw:130.0
    tn:130.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
    start_stage_final
    t:2.0
    tw:130.0
    tn:130.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:16.0
    d:(test_final)
      review_trans_web
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:19.0
    d:(trans_web)
    review_trans_web
    t:4.0
    tw:128.0
    tn:128.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:19.0
    d:(trans_web)
            build_trans_review_final
    t:4.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:19.0
    d:(ga_release_notes_pot)
    build_ga_trans_review
    t:4.0
    tw:123.0
    tn:123.0
    fw:0.0
     c:1.0
    cw:16.0
    cn:19.0
    d:(ga_release_notes_pot)
                                                                                                                                                                                                                                                                                             
    final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
     final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
     final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
     final
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:39.0
    d:(stage_final zero_day_relnotes media_prebriefs)
    bugzilla_descrption
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:17.0
    d:(stage_final)
     bugzilla_descrption
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:17.0
    d:(stage_final)
    spins_ga_ks
    t:1.0
    tw:132.0
    tn:132.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:17.0
    d:(stage_final)
       notify_mirrors_final
    t:1.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:17.0
    d:(start_stage_final)
    final_export_control
    t:1.0
    tw:131.0
    tn:131.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:17.0
    d:(start_stage_final)
      finish_trans_web
    t:1.0
    tw:129.0
    tn:129.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:20.0
    d:(review_trans_web)
    publish_trans_web
    t:1.0
    tw:129.0
    tn:129.0
    fw:0.0
     c:1.0
    cw:17.0
    cn:20.0
    d:(review_trans_web)
                                                                                                                                                                                                                                                                                                       
    event_reports
    t:23.0
    tw:155.0
    tn:155.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:40.0
    d:(final)
    marketing_post
    t:10.0
    tw:142.0
    tn:142.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:40.0
    d:(final)
     push_updates_rpm
    t:4.0
    tw:136.0
    tn:136.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:40.0
    d:(final)
    rh_web_goes_live
    t:1.0
    tw:133.0
    tn:133.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:44.0
    d:(final web_copy_send_update)
    ga_press_release_drop
    t:1.0
    tw:133.0
    tn:133.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:43.0
    d:(final ga_press_release_intl)
    ceo_blog_drop
    t:1.0
    tw:133.0
    tn:133.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:45.0
    d:(final ceo_blog_legal)
     post_tech_notes
    t:1.0
    tw:133.0
    tn:133.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:40.0
    d:(final)
     release_video
    t:1.0
    tw:133.0
    tn:133.0
    fw:0.0
     c:1.0
    cw:18.0
    cn:45.0
    d:(final review_release_video)
                                                                                                                                                                                                                                                                                                                    
        redhat_com_update
    t:1.0
    tw:134.0
    tn:134.0
    fw:0.0
     c:1.0
    cw:19.0
    cn:45.0
    d:(rh_web_goes_live)
    ga_press_release
    t:1.0
    tw:134.0
    tn:134.0
    fw:0.0
     c:1.0
    cw:19.0
    cn:44.0
    d:(ga_press_release_drop)
    ceo_blog
    t:1.0
    tw:134.0
    tn:134.0
    fw:0.0
     c:1.0
    cw:19.0
    cn:52.0
    d:(ceo_prepare_final_rc ceo_send_final_rc ceo_solicit_feedback ceo_blog_drop)
                                                                                                                                                                                                                                                                                                                        
    + + +

    + Scenario report for Table 20140924-15:39:13: scenario_name fedora20scenario , cp_duration_at_pm 155.0 , cp_cost_pm 18.0 , max_act_count_per_track 19 , time_probability_point 0.5 , cost_probability_point 0.5 , setup_time 0 , main_processing_time 0 seconds , time/date finished processing 2014 Sep 28 02:19:55 , _tDcSource 6 , _cDcSource 6 , precision , tprecision , cprecision , color_mask_sig_idx 3 , color_mask_oth_idx 5 , colorswap_p 0 +

    + + + + +

    Legend

    + + + + + +
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    cp sig:1 p%100.0sig:1 p%87.5sig:1 p%75.0sig:1 p%62.5sig:1 p%50.0sig:1 p%37.5sig:1 p%25.0sig:1 p%12.5sig:0 p%100.0sig:0 p%87.5sig:0 p%75.0sig:0 p%62.5sig:0 p%50.0sig:0 p%37.5sig:0 p%25.0sig:0 p%12.5 inactive
    + + Index: openacs-4/packages/accounts-finance/www/doc/pretti-example-5.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-example-5.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-example-5.tcl 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,32 @@ +set title "PRETTI example 5" +set context [list [list index "Documentation"] $title] + +set p1_html "
    "
    +set p1_list [acc_fin::example_table p10e]
    +foreach row $p1_list {
    +    append p1_html [join $row "," ]
    +    append p1_html "\n"
    +}
    +append p1_html "
    " + +set p2_html "
    "
    +set p2_list [lindex [acc_fin::example_table p20e]]
    +append p2_html [lindex $p2_list 2]
    +append p2_html "
    " +set subtitle_html [lindex $p2_list 0] +set comments_html [lindex $p2_list 1] +regsub -all -- { ([h][t][t][p][s]?[\:][\/][\/][A-Za-z0-9\.\-\/\_]+) } $comments_html { \1 } comments_html + +set p3_html "

    * not used

    " + +set p1b_html {

    name: PRETTI example 5 fedora20 scenario
    + tid: 10088
    +
    + + + + +
    namevalue
    activity_table_namefedora20scenario
    +} + +#set p4_html { } Index: openacs-4/packages/accounts-finance/www/doc/pretti-features.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-features.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-features.adp 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,16 @@ + +@title;noquote@ +@context;noquote@ + +

    @title@

    +

    +Project Reporting Evaluation and Track Task Interpretation (PRETTI) is an effective way to communicate complex ideas of timing, sequence and dependencies to project stakeholders. +

    +Each PRETTI (p4) report consists of a table of fast-tracked paths highlighting the critical path (CP) as well as paths and activities that risk merging or otherwise affecting the CP. +

    +PRETTI avoids processing intensity of Monte Carlo analysis by calculating only the points requested along a distribution curve, such as the extremes and median. +

    +PRETTI provides a painless way to create a probability distribution curve for each activity based on historical records and subsequently produce a project performance distribution curve for time and value. +

    +By including all decision paths, the complexity of GERT decision paths are deferred to the activity level. +

    Index: openacs-4/packages/accounts-finance/www/doc/pretti-features.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-features.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-features.tcl 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,2 @@ +set title "PRETTI Features" +set context [list [list index "Documentation"] $title] Index: openacs-4/packages/accounts-finance/www/doc/pretti-specs.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-specs.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-specs.adp 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,39 @@ + +@title;noquote@ +@context;noquote@ + +

    PRETTI Specifications

    + + +
    • +Max. Number of Operations per project: unlimited* +
    • +Max. Number of Activities per project: unlimited* +
    • +Max. Number of Operations per project: unlimited* +
    • +Max. Number of Resources: unlimited*, see Account Tracking for Project Resources +
    • +Max. Number of Work Breakdown Elements: unlimited* +
    • +Max. Number of Calendars per project: 2600, not implemented +
    • +Time Units: unlimited unit choice, one time unit per project estimate. +
    • +Earned Value Management: cost, time, system or resource input and output +
    • +Earned Time and Value: a mix of max,min,median values and/or discrete probability distribution curves +
    • +Max. Number of custom, unique distribution curves for estimating: unlimited* +
    • +Max. Number of Operations required to build a distribution curve: unlimited* (minimum: 1) +
    • +Account tracking: Resources, System Inputs and Outputs, unlimited* A limit of 2600 accounts with waypoint subtotals and track totals. +
    • +Number of Zones: unlimited*, ignored +
    • +Number of Cost Labels: See Account Tracking +
    +

    * limited to system resource's capacity, such as memory. +

    + Index: openacs-4/packages/accounts-finance/www/doc/pretti-specs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-specs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-specs.tcl 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,3 @@ +set title "PRETTI Specifications" +set context [list [list index "Documentation"] $title] + Index: openacs-4/packages/accounts-finance/www/doc/pretti-tables.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-tables.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-tables.adp 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,49 @@ + +@title;noquote@ +@context;noquote@ + +

    Project Reporting Evaluation and Track Task Interpretation

    +

    or Project Activity Network Evaluation by Reporting Low Float Paths in Fast Tracks

    + +

    #accounts-finance.scenario_p1# *

    +

    #accounts-finance.scenario_p1_def#

    +@p1_html;noquote@ +@p1b_html;noquote@ + +

    #accounts-finance.task_network_p2# *

    +

    #accounts-finance.task_network_p2_def#

    +@p2_html;noquote@ +@p2b_html;noquote@ + +

    #accounts-finance.task_types_p3#

    +

    #accounts-finance.task_types_p3_def#

    +@p3_html;noquote@ +@p3b_html;noquote@ + +

    #accounts-finance.report_table_p4#

    +

    #accounts-finance.report_table_p4_def#

    +@p4_html;noquote@ +@p4b_html;noquote@ + +

    #accounts-finance.report_table_p5#

    +

    #accounts-finance.report_table_p5_def#

    +@p5_html;noquote@ +@p5b_html;noquote@ + +

    #accounts-finance.report_table_p6#

    +

    #accounts-finance.report_table_p6_def#

    +@p6_html;noquote@ +@p6b_html;noquote@ + +

    #accounts-finance.distribution_curve_dc#

    +

    #accounts-finance.distribution_curve_dc_def#

    +@dc_html;noquote@ +@dcb_html;noquote@ +
    +

    * = #accounts-finance.required#

    +

    #accounts-finance.unrecognized_refs#

    + +

    #accounts-finance.index_equation_variables#

    +

    #accounts-finance.index_equation_variables_def#

    +@eq_vars_html;noquote@ + Index: openacs-4/packages/accounts-finance/www/doc/pretti-tables.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti-tables.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti-tables.tcl 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,40 @@ +set title "PRETTI Table definitions" +set context [list [list index "Documentation"] $title] + +set type_list [list p1 p2 p3 p4 p5 p6 dc] +set table_attribute_list [list style "border: 1px;"] +foreach type $type_list { + set all_list [acc_fin::pretti_columns_list $type] + set req_list [acc_fin::pretti_columns_list $type 1] + set var ${type}_html + set var2 ${type}b_html + set table_lists [list ] + foreach column $all_list { + set row_list [list $column "#accounts-finance.${column}#" "#accounts-finance.${column}_def#"] + lappend table_lists $row_list + } + set $var [qss_list_of_lists_to_html_table $table_lists $table_attribute_list] + set $var2 "" + if { $type ne "p4" && $type ne "p5" && $type ne "p6" } { + set delimiter "" + foreach req $req_list { + append $var2 $delimiter + append $var2 $req + set delimiter ", " + } + if { $var2 ne "" } { + append $var2 " *" + } + } +} + +set eq_vars_lists [acc_fin::pretti_equation_vars] +set eq_vars2_lists [list [list "Custom Equation Variable" "PRETTI Variable" "Description"]] +foreach vars_list $eq_vars_lists { + set var0 [lindex $vars_list 0] + set var1 [lindex $vars_list 1] + set var2 [lindex $vars_list 2] + set row_lists [list "\$${var0}" $var1 $var2] + lappend eq_vars2_lists $row_lists +} +set eq_vars_html [qss_list_of_lists_to_html_table $eq_vars2_lists $table_attribute_list] \ No newline at end of file Index: openacs-4/packages/accounts-finance/www/doc/pretti.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti.adp 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,12 @@ + +@title;noquote@ +@context;noquote@ + +

    Project Reporting Evaluation and Track Task Interpretation

    +

    or Project Activity Network Evaluation by Reporting Low Float Paths in Fast Tracks

    + +

    Glossary

    +@glossary_html;noquote@ + +

    FAQ

    + Index: openacs-4/packages/accounts-finance/www/doc/pretti.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/doc/pretti.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/doc/pretti.tcl 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,28 @@ +set title "PRETTI Table definitions" +set context [list [list index "Documentation"] $title] + +set glossary_html "" + +set g_list [list "t : (crash) duration" \ + "tw : duration at waypoint. " \ + "waypoint : A task along one path" \ + "node : A task and all its direct and indirect dependents" \ + "tn : (crash) duration at node" \ + "fw : float at waypoint (tn - tw)" \ + "c : cost" \ + "cw : cost at waypoint " \ + "cn : cost at node" \ + "d : dependents" \ + "e : eco2" \ + "ew : eco2 at waypoint " \ + "en : eco2 at node" \ + ] +set g_list [lsort $g_list] +append glossary_html "
      \n" +foreach gl $g_list { + append glossary_html "
    • $gl
    • \n" +} +append glossary_html "
    \n" + +set faq_html "" + Index: openacs-4/packages/accounts-finance/www/pretti/app.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/pretti/app.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/pretti/app.adp 14 Nov 2014 18:20:20 -0000 1.1 @@ -0,0 +1,58 @@ + + @title;noquote@ + @context;noquote@ +

    @title@

    + + + + + + + + +

    this option turned off for now.

    + + @menu_html;noquote@ + +
    + + +
      +@user_message_html;noquote@ +
    +
    + + + +
    +@form_html;noquote@ +
    + +
    + + + + + + @table_html;noquote@ + + + + +
      +@compute_message_html;noquote@ +
    +
    + + +@computation_report_html;noquote@ + + + + + + @table_stats_html;noquote@ + + + + Index: openacs-4/packages/accounts-finance/www/pretti/app.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/pretti/app.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/pretti/app.tcl 14 Nov 2014 18:20:21 -0000 1.1 @@ -0,0 +1,701 @@ +# accounts-finance/www/pretti/app.tcl + +set instance_id [ad_conn package_id] +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] +if { $read_p } { + set create_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege create] + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + if { $write_p } { + set delete_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege delete] + if { $delete_p } { + set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + } else { + set admin_p 0 + } + } else { + set admin_p 0 + set delete_p 0 + } +} else { + set create_p 0 + set write_p 0 + set admin_p 0 + set delete_p 0 +} + +set debug_p 0 +# set debug_p to 1 to bypass scheduling and possibly add extra error logging for admins +if { $debug_p && $admin_p == 0 } { + # only admins debug + set debug_p 0 +} + +# randmize rand with seed from clock +expr { srand([clock clicks]) } + +set table_default "" + +set mode_name "#accounts-finance.tables#" +# tid = table_id +array set input_array [list \ + table_tid ""\ + table_template_id ""\ + table_name ""\ + table_title ""\ + table_comments ""\ + table_text ""\ + trash_folder_p "0"\ + column_name "" \ + minimum "" \ + median "" \ + maximum "" \ + count "" \ + submit "" \ + reset "" \ + mode "p" \ + next_mode "p" \ + ] + +array set title_array [list \ + submit "Submit" \ + reset "Reset" \ + ] + +set user_message_list [list ] + + +# get previous form inputs if they exist + +set form_posted [qf_get_inputs_as_array input_array hash_check 1] +set mode $input_array(mode) +set next_mode $input_array(next_mode) +set trash_folder_p $input_array(trash_folder_p) +set column_name $input_array(column_name) + +if { $form_posted } { + if { [info exists input_array(x) ] } { + unset input_array(x) + } + if { [info exists input_array(y) ] } { + unset input_array(y) + } + + + # following is part of dynamic menu processing using form tags instead of url/GET.. and lib/pretti-menu1 + set input_array_idx_list [array names input_array] + + # existing modes screned here: + set modes_idx [lsearch -regexp $input_array_idx_list {z[cdenprstvwy][cv]?}] + if { $modes_idx > -1 && $mode eq "p" } { + set modes [lindex $input_array_idx_list $modes_idx] + # modes 0 0 is z + set mode [string range $modes 1 1] + set mode2 [string range $modes 2 2] + if { [string length $mode2] == 1 } { + set next_mode $mode2 + } + } + # trash_folder_p = 0 to view untrashed content, or = 1 to view trashed content + set trash_folder_p $input_array(trash_folder_p) + set table_tid $input_array(table_tid) + set column_name $input_array(column_name) + + # validate input + # cleanse, validate mode + # determine input completeness + # form has modal inputs, so validation is a matter of cleansing data and verifying references + set validated 0 + + switch -exact -- $mode { + e { + ns_log Notice "accounts-finance/www/pretti/app.tcl.68: validated for e" + if { [qf_is_natural_number $table_tid] } { + set validated 1 + } else { + set mode "n" + set next_mode "" + set validated 0 + } + } + d { + set validated 0 + # Form has to handle multiple table_tid's from checkboxes. + set tid_name_list [array names input_array -regexp {tid_[0-9]+} ] + set tid_list [list ] + foreach tid $tid_name_list { + if { [qf_is_natural_number $input_array($tid)] } { + ns_log Notice "accounts-finance/www/pretti/app.tcl.70: tid '$tid' input_array($tid) '$input_array($tid)'" + lappend tid_list $input_array($tid) + } + } + if { ( [qf_is_natural_number $table_tid] || [llength $tid_list] > 0 ) && $delete_p } { + set validated 1 + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.76 table_tid '${table_tid}' or delete_p $delete_p is not valid for mode d" + set mode "p" + set next_mode "" + } + } + t { + set validated 0 + # Form has to handle multiple table_tid's from checkboxes. + set tid_name_list [array names input_array -regexp {tid_[0-9]+} ] + set tid_list [list ] + foreach tid $tid_name_list { + #ns_log Notice "accounts-finance/www/pretti/app.tcl.80: tid '$tid' input_array($tid) '$input_array($tid)'" + if { [qf_is_natural_number $input_array($tid)] } { + lappend tid_list $input_array($tid) + } + } + # can only check for minimum permission at this point. ie $create_p for trashable self-created content + if { ( [qf_is_natural_number $table_tid] || [llength $tid_list] > 0 ) && $create_p } { + set validated 1 + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.86: table_tid '${table_tid}' or llength tid_list [llength $tid_list] is not valid for mode t" + set mode "p" + set next_mode "" + } + } + c { + set validated 1 + if { ![qf_is_natural_number $table_tid] } { + ns_log Notice "accounts-finance/www/pretti/app.tcl.94: table_tid '${table_tid}' is not valid for mode c" + lappend user_message_list "#accounts-finance.table_not_specified#" + set validated 0 + set mode "p" + set next_mode "" + } + # check for any form inputs? + } + w { + set table_text $input_array(table_text) + set validated 1 + ns_log Notice "accounts-finance/www/pretti/app.tcl.105: validated for w" + } + n { + set validated 0 + if { [info exists table_tid] } { + unset table_tid + } + + # new might be a general new table, or a specified type dc + # check for dc inputs? + set dc_new_p 0 + if { $input_array(minimum) ne "" || $input_array(maximum) ne "" || $input_array(median) ne "" || $input_array(count) ne "" } { + # has a new dc been specified? + set dc_new_p 1 + set input_array(minimum) [string trim $input_array(minimum) ] + if { [qf_is_decimal $input_array(minimum)] } { + set minimum $input_array(minimum) + set input_array(maximum) [string trim $input_array(maximum) ] + if { [qf_is_decimal $input_array(maximum)] } { + set maximum $input_array(maximum) + set input_array(median) [string trim $input_array(median) ] + if { [qf_is_decimal $input_array(median)] } { + set median $input_array(median) + set input_array(count) [string trim $input_array(count) ] + # point count, or PERT_omp strict specified with "s" + if { $input_array(count) eq "" || [string match -nocase "s" $input_array(count) ] || [qf_is_natural_number $input_array(count) ] } { + set count [string tolower $input_array(count) ] + set validated 1 + ns_log Notice "accounts-finance/www/pretti/app.tcl.217: validated for m" + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.197: input_array(count) '$input_array(count)' is not valid." + lappend user_message_list "#accounts-finance.points_gt_5_or_blank# #leave_blank_for_default#" + } + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.202: input_array(median) '$input_array(median)' is not a number." + lappend user_message_list "#accounts-finance.median# '$input_array(median)' #accounts-finance.not_recognized_number#" + } + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.205: input_array(maximum) '$input_array(maximum)' is not a number." + lappend user_message_list "#accounts-finance.maximum# '$input_array(maximum)' #accounts-finance.not_recognized_number#" + } + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.209: input_array(minimum) '$input_array(minimum)' is not a number." + lappend user_message_list "#accounts-finance.minimum# '$input_array(minimum)' #accounts-finance.not_recognized_number#" + } + } + if { $validated } { + ns_log Notice "accounts-finance/www/pretti/app.tcl.105: validated for n as m, switching mode to m" + set mode "m" + set next_mode "v" + } else { + if { $dc_new_p == 0 } { + # a new, unspecified table + set mode "n" + set validated 1 + ns_log Notice "accounts-finance/www/pretti/app.tcl.109: validated for n" + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.111: not validated for m. switching mode to v" + set mode "v" + set next_mode "" + } + } + } + r { + set validated 1 + ns_log Notice "accounts-finance/www/pretti/app.tcl.113: validated for r" + } + s { + set validated 1 + ns_log Notice "accounts-finance/www/pretti/app.tcl.123: validated for s" + if { ![qf_is_natural_number $table_tid] } { + ns_log Notice "accounts-finance/www/pretti/app.tcl.129: table_tid '${table_tid}' is not valid for mode s" + lappend user_message_list "#accounts-finance.table_not_specified#" + set validated 0 + set mode "p" + set next_mode "" + } + } + y { + set validated 1 + ns_log Notice "accounts-finance/www/pretti/app.tcl.133: validated for y" + if { ![qf_is_natural_number $table_tid] } { + ns_log Notice "accounts-finance/www/pretti/app.tcl.139: table_tid '${table_tid}' is not valid for mode y" + lappend user_message_list "#accounts-finance.table_not_specified#" + set validated 0 + set mode "p" + set next_mode "" + } + } + default { + ns_log Notice "accounts-finance/www/pretti/app.tcl.116: validated for v" + if { [qf_is_natural_number $table_tid] } { + set validated 1 + set mode "v" + } else { + set mode "p" + set next_mode "" + } + } + + } + # end switch + + if { $validated } { + # execute validated input + + if { $mode eq "w" } { + # determine table type P1..5 + # write the data + # a different user_id makes new context based on current context, otherwise modifies same context + # or create a new context if no context provided. + + if { [string length $table_text] > 0 && $table_text ne $table_default } { + # table_name Table Name + + if { $input_array(table_name) eq "" && $table_tid eq "" } { + set table_name "table[clock format [clock seconds] -format %Y%m%d-%X]" + regsub -all -- {[\.\:\-]} $table_name {} table_name + } elseif { $input_array(table_name) eq "" } { + set table_name "initCon${table_tid}" + } else { + set table_name $input_array(table_name) + } + # table_title Table title + if { $input_array(table_title) eq "" && $table_tid eq "" } { + set table_title "Table [clock format [clock seconds] -format %Y%m%d-%X]" + } elseif { $input_array(table_title) eq "" } { + set table_title "Table ${table_tid}" + } else { + set table_title $input_array(table_title) + } + ns_log Notice "accounts-finance/www/pretti/app.tcl.157: table_name '${table_name}' [string length $table_name]" + # table_comments Comments + set table_comments $input_array(table_comments) + # table_text + + # convert tables from _text to _list + set line_break "\n" + set delimiter "," + # linebreak_char delimiter rows_count columns_count + set table_text_stats [qss_txt_table_stats $table_text] + ns_log Notice "accounts-finance/www/pretti/app.tcl.167: table_text_stats $table_text_stats" + set line_break [lindex $table_text_stats 0] + set delimiter [lindex $table_text_stats 1] + + ns_log Notice "accounts-finance/www/pretti/app.tcl.171: table_text ${table_text}" + set table_lists [qss_txt_to_tcl_list_of_lists $table_text $line_break $delimiter] + ns_log Notice "accounts-finance/www/pretti/app.tcl.173: set table_lists ${table_lists}" + # cleanup input + set table_lists_new [list ] + foreach condition_list $table_lists { + set row_new [list ] + foreach cell $condition_list { + set cell_new [string trim $cell] + regsub -all -- {[ ][ ]*} $cell_new { } cell_new + lappend row_new $cell_new + #ns_log Notice "accounts-finance/www/pretti/app.tcl.182: new cell '$cell_new'" + } + if { [llength $row_new] > 0 } { + lappend table_lists_new $row_new + } + } + set table_lists $table_lists_new + set table_rows_max [parameter::get -parameter TableRowsMax -package_id $instance_id] + set table_rows_count [llength $table_lists ] + if { $table_rows_max == 0 || ( $table_rows_max > 0 && $table_rows_count < $table_rows_max ) } { + ns_log Notice "accounts-finance/www/pretti/app.tcl.189: : create/write table" + ns_log Notice "accounts-finance/www/pretti/app.tcl.190: : llength table_lists [llength $table_lists]" + # detect table type for flags + set table_flags [acc_fin::pretti_type_flag $table_lists] + ns_log Notice "accounts-finance/www/pretti/app.tcl.193: table_flags $table_flags" + if { [qf_is_natural_number $table_tid] } { + set table_stats [qss_table_stats $table_tid $instance_id $user_id] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id. + set name_old [lindex $table_stats 0] + set title_old [lindex $table_stats 1] + set comments_old [lindex $table_stats 2] + set table_template_id [lindex $table_stats 5] + + # For revisioning purposes, create a new table each time, except: + # Don't create a new table if it is exactly the same as the old one... ie same table, name, title + + # Old method wrote to the same table using qss_table_write when name and title were the same regardless of comments or content. + + # Get table_lists_old table_comments_old and compare.. + set table_old_lists [qss_table_read $table_tid $instance_id $user_id] + if { $table_name eq $name_old && $table_title eq $title_old && $table_comments eq $comments_old && $table_lists eq $table_old_lists } { + # Don't create a new table. The new one is exactly like the old one.. + } else { + set created_tid [qss_table_create $table_lists $table_name $table_title $table_comments $table_template_id $table_flags $instance_id $user_id ] + if { $created_tid > 0 } { + # trash the old one if it's made by the same user and has same name + # set table_stats_list [qss_table_stats $table_tid] + set user_id_prev [lindex $table_stats 11] + if { $user_id eq $user_id_prev && $table_name eq $name_old } { + qss_table_trash 1 $table_tid $instance_id $user_id + } + if { $table_flags eq "dc" } { + set priority [llength $table_lists] + acc_fin::schedule_add "acc_fin::cobbler_file_create_from_table" [list $created_tid $user_id $instance_id] $user_id $instance_id $priority + # when debugging the graphics, bypassing scheduling can save a few steps: + #acc_fin::cobbler_file_create_from_table $created_tid $user_id $instance_id + incr priority $priority + # build related pie chart: + # using llength table_lists for priority. The more rows there are, the lower the priority.. + acc_fin::schedule_add "acc_fin::pie_file_create_from_table" [list $created_tid $user_id $instance_id] $user_id $instance_id $priority + } + } + } + + } else { + ns_log Notice "accounts-finance/www/pretti/app.tcl.210: qss_table_create new table" + set created_tid [qss_table_create $table_lists $table_name $table_title $table_comments "" $table_flags $instance_id $user_id] + if { $table_flags eq "dc" } { + set priority [llength $table_lists] + acc_fin::schedule_add "acc_fin::cobbler_file_create_from_table" [list $created_tid $user_id $instance_id] $user_id $instance_id $priority + incr priority $priority + # build related pie chart: + # using llength table_lists for priority. The more rows there are, the lower the priority.. + acc_fin::schedule_add "acc_fin::pie_file_create_from_table" [list $created_tid $user_id $instance_id] $user_id $instance_id $priority + } + } + + } else { + # table_rows_max exceeds limit. + set next_mode "p" + lappend user_message_list "#accounts-finance.too_many_rows# ${table_rows_count} #accounts-finance.table_row_count#. ${table_rows_max} #accounts-finance.is_the_limit# #accounts-finance.table_not_created#." + + } + } + # since table_tid is deleted, remove it from any remaining mode activity + unset table_tid + set mode $next_mode + set next_mode "" + } + if { $mode eq "d" } { + # delete.... removes context + ns_log Notice "accounts-finance/www/pretti/app.tcl.222: mode = delete" + #requires table_tid + # delete table_tid + if { [qf_is_natural_number $table_tid] } { + lappend tid_list $table_tid + } + foreach table_tid $tid_list { + # permissions checked for each table_tid in qss_table_delete + qss_table_delete $table_tid $instance_id $user_id + } + # unset to not trigger wrong state in adp include logic + unset table_tid + set mode $next_mode + set next_mode "" + } + if { $mode eq "t" } { + # trash + ns_log Notice "accounts-finance/www/pretti/app.tcl.233: mode = trash" + #requires table_tid + # trash table_tid + if { [qf_is_natural_number $table_tid] } { + lappend tid_list $table_tid + } + foreach table_tid $tid_list { + # permissions checked for each table_tid in qss_table_trash + set trashed_p [lindex [qss_table_stats $table_tid $instance_id $user_id ] 7] + if { $trashed_p == 1 } { + set trash 0 + } else { + set trash 1 + } +# ns_log Notice "accounts-finance/www/pretti/app.tcl.238: qss_table_trash $trash $table_tid $instance_id $user_id" + qss_table_trash $trash $table_tid $instance_id $user_id + } + # unset to not trigger wrong state in adp include logic + unset table_tid + set mode "p" + set next_mode "" + } + } + if { $mode eq "s" } { + # Make this bulk ready, but don't activate bulk split at this time. + if { [qf_is_natural_number $table_tid] && $column_name ne "" } { + lappend tid_list $table_tid + } + foreach table_tid $tid_list { + set table_stats_list [qss_table_stats $table_tid $instance_id $user_id] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id. + set trashed_p [lindex $table_stats_list 7] + set table_flags [lindex $table_stats_list 6] + set tid_user_id [lindex $table_stats_list 11] + if { ( $table_flags eq "p2" || $table_flags eq "p3" ) && ( ( $create_p && $tid_user_id == $user_id ) || $write_p ) } { + qss_table_split $table_tid $column_name + } + } + set mode "p" + set next_mode "" + } + if { $mode eq "y" } { + # Make this bulk ready, but don't activate bulk sort at this time. + set tid_list [list ] + if { [qf_is_natural_number $table_tid] } { + lappend tid_list $table_tid + } + set table_flags "" + set trashed_p 0 + foreach table_tid $tid_list { + set new_table_id [acc_fin::table_sort_y_asc $table_tid $instance_id $user_id] + if { $new_table_id > 0 } { + # trash the old one if it's made by the same user + set table_stats_list [qss_table_stats $table_tid $instance_id $user_id] + set table_flags [lindex $table_stats_list 6] + set row_count [lindex $table_stats_list 4] + set user_id_prev [lindex $table_stats_list 11] + if { $user_id eq $user_id_prev } { + qss_table_trash 1 $table_tid $instance_id $user_id + } + set priority $row_count + acc_fin::schedule_add "acc_fin::cobbler_file_create_from_table" [list $new_table_id $user_id $instance_id] $user_id $instance_id $priority + if { $table_flags eq "dc" } { + incr priority $priority + # build related pie chart: + # using llength table_lists for priority. The more rows there are, the lower the priority.. + set table_stats_list [qss_table_stats $new_table_id $instance_id $user_id] + + acc_fin::schedule_add "acc_fin::pie_file_create_from_table" [list $new_table_id $user_id $instance_id] $user_id $instance_id $priority + } + } + } + set mode "p" + set next_mode "" + } + if { $mode eq "c" } { + # process... compute/process and write output as a new table, present post_calc results + ns_log Notice "accounts-finance/www/pretti/app.tcl.342: mode = process" + set mode_name "#accounts-finance.process#" + #requires table_tid + set table_stats_list [qss_table_stats $table_tid $instance_id $user_id] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + # set table_name [lindex $table_stats_list 0] + # set table_title [lindex $table_stats_list 1] + # set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + if { $table_flags eq "p1" } { + # set table_name [lindex $table_stats_list 0] + # set table_title [lindex $table_stats_list 1] + # set table_comments [lindex $table_stats_list 2] + # set table_template_id [lindex $table_stats_list 5] + set trashed_p [lindex $table_stats_list 7] + set trash_folder_p $trashed_p + + # see lib/pretti-view-one and lib/pretti-menu1 + # given table_tid + #set table_lists [qss_table_read $table_tid] + #acc_fin::scenario_prettify $table_tid $instance_id $user_id + set table_rows_max [parameter::get -parameter TableRowsMax -package_id $instance_id] + set table_rows_count [lindex $table_stats_list 4] + if { $table_rows_max == 0 || ( $table_rows_max > 0 && $table_rows_count < $table_rows_max ) } { + set priority [expr { $table_rows_count * 3 } ] + if { $debug_p } { + acc_fin::scenario_prettify $table_tid $instance_id $user_id + } else { + acc_fin::schedule_add "acc_fin::scenario_prettify" [list $table_tid $instance_id $user_id] $user_id $instance_id $priority + } + lappend user_message_list "#accounts-finance.job_added# table_id=${table_tid}" + } else { + lappend user_message_list "#accounts-finance.too_many_rows# ${table_rows_count} #accounts-finance.table_row_count#. ${table_rows_max} #accounts-finance.is_the_limit# #accounts-finance.job_not_created#." + } + } + set mode "p" + set next_mode "" + } + if { $mode eq "m" } { + ns_log Notice "accounts-finance/www/pretti/app.tcl.479: mode = m new, user specified dc" + if { $count eq "s" } { + set curve_lol [acc_fin::pert_omp_to_strict_dc $minimum $median $maximum 1] + } else { + set curve_lol [acc_fin::pert_omp_to_normal_dc $minimum $median $maximum $count 1] + } + set table_flags "dc" + set pert_omp_expected [expr { ( $minimum + 4. * $median + $maximum ) / 6. } ] + if { $count eq "" } { + set count [expr { [llength $curve_lol] - 1 } ] + } + set table_comments "PERT OMP \n +DC optimum $minimum, median $median, pessimistic $maximum, Number of points: $count \n +expected value: ${pert_omp_expected}" + if { $input_array(table_name) eq "" } { + set input_array(table_name) "DC o $minimum m $median p $maximum N $count" + } + set table_name [string range [string trim $input_array(table_name)] 0 30] + set new_table_id [qss_table_create $curve_lol $table_name $table_name $table_comments "" "dc" $instance_id $user_id] + if { $new_table_id > 0 } { + set priority [llength $curve_lol] + acc_fin::schedule_add "acc_fin::cobbler_file_create_from_table" [list $new_table_id $user_id $instance_id] $user_id $instance_id $priority + incr priority $priority + # new_table_id is new table_id. build related pie chart: + # using llength curve_lol for priority. The larger the curve, the lower the priority.. + acc_fin::schedule_add "acc_fin::pie_file_create_from_table" [list $new_table_id $user_id $instance_id] $user_id $instance_id $priority + } + if { $new_table_id == 0 } { + lappend user_message_list "#accounts-finance.internal_error_while_making_table# #accounts-finance.contact_sysadmin#" + } + set mode "p" + set next_mode "" + } + # end validated input if +} + +switch -exact -- $mode { + e { + # edit...... edit/form mode of current context + ns_log Notice "accounts-finance/www/pretti/app.tcl.264: mode = edit" + set mode_name "#accounts-finance.edit#" + #requires table_tid + # make a form to edit + # get table from ID + + +# set form_id [qf_form action app method post id 20120531 hash_check 1] + +# qf_input type hidden value w name mode label "" + + if { [qf_is_natural_number $table_tid] } { + set table_stats_list [qss_table_stats $table_tid $instance_id $user_id] + set table_name [lindex $table_stats_list 0] + set table_title [lindex $table_stats_list 1] + set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + set table_template_id [lindex $table_stats_list 5] + set trashed_p [lindex $table_stats_list 7] + set trash_folder_p $trashed_p + set table_lists [qss_table_read $table_tid $instance_id $user_id] + set table_text [qss_lists_to_text $table_lists] + + qf_input type hidden value $table_tid name table_tid label "" + qf_input type hidden value $table_flags name table_flags label "" + qf_input type hidden value $table_template_id name table_template_id label "" + qf_append html "

    Table

    " + qf_append html "
    " + qf_input type text value $table_name name table_name label "Name:" size 40 maxlength 40 + qf_append html "
    " + qf_input type text value $table_title name table_title label "Title:" size 40 maxlength 80 + qf_append html "
    " + qf_textarea value $table_comments cols 40 rows 3 name table_comments label "Comments:" + qf_append html "
    " + qf_textarea value $table_text cols 40 rows 6 name table_text label "Contents:" + qf_append html "
    " + } + + qf_input type submit value "Save" name "zw" class btn +# qf_close form_id $form_id +# qf_append html "" +# set form_html [qf_read form_id $form_id] + set form_html [qf_read ] + + } + w { + # save..... (write) table_tid + # should already have been handled above + ns_log Notice "accounts-finance/www/pretti/app.tcl.309: mode = save THIS SHOULD NOT BE CALLED." + # it's called in validation section. + } + n { + # new....... creates new, blank context (form) + ns_log Notice "accounts-finance/www/pretti/app.tcl.314: mode = new" + set mode_name "#accounts-finance.new#" + #requires no table_tid + set table_text "" + + # make a form with no existing table_tid + + # set form_id [qf_form action app method post id 20140415 hash_check 1] + +# qf_input type hidden value w name mode label "" + qf_append html "

    Table

    " + qf_append html "
    " + qf_input type text value "" name table_name label "Name:" size 40 maxlength 40 + qf_append html "
    " + qf_input type text value "" name table_title label "Title:" size 40 maxlength 80 + qf_append html "
    " + qf_textarea value "" cols 40 rows 3 name table_comments label "Comments:" + qf_append html "
    " + qf_textarea value $table_text cols 40 rows 6 name table_text label "Contents:" + qf_append html "
    " + + qf_input type submit value "Save" name "zw" class btn + +# qf_close form_id $form_id +# qf_append html "" +# set form_html [qf_read form_id $form_id] + set form_html [qf_read ] + } + r { + # review.... show processd output + ns_log Notice "accounts-finance/www/pretti/app.tcl.351: mode = review" + #requires table_tid + + # option not used for this app. Calcs are saved as a table. use mode v + } + v { + # view table(s) (standard, html page document/report) + ns_log Notice "accounts-finance/www/pretti/app.tcl.358: mode = $mode ie. view table" + set mode_name "#accounts-finance.view#" + set table_stats_list [qss_table_stats $table_tid $instance_id $user_id] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + # set table_name [lindex $table_stats_list 0] + # set table_title [lindex $table_stats_list 1] + # set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + set trash_folder_p [lindex $table_stats_list 7] + # see lib/pretti-view-one and lib/pretti-menu1 + + } + default { + # default includes v,p + # present...... presents a list of contexts/tables to choose from + ns_log Notice "accounts-finance/www/pretti/app.tcl.392: mode = $mode ie. default" + # see lib/pretti-view and lib/pretti-menu1 + } +} +# end of switches + +set user_message_html "" +foreach user_message $user_message_list { + append user_message_html "
  • ${user_message}
  • " +} +# generic header for .adp pages +set app_name "PRETTI" +set title ${app_name} +set context [list [list app $title] $mode_name] Index: openacs-4/packages/accounts-finance/www/pretti/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/pretti/index.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/pretti/index.adp 14 Nov 2014 18:20:21 -0000 1.1 @@ -0,0 +1,27 @@ + + @title;noquote@ + @context;noquote@ +

    @title@

    + + +
      +@user_message_html;noquote@ +
    +
    + + + + + + + + + + + + + + + + + Index: openacs-4/packages/accounts-finance/www/pretti/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/pretti/index.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/pretti/index.tcl 14 Nov 2014 18:20:21 -0000 1.1 @@ -0,0 +1,148 @@ +# generic header for static .adp pages + +set instance_id [ad_conn package_id] +set user_id [ad_conn user_id] +set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege read] +if { $read_p } { + set write_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] + if { $write_p } { + set delete_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege delete] + if { $delete_p } { + set admin_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege admin] + } else { + set admin_p 0 + } + } else { + set admin_p 0 + set delete_p 0 + } +} else { + set write_p 0 + set admin_p 0 + set delete_p 0 +} + +set table_default "" + +set mode_name "#accounts-finance.tables#" +# tid = table_id +array set input_array [list \ + table_tid ""\ + table_template_id ""\ + table_name ""\ + table_title ""\ + table_comments ""\ + table_text ""\ + trash_folder_p "0"\ + submit "" \ + reset "" \ + mode "p" \ + next_mode "p" \ + ] + +array set title_array [list \ + submit "Submit" \ + reset "Reset" \ + ] + +set user_message_list [list ] + + +# get previous form inputs if they exist + +set form_posted [qf_get_inputs_as_array input_array] +set mode $input_array(mode) +set next_mode $input_array(next_mode) +set trash_folder_p $input_array(trash_folder_p) + +if { $form_posted } { + if { [info exists input_array(x) ] } { + unset input_array(x) + } + if { [info exists input_array(y) ] } { + unset input_array(y) + } + + # following is part of dynamic menu processing using form tags instead of url/GET.. and lib/pretti-menu1 + set input_array_idx_list [array names input_array] + set modes_idx [lsearch -regexp $input_array_idx_list {z[vprnwctde][vc]?}] + if { $modes_idx > -1 && $mode eq "p" } { + set modes [lindex $input_array_idx_list $modes_idx] + # modes 0 0 is z + set mode [string range $modes 1 1] + set next_mode [string range $modes 2 2] + } + + set table_tid $input_array(table_tid) + set trash_folder_p $input_array(trash_folder_p) + if { $trash_folder_p } { + set mode "p" + } + # validate input + # cleanse, validate mode + # determine input completeness + # form has modal inputs, so validation is a matter of cleansing data and verifying references + set validated 0 + + switch -exact -- $mode { + default { + ns_log Notice "accounts-finance/www/pretti/index.tcl.116: validated for v" + if { [qf_is_natural_number $table_tid] } { + set validated 1 + set mode "v" + } else { + set mode "p" + set next_mode "" + } + } + + } + # end switch + + if { $validated } { + # This is a read-only page. no actions expected here. + + # execute validated input + # end validated input if + } +} + +switch -exact -- $mode { + v { + # view table(s) (standard, html page document/report) + ns_log Notice "accounts-finance/www/pretti/index.tcl.358: mode = $mode ie. view table" + set mode_name "#accounts-finance.view#" + set table_stats_list [qss_table_stats $table_tid] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + set table_name [lindex $table_stats_list 0] + # set table_title [lindex $table_stats_list 1] + # set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + set trashed_p [lindex $table_stats_list 7] + set trash_folder_p $trashed_p + # see lib/pretti-view-one and lib/pretti-menu1 + } + default { + # default includes v,p + # present...... presents a list of contexts/tables to choose from + ns_log Notice "accounts-finance/www/pretti/index.tcl.392: mode = $mode ie. default" + # see lib/pretti-view and lib/pretti-menu1 + } +} +# end of switches + +set user_message_html "" +foreach user_message $user_message_list { + append user_message_html "
  • ${user_message}
  • " +} +set app_name "PRETTI" +set url "app" +set title ${app_name} +if { $mode eq "v" && [info exists table_name] } { + append title " " + append title $table_name + set context [list [list $url $app_name ] $title] +} else { + set context [list [list $url $title] $mode_name] +} + Index: openacs-4/packages/accounts-finance/www/pretti/index.vuh =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/www/pretti/index.vuh,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/accounts-finance/www/pretti/index.vuh 14 Nov 2014 18:20:21 -0000 1.1 @@ -0,0 +1,108 @@ +ad_page_contract { + + @return a single view, if reference exists, otherwise a list. + +} { + +} + +# requires read_p +set instance_id [ad_conn package_id] +set user_id [ad_conn user_id] +#set read_p [permission::permission_p -party_id $user_id -object_id $instance_id -privilege write] +permission::require_permission -party_id $user_id -object_id $instance_id -privilege read + +# set is_url [ad_conn url] +# set e_url [ad_conn extra_url] +# set f [ad_conn file] +set path_info [ad_conn path_info] +set trash_folder_p 0 +# path_info doesn not contain the stuff after a ? in a url, at least in some cases +#ns_log Notice "path_info $path_info" +# if path_info contains no /, lookup f(path_info) as ecds_product_id_site_url_map.site_url +#if { [string match "*.html" $path_info] } { +# set product_id [ecds_product_id_from_path $path_info] +#} + +# get reference. If exists, pass parameter to a /packages/accounts-finance/www/pretti/view +# where view.adp references a /lib/view-one and /lib/view-all which is also referenced in app.adp (now index.adp) for consistent view output +set reserved_pages_list [list "index" "pretti/index"] +set reserved_page_idx [lsearch -exact $reserved_pages_list $path_info] +if { $reserved_page_idx > -1 } { + set http_status "500" + ns_log Warning "accounts-finance/www/index.vuh.32 should not identify an existing reserved page. reserved_page_idx $reserved_page_idx" + ad_return_exception_page $http_status "Internal Error" "A page misconfiguration has created a system error. Please contact site administrators." + ad_script_abort +} + +set table_tid "" +if { [qf_is_natural_number $path_info] } { + set table_tid $path_info + # is path_info a table_tid? + set table_stats_list [qss_table_stats $table_tid] + # name, title, comments, cell_count, row_count, template_id, flags, trashed, popularity, time last_modified, time created, user_id + if { [llength $table_stats_list ] > 1 } { + set http_status 200 + set table_name [lindex $table_stats_list 0] + # set table_title [lindex $table_stats_list 1] + # set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + set trash_folder_p [lindex $table_stats_list 7] + set table_tid_from_name [qss_tid_from_name $table_name $instance_id $user_id] + if { $table_tid_from_name eq $table_tid } { + # table tid is the same as the table referenced by table name. redirect to keep 1 url per table: + set http_status 307 + # 307 moved temporarily + ad_returnredirect $table_name + ad_script_abort + } + rp_form_put mode v + rp_form_put table_tid $table_tid + rp_form_put trash_folder_p $trash_folder_p + rp_internal_redirect /packages/accounts-finance/www/pretti/index + ad_script_abort + } else { + # table_tid does not exist. provide a 404 error + set http_status 404 + } +} + +# is path_info a table name? +set table_tid [qss_tid_from_name $path_info $instance_id $user_id] +ns_log Notice "accounts-finance/www/index.vuh.73 path_info '$path_info' table_tid '$table_tid'" + +if { $table_tid ne "" } { + set http_status 200 + set table_stats_list [qss_table_stats $table_tid] + if { [llength $table_stats_list ] > 1 } { + set table_name [lindex $table_stats_list 0] + # set table_title [lindex $table_stats_list 1] + # set table_comments [lindex $table_stats_list 2] + set table_flags [lindex $table_stats_list 6] + set trash_folder_p [lindex $table_stats_list 7] + set table_tid_from_name [qss_tid_from_name $table_name $instance_id $user_id] + rp_form_put mode v + rp_form_put table_tid $table_tid + rp_form_put trash_folder_p $trash_folder_p + rp_internal_redirect /packages/accounts-finance/www/pretti/index + ad_script_abort + } else { + set http_status 404 + } +} elseif { $path_info eq "trash" } { + set trash_folder_p 1 + rp_form_put trash_folder_p 1 + rp_internal_redirect /packages/accounts-finance/www/pretti/index + ad_script_abort +} else { + # table_tid does not exist. provide a 404 error + set http_status 404 +} + +if { $http_status eq "404" } { + doc_return 404 text/html " + [ad_header "Page Not Found"] +

    404 Page not found

    Please contact system administrator at [ad_system_owner] if you think this is a system error.

    " + ns_log Notice "accounts-finance/www/pretti/index.vuh.66: table_tid '$table_tid' not found for user_id $user_id instance_id $instance_id" + ad_script_abort +}