/** * @brief Updates the economy. * * @param dt Deltatick in NTIME. */ int economy_update( unsigned int dt ) { int ret; int i, j; double *X; double scale, offset; /*double min, max;*/ /* Economy must be initialized. */ if (econ_initialized == 0) return 0; /* Create the vector to solve the system. */ X = malloc(sizeof(double)*systems_nstack); if (X == NULL) { WARN("Out of Memory!"); return -1; } /* Calculate the results for each price set. */ for (j=0; j<econ_nprices; j++) { /* First we must load the vector with intensities. */ for (i=0; i<systems_nstack; i++) X[i] = econ_calcSysI( dt, &systems_stack[i], j ); /* Solve the system. */ ret = cs_lsolve( econ_G, X ); if (ret != 1) WARN("Failed to solve the Economy System."); /* * Get the minimum and maximum to scale. */ /* min = +HUGE_VALF; max = -HUGE_VALF; for (i=0; i<systems_nstack; i++) { if (X[i] < min) min = X[i]; if (X[i] > max) max = X[i]; } scale = 1. / (max - min); offset = 0.5 - min * scale; */ /* * I'm not sure I like the filtering of the results, but it would take * much more work to get a sane system working without the need of post * filtering. */ scale = 1.; offset = 1.; for (i=0; i<systems_nstack; i++) { systems_stack[i].prices[j] = X[i] * scale + offset; } } /* Clean up. */ free(X); return 0; }
/** * @brief Updates the economy. * * @param dt Deltatick in NTIME. */ int economy_update( unsigned int dt ) { int ret; int i, j; double *X; double scale, offset; /*double min, max;*/ /* Economy must be initialized. */ if (econ_initialized == 0) return 0; /* Create the vector to solve the system. */ X = malloc(sizeof(double)*systems_nstack); if (X == NULL) { WARN("Out of Memory!"); return -1; } /* Calculate the results for each price set. */ for (j=0; j<econ_nprices; j++) { /* First we must load the vector with intensities. */ for (i=0; i<systems_nstack; i++) X[i] = econ_calcSysI( dt, &systems_stack[i], j ); /* Solve the system. */ /** @TODO This should be improved to try to use better factorizations (LU/Cholesky) * if possible or just outright try to use some other library that does fancy stuff * like UMFPACK. Would be also interesting to see if it could be optimized so we * store the factorization or update that instead of handling it individually. Another * point of interest would be to split loops out to make the solving faster, however, * this may be trickier to do (although it would surely let us use cholesky always if we * enforce that condition). */ ret = cs_qrsol( 3, econ_G, X ); if (ret != 1) WARN("Failed to solve the Economy System."); /* * Get the minimum and maximum to scale. */ /* min = +HUGE_VALF; max = -HUGE_VALF; for (i=0; i<systems_nstack; i++) { if (X[i] < min) min = X[i]; if (X[i] > max) max = X[i]; } scale = 1. / (max - min); offset = 0.5 - min * scale; */ /* * I'm not sure I like the filtering of the results, but it would take * much more work to get a sane system working without the need of post * filtering. */ scale = 1.; offset = 1.; for (i=0; i<systems_nstack; i++) systems_stack[i].prices[j] = X[i] * scale + offset; } /* Clean up. */ free(X); return 0; }