Index: openacs-4/packages/accounts-finance/tcl/modeling.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/accounts-finance/tcl/Attic/modeling.tcl,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/accounts-finance/tcl/modeling.tcl 17 May 2010 12:03:25 -0000 1.2 +++ openacs-4/packages/accounts-finance/tcl/modeling.tcl 17 May 2010 23:07:35 -0000 1.3 @@ -15,6 +15,12 @@ section 3: list of variables to report with iterations section 4: analysis calculations Each section is separated by a line with '\#'. +reserved variables: + i current iteration number, initial conditions are at iteraton 0, whole numbers + h is i - 1 + timestamp(i) is timestamp associated with period in seconds from system epoch + dt is duration of a period between timestamp(1) - timestamp(0) in seconds + } { # split model by '#' into these parts: # 1. initial calculations and conditions (including number of iterations) @@ -50,19 +56,20 @@ if { $err_state 0 } { set section_count 0 set model_sections_list [split $model \#] + set new_model_sections_list [list] foreach model_section $model_sections_list { incr section_count - if { $section_count < 3 } { set section_list [split $model_section \n\r] + set new_section_list [list] foreach calc_line $section_list { - if { ![regsub -- {=} $calc_line "\[expr " calc_line] } { + if { ![regsub -- {=} $calc_line "\[expr \{ " calc_line] } { append err_text "'${calc_line}' ignored. No equal sign found.\n" incr err_state set $calc_line "" } - set calc_line "set ${calc_line}\]" + set calc_line "set ${calc_line} \} \]" set varname [trim [string range ${calc_line} 5 [string first expr $calc_line]-2]] if { ![info exists $varname_list] } { # create list and array history for each variable @@ -71,54 +78,80 @@ } + if { [string length $calc_line ] > 0 } { + lappend new_section_list $calc_line + } } + set section_list $new_section_list } if { $section_count eq 1 } { + set new_section_list [list] foreach calc_line $section_list { # substitute var_arr(0) for variables on left side + set varname [trim [string range ${calc_line} 5 [string first expr $calc_line]-2]] + regsub -- $varname $calc_line "${varname}_arr(0)" calc_line # initial period is period 0 + if { [string length $calc_line ] > 0 } { + lappend new_section_list $calc_line + } } + set section_list $new_section_list } if { $section_count eq 2 } { + set new_section_list [list] foreach calc_line $section_list { - # substitute var_arr($previous_period) for variables on right side - # substitute var_arr($current_period) for variables on left side + # substitute var_arr($i) for variables on left side + set varname [trim [string range ${calc_line} 5 [string first expr $calc_line]-2]] + regsub -- $varname $calc_line "${varname}_arr(\$i)" calc_line + + # substitute var_arr($h) for variables on right side + # for each string found not an array or within paraenthesis, + regsub -nocase -all -- {[\$]([a-z0-9_]*)[^\(]} $calc_line "\1_arr(\$h)" calc_line + if { [string length $calc_line ] > 0 } { + lappend new_section_list $calc_line + } } + set section_list $new_section_list } if { $section_count eq 3 } { set section_list [split $model_section \n\r\ \,] + set new_section_list [list] set variables_list [list] # report values # convert to list of variables that get converted into a list of lists. # to be processed externally (sorted etc) foreach named_var $section_list { set named_var [trim $named_var] - if { [string length $named_var] > 0 } { - lappend variables_list $named_var - } } + set section_list $new_section_list } if { $section_count eq 4 } { set section_list [split $model_section \n\r] + set new_section_list [list] foreach calc_line $section_list { if { ![regsub -- {=} $calc_line {} calc_line] } { append err_text "'${calc_line}' ignored. No equal sign found.\n" incr err_state set $calc_line "" } set calc_line "set ${calc_line}" + if { [string length $named_var] > 0 } { + lappend variables_list $named_var + } } + set section_list $new_section_list } + lappend new_model_sections_list $section_list } -# process model + set model_sections_list $new_model_sections_list + # return compiled model as list of lists + return $model_sections_list -# repeat section 2. - #if default_arr(0) exists and var_arr(0) does not exist, set var_arr(0) to $default_arr(0) } else { set output "Unable to compile model. ${err_state} Errors. \n ${err_text}" @@ -127,3 +160,5 @@ } } + +# when processing, if default_arr(0) exists and var_arr(0) does not exist, set var_arr(0) to $default_arr(0)