Пример #1
0
/*
void Template::process ()
*/
void Template::process (const bool have_adjustments)
// end
{
    bool print_off = false;
    int line_no = 0;

    for (int iii = 1;  iii <= n_lines;  iii++)
    {
        char* line = lines[iii];

        if (strstr (line, "$number-of-trials$"))
	    replace_string_in_string (line, "$number-of-trials$", 
		number_of_trials);

        if (strstr (line, "$n-years$"))
	    replace_string_in_string (line, "$n-years$", projection_years);

        if (strstr (line, "$declarations$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
	        if (starts_with (vars[i], "//")) continue;

		print_indent ();

		if (is_random (vars[i]))
		    fprintf (f_out, "%s %s [%d+1];\n", 
			"double", vars[i], projection_years);
		else
		    fprintf (f_out, "%s %s [%d+1];\n", 
			types[i], vars[i], projection_years);

		++line_no;
	    }
	    continue;
	}

        if (strstr (line, "$period-0-values$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (starts_with (vars[i], "//")) continue;
		if (is_random (vars[i])) continue;

		print_indent ();

		char* y0;
		strcpy (&y0, year_0[i]);
		trim (y0);

		if (!strchr (y0, '.')) strcat (&y0, ".0");

	        fprintf (f_out, "%s[0] = %s;\n", vars[i], y0);
		++line_no;

		free (y0);
	    }
	    continue;
	}

        if (strstr (line, "$assignments$"))
	{
	    for (int ii = 1;  ii <= projection_years;  ii++)
	    {
		print_indent ();
		if (ii > 1) fprintf (f_out, "else ");
		fprintf (f_out, "if (y == %d)\n", ii);
		++line_no;

		print_indent ();
		fprintf (f_out, "{\n");
		++line_no;

		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (is_random (vars[i])) continue;

		    char* val;
		    strcpy (&val, years[ii][i]);

		    floatise (val);

		    print_indent ();
		    fprintf (f_out, "    %s[y] = %s;\n", vars[i], val);
		    ++line_no;

		    free (val);

		    fprintf (f_map, "s %d %d %d [%s]\n", 
			    line_no, i+1, ii+11, years[ii][i]);

		    if (mins_set[i])
		    {
			print_indent ();
		        fprintf (f_out, "    if (%s[y] < %s) %s[y] = %s;\n",
			    vars[i], mins[i], vars[i], mins[i]);
			++line_no;

			fprintf (f_map, "s %d %d %d [%s]\n", 
			    line_no, i+1, ii+11, years[ii][i]);
		    }

		    if (maxs_set[i])
		    {
			print_indent ();
		        fprintf (f_out, "    if (%s[y] > %s) %s[y] = %s;\n",
			    vars[i], maxs[i], vars[i], maxs[i]);
			++line_no;

			fprintf (f_map, "s %d %d %d [%s]\n", 
			    line_no, i+1, ii+11, years[ii][i]);
		    }
		}

		print_indent ();
		fprintf (f_out, "}\n");
		++line_no;
	    }
	    continue;
	}

        if (strstr (line, "$output$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (is_random (vars[i])) continue;
		if (starts_with (vars[i], "//")) continue;

		if (strciequal (include_in_output[i], "Y"))
		{
		    print_indent ();

		    fprintf (f_out, "fprintf(fp,\"%s\\t\",%s[y]);\n", 
			formats[i], vars[i]);

		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$headers$"))
	{
	    char* header;
	    strcpy (&header, "");

	    for (int i = 1;  i <= n_vars;  i++)
	    {
		const bool include = 
		    (strciequal (include_in_output[i], "Y")
		    && !starts_with (vars[i], "//"))
		    || is_random (vars[i]); 

		if (include) strcat (&header, descriptions[i], "\\t");
	    }

	    replace_string_in_string (line, "$headers$", header);
	    free (header);
	}

        if (strstr (line, "$threshold-expression-1["))
	{
	    char* where_var = strstr (line, "$threshold-expression-1[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, metrics[0].expression);

	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[0].row-1, 3, metrics[0].expression);
    }

    if (strstr (line, "$threshold-expression-2["))
    {
	char* where_var = strstr (line, "$threshold-expression-2[");

	char* var;
	strcpy (&var, where_var);
	*(strchr (var, ']')+2) = 0;

	char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, metrics[1].expression);

	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[1].row-1, 3, metrics[1].expression);
	}

        if (strstr (line, "$threshold-expression-3["))
	{
	    char* where_var = strstr (line, "$threshold-expression-3[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, metrics[2].expression);

	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[2].row-1, 3, metrics[2].expression);
	}

        if (strstr (line, "$threshold-expression-4["))
	{
	    char* where_var = strstr (line, "$threshold-expression-4[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, metrics[3].expression);

	    bool bad = strequal (ind, "0") && strstr (expression, "y-");

	    if (bad)
	        expression = (char*)"0";
	    else
	    {
	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);
	    }

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[3].row-1, 3, metrics[3].expression);
	}

        if (strstr (line, "$threshold-expression-5["))
	{
	    char* where_var = strstr (line, "$threshold-expression-5[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, metrics[4].expression);

	    bool bad = strequal (ind, "0") && strstr (expression, "y-");

	    if (bad)
	        expression = (char*)"0";
	    else
	    {
	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);
	    }

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[4].row-1, 3, metrics[4].expression);
	}

        if (strstr (line, "$thresh-relation$"))
	{
	    replace_string_in_string (line, "$thresh-relation$", 
		metrics[0].comparison);
	}

        if (strstr (line, "$thresholdlevel$"))
	{
	    bool percent_mode = (last_char(metrics[0].threshold_level) == '%');

	    if (percent_mode) last_char(metrics[0].threshold_level) = 0;

	    double val = atof (metrics[0].threshold_level);
	    if (percent_mode) val /= 100;

	    char thresholdlevel[80];
	    sprintf (thresholdlevel, "%.4f", val);

	    replace_string_in_string (line, "$thresholdlevel$", 
		thresholdlevel);
	}

	/*
        if (strstr (line, "$u-min-rnd$"))
	    replace_string_in_string (line, "$u-min-rnd$", u_min_rand);
        if (strstr (line, "$u-max-rnd$"))
	    replace_string_in_string (line, "$u-max-rnd$", u_max_rand);

        if (strstr (line, "$n-min-rnd$"))
	    replace_string_in_string (line, "$n-min-rnd$", n_min_rand);
        if (strstr (line, "$n-max-rnd$"))
	    replace_string_in_string (line, "$n-max-rnd$", n_max_rand);
        if (strstr (line, "$n-rand-mean$"))
	    replace_string_in_string (line, "$n-rand-mean$", n_rand_mean);
        if (strstr (line, "$n-std-or-sigma$"))
	    replace_string_in_string (line, "$n-std-or-sigma$", n_std_or_sigma);


        if (strstr (line, "$c-min-rnd$"))
	    replace_string_in_string (line, "$c-min-rnd$", c_min_rand);
        if (strstr (line, "$c-max-rnd$"))
	    replace_string_in_string (line, "$c-max-rnd$", c_max_rand);
        if (strstr (line, "$c-rand-mean$"))
	    replace_string_in_string (line, "$c-rand-mean$", c_rand_mean);
        if (strstr (line, "$c-std-or-sigma$"))
	    replace_string_in_string (line, "$c-std-or-sigma$", c_std_or_sigma);
	*/

	/*
	for (int i = 1;  i <= n_vars;  i++)
	{
	    if (strequal (vars[i], "normrandom"))
	    {
		if (strstr (line, "#if-n-min-set#"))
		{
		    replace_string_in_string (line, "#if-n-min-set#", "");
		    if (!mins_set[i]) print_off = true;
		}
		if (strstr (line, "#endif-n-min-set#"))
		{
		    replace_string_in_string (line, "#endif-n-min-set#", "");
		    print_off = false;
		}

		if (strstr (line, "#if-n-max-set#"))
		{
		    replace_string_in_string (line, "#if-n-max-set#", "");
		    if (!maxs_set[i]) print_off = true;
		}
		if (strstr (line, "#endif-n-max-set#"))
		{
		    replace_string_in_string (line, "#endif-n-max-set#", "");
		    print_off = false;
		}
	    }

	    else if (strequal (vars[i], "cauchyrandom"))
	    {
		if (strstr (line, "#if-c-min-set#"))
		{
		    replace_string_in_string (line, "#if-c-min-set#", "");
		    if (!mins_set[i]) print_off = true;
		}
		if (strstr (line, "#endif-c-min-set#"))
		{
		    replace_string_in_string (line, "#endif-c-min-set#", "");
		    print_off = false;
		}

		if (strstr (line, "#if-c-max-set#"))
		{
		    replace_string_in_string (line, "#if-c-max-set#", "");
		    if (!maxs_set[i]) print_off = true;
		}
		if (strstr (line, "#endif-c-max-set#"))
		{
		    replace_string_in_string (line, "#endif-c-max-set#", "");
		    print_off = false;
		}
	    }
	}
	*/

        if (strstr (line, "$initial-year$"))
	    replace_string_in_string (line, "$initial-year$", initial_year);

        if (strstr (line, "$threshold-label$"))
	    replace_string_in_string (line, "$threshold-label$", 
	    	threshold_label);

        if (strstr (line, "$government-entity$"))
	    replace_string_in_string (line, "$government-entity$", 
		government_entity);
        if (strstr (line, "$model-description$"))
	    replace_string_in_string (line, "$model-description$", 
		model_description);
        if (strstr (line, "$currency-units-in$"))
	    replace_string_in_string (line, "$currency-units-in$", 
		currency_units_in);
        if (strstr (line, "$trials$"))
	    replace_string_in_string (line, "$trials$", 
		number_of_trials);
        if (strstr (line, "$run-date-time$"))
	    replace_string_in_string (line, "$run-date-time$",
		timestamp());

        if (strstr (line, "$metrics-1-description$"))
	    replace_string_in_string (line, "$metrics-1-description$",
	        metrics[0].description);
        if (strstr (line, "$metrics-2-description$"))
	    replace_string_in_string (line, "$metrics-2-description$",
	        metrics[1].description);
        if (strstr (line, "$metrics-3-description$"))
	    replace_string_in_string (line, "$metrics-3-description$",
	        metrics[2].description);
        if (strstr (line, "$metrics-4-description$"))
	    replace_string_in_string (line, "$metrics-4-description$",
	        metrics[3].description);
        if (strstr (line, "$metrics-5-description$"))
	    replace_string_in_string (line, "$metrics-5-description$",
		metrics[4].description);

	if (strstr (line, "$print-ratios("))
	{
	    char* where_var = strstr (line, "$print-ratios(");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ')')+2) = 0;

	    int ind;
	    sscanf (where_var+14, "%d", &ind);

	    char* print_condition =
		strstr (metrics[ind-1].expression, "y-1") ? (char*)"false" : (char*)"true";

	    replace_string_in_string (line, var, print_condition);
	}

	if (strstr (line, "$if-ratio2-valid$"))
	    replace_string_in_string (line, "$if-ratio2-valid$",
		n_metrics >= 2 ? "" : "//" );

	if (strstr (line, "$if-ratio3-valid$"))
	    replace_string_in_string (line, "$if-ratio3-valid$",
		n_metrics >= 3 ? "" : "//" );
	if (strstr (line, "$if-ratio4-valid$"))
	    replace_string_in_string (line, "$if-ratio4-valid$",
		n_metrics >= 4 ? "" : "//" );
	if (strstr (line, "$if-ratio5-valid$"))
	    replace_string_in_string (line, "$if-ratio5-valid$",
		n_metrics >= 5 ? "" : "//" );

	if (strstr (line, "$random-headers$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		print_indent ();

		char* main_title;
		char* suffix;
		get_title (vars[i], main_title, suffix);

		fprintf (f_out, "fprintf (fp, \"%s %s\\t\");\n", main_title, suffix);
		++line_no;
	    }

	    continue;
	}

	if (strstr (line, "$unirandom-declarations$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"unirandom"))
		{
		    print_indent ();
		    fprintf (f_out, "        boost::uniform_real < > gen_%s (%s, %s);\n", vars[i], mins[i], maxs[i]);

		    print_indent ();
		    fprintf (f_out, "        boost::variate_generator < boost::lagged_fibonacci1279&, boost::uniform_real < > > rand_%s (rng, gen_%s);\n", vars[i], vars[i]);
		    line_no += 2;
		}
	    }

	    continue;
	}

	if (strstr (line, "$normrandom-declarations$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"normrandom"))
		{
		    print_indent ();
		    fprintf (f_out, "        boost::normal_distribution < > gen_%s (%s, %s);\n", vars[i], means[i], std_sigmas[i]);

		    print_indent ();
		    fprintf (f_out, "        boost::variate_generator < boost::lagged_fibonacci1279&, boost::normal_distribution < > > rand_%s (rng, gen_%s);\n", vars[i], vars[i]);
		    line_no += 2;
		}
	    }

	    continue;
	}

	if (strstr (line, "$cauchyrandom-declarations$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"cauchyrandom"))
		{
		    print_indent ();
		    fprintf (f_out, "        boost::cauchy_distribution < > gen_%s (%s, %s);\n", vars[i], means[i], std_sigmas[i]);

		    print_indent ();
		    fprintf (f_out, "        boost::variate_generator < boost::lagged_fibonacci1279&, boost::cauchy_distribution < > > rand_%s (rng, gen_%s);\n", vars[i], vars[i]);
		    line_no += 2;
		}
	    }

	    continue;
	}

	if (strstr (line, "$unirandom-assignments$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"unirandom"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "    %s[y] = rand_%s();\n", vars[i], vars[i]);
		    ++line_no;
		}

	    }

	    continue;
	}

	if (strstr (line, "$normrandom-assignments$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
		if (starts_with (vars[i], (char*)"normrandom"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "for (;;)\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "{\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "%s[y] = rand_%s();\n", vars[i], vars[i]);
		    line_no += 3;

		    if (mins_set[i]) 
		    {
			::print_indent (f_out, line);
			fprintf (f_out, 
			    "if (%s[y] < %s) continue;\n", vars[i], mins[i]);
			++line_no;
		    }
		    if (maxs_set[i])
		    {
			::print_indent (f_out, line);
			fprintf (f_out, 
			    "if (%s[y] > %s) continue;\n", vars[i], maxs[i]);
			++line_no;
		    }

		    ::print_indent (f_out, line);
		    fprintf (f_out, "break;\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "}\n");
		    line_no += 2;
		}

	    continue;
	}

	if (strstr (line, "$cauchyrandom-assignments$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
		if (starts_with (vars[i], (char*)"cauchyrandom"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "for (;;)\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "{\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "%s[y] = rand_%s();\n", vars[i], vars[i]);
		    line_no += 3;

		    if (mins_set[i]) 
		    {
			::print_indent (f_out, line);
			fprintf (f_out, 
			    "if (%s[y] < %s) continue;\n", vars[i], mins[i]);
			++line_no;
		    }
		    if (maxs_set[i])
		    {
			::print_indent (f_out, line);
			fprintf (f_out, 
			    "if (%s[y] > %s) continue;\n", vars[i], maxs[i]);
			++line_no;
		    }

		    ::print_indent (f_out, line);
		    fprintf (f_out, "break;\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "}\n");
		    line_no += 2;
		}

	    continue;
	}

	if (strstr (line, "$print-random-values$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		::print_indent (f_out, line);
		fprintf (f_out, "    fprintf(fp,\"%%5.4f\\t\",%s[y]);\n", vars[i]);
		++line_no;
	    }

	    continue;
	}

	if (strstr (line, "$print-y0-random-values$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		::print_indent (f_out, line);
		fprintf (f_out, "    fprintf(fp,\"\\t\");\n");
		++line_no;
	    }

	    continue;
	}

// by RW 31/05/12
	/*
	do_adjustments ();
	*/
	if (strstr (line, "$adjustments$"))
	{
	    if (have_adjustments)
		do_adjustments ();

	    continue;
	}
// end

	/*
	if (strstr (line, "$rating-equivalent"))
	    do_rating_equivalent (line);
	*/

        if (strstr (line, "$n-ratings$"))
	    replace_string_in_string (line, "$n-ratings$", n_ratings);

        if (strstr (line, "$ratings$"))
	{
	    char* txt_ratings;
	    strcpy (&txt_ratings, "");

	    for (int i = 2;  i <= n_ratings+1;  i++)
	    {
		if (i > 2) chrcat (&txt_ratings, ',');
	        strcat (&txt_ratings, "\"", ratings[i], "\"");
	    }

	    replace_string_in_string (line, "$ratings$", txt_ratings);
	    free (txt_ratings);
	}

        if (strstr (line, "$rating-grid$"))
	{
	    char* grid;
	    strcpy (&grid, "");

	    for (int i = 1;  i <= projection_years;  i++)
	    {
	        chrcat (&grid, '{');

		for (int j = 2;  j <= n_ratings;  j++)
		{
		    if (j > 2) chrcat (&grid, ',');
		    strcat (&grid, ratings_grid[i][j]);
		}

	        chrcat (&grid, '}');

		if (i < projection_years) 
		    strcat (&grid, ",\n");
	    }

	    replace_string_in_string (line, "$rating-grid$", grid);
	    free (grid);
	}

        if (strstr (line, "$default-probability-code$"))
	    replace_string_in_string (line, "$default-probability-code$", 
		def_prob_code);

	if (!print_off) 
	{
	    fprintf (f_out, "%s\n", line);
	    ++line_no;
	}

	record_indent (line);

//	printf ("-- %d [%s]\n", line_no, line);
    }
}
Пример #2
0
void controller_stable( void *ptr ) {
	unsigned long c = 0;
	float m_fl,m_bl,m_fr,m_br; //motor FL, BL, FR, BR

	float loop_ms = 1000.0f/GYRO_RATE;
	float loop_s = loop_ms/1000.0f;

	while (ms_update()!=0);//empty MPU

	for (int i=0;i<3;i++) {
		pid_setmode(&config.pid_r[i],1);
		pid_setmode(&config.pid_s[i],1);
	}
	flush();
	t=rt_timer_read();
	while(1) {
		ms_err = ms_update();
		if (ms_err==0) continue; //dont do anything if gyro has no new data; depends on gyro RATE
		if (ms_err<0) { //something wrong with gyro: i2c issue or fifo full!
			ms.ypr[0]=ms.ypr[1]=ms.ypr[2] = 0.0f; 
			ms.gyro[0]=ms.gyro[1]=ms.gyro[2] = 0.0f;
		}
		c++; //our counter so we know when to read barometer (c increases every 10ms)
		//bs_err = bs_update(c*loop_ms);

		rec_err = rec_update();
		
		pre_flight();
		handle_issues();
		autoflight();

		if (armed && rec.yprt[3]>(config.esc_min+10)) { 
			inflight = 1; 
		}

		if (rec.yprt[3]<=(config.esc_min+10)) {
			inflight = 0;	
			sc_update(MOTOR_FL,config.esc_min);
			sc_update(MOTOR_BL,config.esc_min);
			sc_update(MOTOR_FR,config.esc_min);
			sc_update(MOTOR_BR,config.esc_min);
			yaw_target = ms.ypr[0];	
			bs.p0 = bs.p;
		}
		
		if (rec.yprt[3]<(config.esc_min+50)) { //use integral part only if there is some throttle
			for (int i=0;i<3;i++) { 
				config.pid_r[i]._KiTerm = 0.0f;
				config.pid_s[i]._KiTerm = 0.0f;
			}
		}	

		do_adjustments();
	
		//our quad can rotate 360 degree if commanded, it is ok!; learned it the hard way!
		if (yaw_target-ms.ypr[0]<-180.0f) yaw_target*=-1;
		if (yaw_target-ms.ypr[0]>180.0f) yaw_target*=-1;

		//do STAB PID
		for (int i=0;i<3;i++) { 
			if (i==0) //keep yaw_target 
				pid_update(&config.pid_s[i],yaw_target,ms.ypr[i],loop_s);
			else
				pid_update(&config.pid_s[i],rec.yprt[i]+config.trim[i],ms.ypr[i],loop_s);
			
		}

		//yaw requests will be fed directly to rate pid
		if (abs(rec.yprt[0])>7.5f) {
			config.pid_s[0].value = rec.yprt[0];
			yaw_target = ms.ypr[0];	
		}

		if (mode == 1) { //yaw setup
			config.pid_s[0].value = 0.0f;
			config.pid_s[1].value = ms.gyro[1];
			config.pid_s[2].value = ms.gyro[2];
		} else if (mode == 2) { //pitch setup
			config.pid_s[0].value = ms.gyro[0];
			config.pid_s[1].value = 0.0f;
			config.pid_s[2].value = ms.gyro[2];
		} else if (mode == 3) { //roll setup
			config.pid_s[0].value = ms.gyro[0];
			config.pid_s[1].value = ms.gyro[1];
			config.pid_s[2].value = 0.0f;
		}

		//do RATE PID
		for (int i=0;i<3;i++) { 
			pid_update(&config.pid_r[i],config.pid_s[i].value,ms.gyro[i],loop_s);
		}

		//calculate motor speeds
		m_fl = rec.yprt[3]-config.pid_r[2].value-config.pid_r[1].value+config.pid_r[0].value;
		m_bl = rec.yprt[3]-config.pid_r[2].value+config.pid_r[1].value-config.pid_r[0].value;
		m_fr = rec.yprt[3]+config.pid_r[2].value-config.pid_r[1].value-config.pid_r[0].value;
		m_br = rec.yprt[3]+config.pid_r[2].value+config.pid_r[1].value+config.pid_r[0].value;

		log();

		if (inflight) {
			sc_update(MOTOR_FL,m_fl);
			sc_update(MOTOR_BL,m_bl);
			sc_update(MOTOR_FR,m_fr);
			sc_update(MOTOR_BR,m_br);
		}
	}
}
Пример #3
0
void Template::process (const bool have_adjustments)
{
    const bool show_projection_details  = strequal (projection_details, "Y");
    const bool show_summary = 
	show_projection_details || strequal (projection_details, "S");

    int n_threads;
    if (strequal (n_cores, "A"))
        n_threads = get_n_cores ();
    else
        n_threads = atoi (n_cores);

    bool print_off = false;
    int line_no = 0;

    for (int iii = 1;  iii <= n_lines;  iii++)
    {
        char* line = lines[iii];

        if (strstr (line, "$year-declarations$"))
	{
	    for (int ii = 1;  ii <= projection_years;  ii++)
	    {
		print_indent ();
		fprintf (f_out, "static void yr_%d (const int, const int);\n", ii);
		++line_no;
	    }
	    continue;
	}

        if (strstr (line, "$n-trials$"))
	    replace_string_in_string (line, "$n-trials$", number_of_trials);

        if (strstr (line, "$n-years$"))
	    replace_string_in_string (line, "$n-years$", projection_years);

        if (strstr (line, "$n-threads$"))
	    replace_string_in_string (line, "$n-threads$", n_threads);

        if (strstr (line, "$show-projection-details$"))
	{
	    const char* spd = show_projection_details ? "true" : "false";
	    replace_string_in_string (line, "$show-projection-details$", spd);
	}

        if (strstr (line, "$show-summary$"))
	{
	    const char* sum = show_summary ? "true" : "false";
	    replace_string_in_string (line, "$show-summary$", sum);
	}

        if (strstr (line, "$have-seed$"))
	{
	    bool have_seed = !strequal (fixed_random_seed, "N");
	    const char* s_have_seed = have_seed ? "true" : "false";
	    replace_string_in_string (line, "$have-seed$", s_have_seed);
	}

        if (strstr (line, "$seed$"))
	{
	    bool have_seed = !strequal (fixed_random_seed, "N");

	    char s_seed[20];
	    sprintf (s_seed, "%s", have_seed ? fixed_random_seed : "-1");

	    replace_string_in_string (line, "$seed$", s_seed);
	}

        if (strstr (line, "$non-dpc$"))
	{
	    char* s_non_dpc = (char*)"false";

	    if (strequal (def_prob_code, "\"\"") 
	    || strequal (def_prob_code, ""))
	        s_non_dpc = (char*)"true";

	    replace_string_in_string (line, "$non-dpc$", s_non_dpc);
	}

        if (strstr (line, "$variable-definitions$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
	        if (starts_with (vars[i], "//")) continue;
		if (!compute[i]) continue;

		print_indent ();

		if (is_random (vars[i]))
		    fprintf (f_out, "static %s %s [n_threads][%d+1];\n", 
			"double", vars[i], projection_years);
		else
		    fprintf (f_out, "static %s %s [n_threads][%d+1];\n", 
			types[i], vars[i], projection_years);

		++line_no;
	    }
	    continue;
	}

        if (strstr (line, "$sigma-definitions$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;

		    print_indent ();

		    if (is_random (vars[i]))
			fprintf (f_out, "static %s sigma_%s[n_threads][%d+1];\n", 
			    "double", vars[i], projection_years);
		    else
			fprintf (f_out, "static %s sigma_%s[n_threads][%d+1];\n", 
			    types[i], vars[i], projection_years);

		    ++line_no;
		}
	    }

	    continue;
	}

        if (strstr (line, "$minima-definitions$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    print_indent ();
    
		    if (is_random (vars[i]))
			fprintf (f_out, "static %s minimum_%s [n_threads][%d+1];\n", 
			    "double", vars[i], projection_years);
		    else
			fprintf (f_out, "static %s minimum_%s [n_threads][%d+1];\n", 
			    types[i], vars[i], projection_years);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$maxima-definitions$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    print_indent ();
    
		    if (is_random (vars[i]))
			fprintf (f_out, "static %s maximum_%s [n_threads][%d+1];\n", 
			    "double", vars[i], projection_years);
		    else
			fprintf (f_out, "static %s maximum_%s [n_threads][%d+1];\n", 
			    types[i], vars[i], projection_years);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$sigma-inits$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    print_indent ();
    
		    fprintf (f_out, 
 "    sigma_%s[th][y] = 0;\n", vars[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$summations$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    ::print_indent (f_out, line);
    
		    if (is_random (vars[i])) 
			fprintf (f_out, "if (y>0) ");
    
		    fprintf (f_out, "sigma_%s[th][y] += %s[th][y];\n", 
			vars[i], vars[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$update-minima"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    ::print_indent (f_out, line);
    
		    if (is_random (vars[i])) 
			fprintf (f_out, "if (y>0) ");
    
		    fprintf (f_out, 
    "if (%s[th][y] < minimum_%s[th][y]) minimum_%s[th][y] = %s[th][y];\n", 
			    vars[i], vars[i], vars[i], vars[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$update-maxima"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    ::print_indent (f_out, line);
    
		    if (is_random (vars[i])) 
			fprintf (f_out, "if (y>0) ");
    
		    fprintf (f_out, 
	"if (%s[th][y] > maximum_%s[th][y]) maximum_%s[th][y] = %s[th][y];\n", 
				vars[i], vars[i], vars[i], vars[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$sigma-combinations"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    ::print_indent (f_out, line);
    
		    if (is_random (vars[i])) 
			fprintf (f_out, "if (y>0) ");
    
		    fprintf (f_out, "sigma_%s[0][y] += sigma_%s[th][y];\n",
			    vars[i], vars[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}


        if (strstr (line, "$min-combinations"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    ::print_indent (f_out, line);
    
		    if (is_random (vars[i])) 
			fprintf (f_out, "if (y>0) ");
    
		    fprintf (f_out, 
	"minimum_%s[0][y] = min (minimum_%s[0][y], minimum_%s[th][y]);\n",
			    vars[i], vars[i], vars[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$max-combinations"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    ::print_indent (f_out, line);
    
		    if (is_random (vars[i])) 
			fprintf (f_out, "if (y>0) ");
    
		    fprintf (f_out, 
	"maximum_%s[0][y] = max (maximum_%s[0][y], maximum_%s[th][y]);\n",
			    vars[i], vars[i], vars[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$means$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
    
		    char* sep = (i < n_vars) ? (char*)"\\t" : (char*)"\\n";
    
		    if (strciequal (include_in_output[i], "Y"))
		    {
			if (is_random (vars[i]))
			{
			    ::print_indent (f_out, line);
			    fprintf (f_out, "if (y > 0)\n");
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "    fprintf (fp, \"%s", formats[i]);
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ", sigma_%s[0][y]/n_trials);\n", vars[i]);
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "else\n");
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "    fprintf (fp, \"");
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ");\n");
    
			    line_no += 4;
			}
			else
			{
			    ::print_indent (f_out, line);
			    fprintf (f_out, "fprintf (fp, \"%s", formats[i]);
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ", sigma_%s[0][y]/n_trials);\n", vars[i]);
    
			    ++line_no;
			}
		    }
		}
	    }
	    continue;
	}

        if (strstr (line, "$minima$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
    
		    if (strciequal (include_in_output[i], "Y"))
		    {
			char* sep = (i < n_vars) ? (char*)"\\t" : (char*)"\\n";
    
			if (is_random (vars[i]))
			{
			    ::print_indent (f_out, line);
			    fprintf (f_out, "if (y > 0)\n");
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "    fprintf (fp, \"%s", formats[i]);
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ", minimum_%s[0][y]);\n", vars[i]);
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "else\n");
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "    fprintf (fp, \"");
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ");\n");
    
			    line_no += 4;
			}
			else
			{
			    ::print_indent (f_out, line);
			    fprintf (f_out, "fprintf (fp, \"%s", formats[i]);
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ", minimum_%s[0][y]);\n", vars[i]);
    
			    ++line_no;
			}
		    }
		}
	    }
	    continue;
	}

        if (strstr (line, "$maxima$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
    
		    if (strciequal (include_in_output[i], "Y"))
		    {
			char* sep = (i < n_vars) ? (char*)"\\t" : (char*)"\\n";
    
			if (is_random (vars[i]))
			{
			    ::print_indent (f_out, line);
			    fprintf (f_out, "if (y > 0)\n");
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "    fprintf (fp, \"%s", formats[i]);
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ", maximum_%s[0][y]);\n", vars[i]);
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "else\n");
    
			    ::print_indent (f_out, line);
			    fprintf (f_out, "    fprintf (fp, \"");
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ");\n");
    
			    line_no += 4;
			}
			else
			{
			    ::print_indent (f_out, line);
			    fprintf (f_out, "fprintf (fp, \"%s", formats[i]);
			    fprintf (f_out, "%s\"", sep);
			    fprintf (f_out, ", maximum_%s[0][y]);\n", vars[i]);
    
			    ++line_no;
			}
		    }
		}
	    }
	    continue;
	}

        if (strstr (line, "$period-0-values$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (starts_with (vars[i], "//")) continue;
		if (is_random (vars[i])) continue;
		if (!compute[i]) continue;

		print_indent ();

		char* y0;
		strcpy (&y0, year_0[i]);
		trim (y0);

		replace_string_in_string (y0, "\"\"", "");

		if (!strchr (y0, '.')) strcat (&y0, ".0");

	        fprintf (f_out, "%s[th][0] = %s;\n", vars[i], y0);
		++line_no;

		free (y0);
	    }
	    continue;
	}

        if (strstr (line, "$minima-inits$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
    
		    print_indent ();
		    fprintf (f_out, 
			"    minimum_%s[th][y] = numeric_limits<%s>::max();\n", 
			vars[i], types[i]);
    
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$maxima-inits$"))
	{
	    if (show_summary)
	    {
		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (strciequal (include_in_output[i], "N")) continue;
	
		    print_indent ();
		    fprintf (f_out, 
			"    maximum_%s[th][y] = -numeric_limits<%s>::max();\n", 
			vars[i], types[i]);
	
		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$do-year-inits$"))
	{
	    for (int ii = 1;  ii <= projection_years;  ii++)
	    {
		print_indent ();
		fprintf (f_out, "    do_years[%d] = yr_%d;\n", ii, ii);
		++line_no;
	    }
	    continue;
	}

        if (strstr (line, "$compute$"))
	{
	    for (int ii = 1;  ii <= projection_years;  ii++)
	    {
		print_indent ();
		fprintf (f_out, "do_years[%d](%d, th);\n", ii, ii);
		++line_no;
	    }
	    continue;
	}

        if (strstr (line, "$assignments$"))
	{
	    for (int ii = 1;  ii <= projection_years;  ii++)
	    {
		print_indent ();
		fprintf (f_out, "void yr_%d (const int y, const int th)\n", ii);
		++line_no;

		print_indent ();
		fprintf (f_out, "{\n");
		++line_no;

		for (int i = 1;  i <= n_vars;  i++)
		{
		    if (starts_with (vars[i], "//")) continue;
		    if (is_random (vars[i])) continue;
		    if (!compute[i]) continue;

		    char* val = threaded_val (years[ii][i]);

		    replace_string_in_string (val, "\"\"", "");

		    char* rep;
		    strcpy (&rep, "[");
		    numcat (&rep, ii);
		    strcat (&rep, "]");

		    replace_string_in_string (val, "[y]", rep);

		    strcpy (&rep, "[");
		    numcat (&rep, ii-1);
		    strcat (&rep, "]");

		    replace_string_in_string (val, "[y-1]", rep);

		    floatise (val);

		    print_indent ();
		    fprintf (f_out, "    %s[th][%d] = %s;\n", vars[i], ii, val);

		    ++line_no;

		    free (val);

		    fprintf (f_map, "s %d %d %d [%s]\n", 
			    line_no, i+1, ii+11, years[ii][i]);

		    if (mins_set[i])
		    {
			print_indent ();
		        fprintf (f_out, "    if (%s[th][%d] < %s) %s[th][%d] = %s;\n",
			    vars[i], ii, mins[i], vars[i], ii, mins[i]);
			++line_no;

			fprintf (f_map, "s %d %d %d [%s]\n", 
			    line_no, i+1, ii+11, years[ii][i]);
		    }

		    if (maxs_set[i])
		    {
			print_indent ();
		        fprintf (f_out, "    if (%s[th][%d] > %s) %s[th][%d] = %s;\n",
			    vars[i], ii, maxs[i], vars[i], ii, maxs[i]);
			++line_no;

			fprintf (f_map, "s %d %d %d [%s]\n", 
			    line_no, i+1, ii+11, years[ii][i]);
		    }
		}

		print_indent ();
		fprintf (f_out, "}\n");
		++line_no;
	    }
	    continue;
	}

        if (strstr (line, "$body-2-defs$"))
	{
	    fprintf (f_out, "char bufy[n_years+1][80];\n");
	    ++line_no;

	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (strciequal (include_in_output[i], "Y"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "char buf_%s[n_years+1][80];\n", vars[i]);
		    ++line_no;
		}
	    }

	    continue;
	}

        if (strstr (line, "$output-gen$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (is_random (vars[i])) continue;
		if (starts_with (vars[i], "//")) continue;

		if (strciequal (include_in_output[i], "Y"))
		{
		    ::print_indent (f_out, line);

		    fprintf (f_out, "\"%s\\t\"\n", 
			formats[i]);

		    ++line_no;
		}
	    }

	    ::print_indent (f_out, line);
	    fprintf (f_out, "\"\\t\"\n");

	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (is_random (vars[i])) continue;
		if (starts_with (vars[i], "//")) continue;

		if (strciequal (include_in_output[i], "Y"))
		{
		    ::print_indent (f_out, line);

		    fprintf (f_out, ",%s[th][y]\n", 
			vars[i]);

		    ++line_no;
		}
	    }
	    continue;
	}

        if (strstr (line, "$output-print$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;
		if (starts_with (vars[i], "//")) continue;

		if (strciequal (include_in_output[i], "Y"))
		{
		    ::print_indent (f_out, line);

		    fprintf (f_out, 
	"fwrite(buf_%s[y], strlen(buf_%s[y]), 1, fp);\n",
			vars[i], vars[i]);

		    ++line_no;
		}
	    }

	    continue;
	}


        if (strstr (line, "$headers$"))
	{
	    char* header;
	    strcpy (&header, "");

	    for (int i = 1;  i <= n_vars;  i++)
	    {
		const bool include = 
		    (strciequal (include_in_output[i], "Y")
		    && !starts_with (vars[i], "//"));

		if (include) strcat (&header, descriptions[i], "\\t");
	    }

	    replace_string_in_string (line, "$headers$", header);
	    free (header);
	}

        if (strstr (line, "$threshold-expression-1["))
	{
	    char* where_var = strstr (line, "$threshold-expression-1[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, threaded_val(metrics[0].expression));

	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[0].row-1, 3, metrics[0].expression);
    }

    if (strstr (line, "$threshold-expression-2["))
    {
	char* where_var = strstr (line, "$threshold-expression-2[");

	char* var;
	strcpy (&var, where_var);
	*(strchr (var, ']')+2) = 0;

	char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, threaded_val(metrics[1].expression));

	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[1].row-1, 3, metrics[1].expression);
	}

        if (strstr (line, "$threshold-expression-3["))
	{
	    char* where_var = strstr (line, "$threshold-expression-3[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, threaded_val(metrics[2].expression));

	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[2].row-1, 3, metrics[2].expression);
	}

        if (strstr (line, "$threshold-expression-4["))
	{
	    char* where_var = strstr (line, "$threshold-expression-4[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, threaded_val(metrics[3].expression));

	    bool bad = strequal (ind, "0") && strstr (expression, "y-");

	    if (bad)
	        expression = (char*)"0";
	    else
	    {
	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);
	    }

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[3].row-1, 3, metrics[3].expression);
	}

        if (strstr (line, "$threshold-expression-5["))
	{
	    char* where_var = strstr (line, "$threshold-expression-5[");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ']')+2) = 0;

	    char* idx;
	    strcpy (&idx, where_var+23);

	    char ind[20];
	    sscanf (idx+1, "%[^]]", ind);

	    char* expression;
	    strcpy (&expression, threaded_val(metrics[4].expression));

	    bool bad = strequal (ind, "0") && strstr (expression, "y-");

	    if (bad)
	        expression = (char*)"0";
	    else
	    {
	    char rep[20];
	    sprintf (rep, "[%s]", ind);

	    replace_string_in_string (expression, "[y]", rep);
	    }

	    replace_string_in_string (line, var, expression);

	    fprintf (f_map, "m %d %d %d [%s]\n", 
		line_no, metrics[4].row-1, 3, metrics[4].expression);
	}

        if (strstr (line, "$thresh-relation$"))
	{
	    replace_string_in_string (line, "$thresh-relation$", 
		metrics[0].comparison);
	}

        if (strstr (line, "$thresholdlevel$"))
	{
	    bool percent_mode = (last_char(metrics[0].threshold_level) == '%');

	    if (percent_mode) last_char(metrics[0].threshold_level) = 0;

	    double val = atof (metrics[0].threshold_level);
	    if (percent_mode) val /= 100;

	    char thresholdlevel[80];
	    sprintf (thresholdlevel, "%.4f", val);

	    replace_string_in_string (line, "$thresholdlevel$", 
		thresholdlevel);
	}

        if (strstr (line, "$initial-year$"))
	    replace_string_in_string (line, "$initial-year$", initial_year);

        if (strstr (line, "$threshold-label$"))
	    replace_string_in_string (line, "$threshold-label$", 
	    	threshold_label);

        if (strstr (line, "$government-entity$"))
	    replace_string_in_string (line, "$government-entity$", 
		government_entity);
        if (strstr (line, "$model-description$"))
	    replace_string_in_string (line, "$model-description$", 
		model_description);
        if (strstr (line, "$currency-units-in$"))
	    replace_string_in_string (line, "$currency-units-in$", 
		currency_units_in);

        if (strstr (line, "$metrics-1-description$"))
	    replace_string_in_string (line, "$metrics-1-description$",
	        metrics[0].description);
        if (strstr (line, "$metrics-2-description$"))
	    replace_string_in_string (line, "$metrics-2-description$",
	        metrics[1].description);
        if (strstr (line, "$metrics-3-description$"))
	    replace_string_in_string (line, "$metrics-3-description$",
	        metrics[2].description);
        if (strstr (line, "$metrics-4-description$"))
	    replace_string_in_string (line, "$metrics-4-description$",
	        metrics[3].description);
        if (strstr (line, "$metrics-5-description$"))
	    replace_string_in_string (line, "$metrics-5-description$",
		metrics[4].description);

	if (strstr (line, "$print-ratios("))
	{
	    char* where_var = strstr (line, "$print-ratios(");

	    char* var;
	    strcpy (&var, where_var);
	    *(strchr (var, ')')+2) = 0;

	    int ind;
	    sscanf (where_var+14, "%d", &ind);

	    char* print_condition =
		strstr (metrics[ind-1].expression, "y-1") ? (char*)"false" : (char*)"true";

	    replace_string_in_string (line, var, print_condition);
	}

	if (strstr (line, "$if-ratio2-valid$"))
	    replace_string_in_string (line, "$if-ratio2-valid$",
		n_metrics >= 2 ? "" : "//" );

	if (strstr (line, "$if-ratio3-valid$"))
	    replace_string_in_string (line, "$if-ratio3-valid$",
		n_metrics >= 3 ? "" : "//" );
	if (strstr (line, "$if-ratio4-valid$"))
	    replace_string_in_string (line, "$if-ratio4-valid$",
		n_metrics >= 4 ? "" : "//" );
	if (strstr (line, "$if-ratio5-valid$"))
	    replace_string_in_string (line, "$if-ratio5-valid$",
		n_metrics >= 5 ? "" : "//" );

	if (strstr (line, "$random-headers$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		print_indent ();

		char* main_title;
		char* suffix;
		get_title (vars[i], main_title, suffix);

		fprintf (f_out, "fprintf (fp, \"%s %s\\t\");\n", main_title, suffix);
		++line_no;
	    }

	    continue;
	}

	if (strstr (line, "$unirandom-definitions$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"unirandom"))
		{
		    print_indent ();
		    fprintf (f_out, "        boost::uniform_real < > gen_%s (%s, %s);\n", vars[i], mins[i], maxs[i]);

		    print_indent ();
		    fprintf (f_out, "        boost::variate_generator < boost::lagged_fibonacci1279&, boost::uniform_real < > > rand_%s (rng, gen_%s);\n", vars[i], vars[i]);
		    fprintf (f_out, "\n");
		    line_no += 3;
		}
	    }

	    continue;
	}

	if (strstr (line, "$normrandom-definitions$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"normrandom"))
		{
		    print_indent ();
		    fprintf (f_out, "        boost::normal_distribution < > gen_%s (%s, %s);\n", vars[i], means[i], std_sigmas[i]);

		    print_indent ();
		    fprintf (f_out, "        boost::variate_generator < boost::lagged_fibonacci1279&, boost::normal_distribution < > > rand_%s (rng, gen_%s);\n", vars[i], vars[i]);
		    fprintf (f_out, "\n");
		    line_no += 3;
		}
	    }

	    continue;
	}

	if (strstr (line, "$cauchyrandom-definitions$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"cauchyrandom"))
		{
		    print_indent ();
		    fprintf (f_out, "        boost::cauchy_distribution < > gen_%s (%s, %s);\n", vars[i], means[i], std_sigmas[i]);

		    print_indent ();
		    fprintf (f_out, "        boost::variate_generator < boost::lagged_fibonacci1279&, boost::cauchy_distribution < > > rand_%s (rng, gen_%s);\n", vars[i], vars[i]);
		    fprintf (f_out, "\n");
		    line_no += 3;
		}
	    }

	    continue;
	}

	if (strstr (line, "$unirandom-assignments$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (starts_with (vars[i], (char*)"unirandom"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "    %s[th][y] = rand_%s();\n", vars[i], vars[i]);
		    ++line_no;
		}

	    }

	    continue;
	}

	if (strstr (line, "$normrandom-assignments$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
		if (starts_with (vars[i], (char*)"normrandom"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "for (;;)\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "{\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "    %s[th][y] = rand_%s();\n", 
			vars[i], vars[i]);
		    line_no += 3;

		    if (mins_set[i]) 
		    {
			::print_indent (f_out, line);
			fprintf (f_out, "    if (%s[th][y] < %s) continue;\n", 
			    vars[i], mins[i]);
			++line_no;
		    }
		    if (maxs_set[i])
		    {
			::print_indent (f_out, line);
			fprintf (f_out, "    if (%s[th][y] > %s) continue;\n", 
			    vars[i], maxs[i]);
			++line_no;
		    }

		    ::print_indent (f_out, line);
		    fprintf (f_out, "    break;\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "}\n");
		    line_no += 2;
		}

	    continue;
	}

	if (strstr (line, "$cauchyrandom-assignments$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
		if (starts_with (vars[i], (char*)"cauchyrandom"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "for (;;)\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "{\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "    %s[th][y] = rand_%s();\n", 
			vars[i], vars[i]);
		    line_no += 3;

		    if (mins_set[i]) 
		    {
			::print_indent (f_out, line);
			fprintf (f_out, "    if (%s[th][y] < %s) continue;\n", 
			    vars[i], mins[i]);
			++line_no;
		    }
		    if (maxs_set[i])
		    {
			::print_indent (f_out, line);
			fprintf (f_out, "    if (%s[th][y] > %s) continue;\n", 
			    vars[i], maxs[i]);
			++line_no;
		    }

		    ::print_indent (f_out, line);
		    fprintf (f_out, "    break;\n");
		    ::print_indent (f_out, line);
		    fprintf (f_out, "}\n");
		    line_no += 2;
		}

	    continue;
	}

	if (strstr (line, "$store-y0-random-values$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (strciequal (include_in_output[i], "Y"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "sprintf(buf_%s[y],\"\\t\");\n", vars[i]);

		    ++line_no;
		}
	    }

	    continue;
	}


	if (strstr (line, "$store-random-values$"))
	{
	    for (int i = 1;  i <= n_vars;  i++)
	    {
		if (!is_random (vars[i])) continue;

		if (strciequal (include_in_output[i], "Y"))
		{
		    ::print_indent (f_out, line);
		    fprintf (f_out, "sprintf(buf_%s[y],\"%%5.4f\\t\",%s[th][y]);\n", 
		    vars[i], vars[i]);
		    ++line_no;
		}
	    }

	    continue;
	}

	if (strstr (line, "$adjustments$"))
	{
	    if (have_adjustments)
		do_adjustments (line_no);

	    continue;
	}

        if (strstr (line, "$n-ratings$"))
	    replace_string_in_string (line, "$n-ratings$", n_ratings);

        if (strstr (line, "$ratings$"))
	{
	    char* txt_ratings;
	    strcpy (&txt_ratings, "");

	    for (int i = 2;  i <= n_ratings+1;  i++)
	    {
		if (i > 2) chrcat (&txt_ratings, ',');
	        strcat (&txt_ratings, "\"", ratings[i], "\"");
	    }

	    replace_string_in_string (line, "$ratings$", txt_ratings);
	    free (txt_ratings);
	}

        if (strstr (line, "$rating-grid$"))
	{
	    char* grid;
	    strcpy (&grid, "");

	    for (int i = 1;  i <= projection_years;  i++)
	    {
	        chrcat (&grid, '{');

		for (int j = 2;  j <= n_ratings;  j++)
		{
		    if (j > 2) chrcat (&grid, ',');
		    strcat (&grid, ratings_grid[i][j]);
		}

	        chrcat (&grid, '}');

		if (i < projection_years) 
		    strcat (&grid, ",\n");
	    }

	    replace_string_in_string (line, "$rating-grid$", grid);
	    free (grid);
	}

        if (strstr (line, "$default-probability-code$"))
	{
	    char* code_to_use = def_prob_code;

	    if (strequal (code_to_use, "\"\"")) code_to_use = (char*)"";

	    replace_string_in_string (line, "$default-probability-code$", 
		threaded_val(code_to_use));
	}

	if (!print_off) 
	{
	    fprintf (f_out, "%s\n", line);
	    ++line_no;
	}

	record_indent (line);
    }
}