bool LaneArea::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper) { switch (variable) { case ID_LIST: return wrapper->wrapStringList(objID, variable, getIDList()); case ID_COUNT: return wrapper->wrapInt(objID, variable, getIDCount()); case LAST_STEP_VEHICLE_NUMBER: return wrapper->wrapInt(objID, variable, getLastStepVehicleNumber(objID)); case LAST_STEP_MEAN_SPEED: return wrapper->wrapDouble(objID, variable, getLastStepMeanSpeed(objID)); case LAST_STEP_VEHICLE_ID_LIST: return wrapper->wrapStringList(objID, variable, getLastStepVehicleIDs(objID)); case LAST_STEP_VEHICLE_HALTING_NUMBER: return wrapper->wrapInt(objID, variable, getLastStepHaltingNumber(objID)); case JAM_LENGTH_VEHICLE: return wrapper->wrapInt(objID, variable, getJamLengthVehicle(objID)); case JAM_LENGTH_METERS: return wrapper->wrapDouble(objID, variable, getJamLengthMeters(objID)); case LAST_STEP_OCCUPANCY: return wrapper->wrapDouble(objID, variable, getLastStepOccupancy(objID)); case VAR_POSITION: return wrapper->wrapDouble(objID, variable, getPosition(objID)); case VAR_LANE_ID: return wrapper->wrapString(objID, variable, getLaneID(objID)); case VAR_LENGTH: return wrapper->wrapDouble(objID, variable, getLength(objID)); default: return false; } }
bool TrafficLight::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper) { switch (variable) { case TRACI_ID_LIST: return wrapper->wrapStringList(objID, variable, getIDList()); case ID_COUNT: return wrapper->wrapInt(objID, variable, getIDCount()); case TL_RED_YELLOW_GREEN_STATE: return wrapper->wrapString(objID, variable, getRedYellowGreenState(objID)); case TL_CONTROLLED_LANES: return wrapper->wrapStringList(objID, variable, getControlledLanes(objID)); case TL_CURRENT_PHASE: return wrapper->wrapInt(objID, variable, getPhase(objID)); case VAR_NAME: return wrapper->wrapString(objID, variable, getPhaseName(objID)); case TL_CURRENT_PROGRAM: return wrapper->wrapString(objID, variable, getProgram(objID)); case TL_PHASE_DURATION: return wrapper->wrapDouble(objID, variable, getPhaseDuration(objID)); case TL_NEXT_SWITCH: return wrapper->wrapDouble(objID, variable, getNextSwitch(objID)); case TL_CONTROLLED_JUNCTIONS: return wrapper->wrapStringList(objID, variable, getControlledJunctions(objID)); default: return false; } }
bool VehicleType::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper) { switch (variable) { case TRACI_ID_LIST: return wrapper->wrapStringList(objID, variable, getIDList()); case ID_COUNT: return wrapper->wrapInt(objID, variable, getIDCount()); case VAR_LENGTH: return wrapper->wrapDouble(objID, variable, getLength(objID)); case VAR_HEIGHT: return wrapper->wrapDouble(objID, variable, getHeight(objID)); case VAR_MINGAP: return wrapper->wrapDouble(objID, variable, getMinGap(objID)); case VAR_MAXSPEED: return wrapper->wrapDouble(objID, variable, getMaxSpeed(objID)); case VAR_ACCEL: return wrapper->wrapDouble(objID, variable, getAccel(objID)); case VAR_DECEL: return wrapper->wrapDouble(objID, variable, getDecel(objID)); case VAR_EMERGENCY_DECEL: return wrapper->wrapDouble(objID, variable, getEmergencyDecel(objID)); case VAR_APPARENT_DECEL: return wrapper->wrapDouble(objID, variable, getApparentDecel(objID)); case VAR_ACTIONSTEPLENGTH: return wrapper->wrapDouble(objID, variable, getActionStepLength(objID)); case VAR_IMPERFECTION: return wrapper->wrapDouble(objID, variable, getImperfection(objID)); case VAR_TAU: return wrapper->wrapDouble(objID, variable, getTau(objID)); case VAR_SPEED_FACTOR: return wrapper->wrapDouble(objID, variable, getSpeedFactor(objID)); case VAR_SPEED_DEVIATION: return wrapper->wrapDouble(objID, variable, getSpeedDeviation(objID)); case VAR_VEHICLECLASS: return wrapper->wrapString(objID, variable, getVehicleClass(objID)); case VAR_EMISSIONCLASS: return wrapper->wrapString(objID, variable, getEmissionClass(objID)); case VAR_SHAPECLASS: return wrapper->wrapString(objID, variable, getShapeClass(objID)); case VAR_WIDTH: return wrapper->wrapDouble(objID, variable, getWidth(objID)); case VAR_COLOR: return wrapper->wrapColor(objID, variable, getColor(objID)); case VAR_MINGAP_LAT: return wrapper->wrapDouble(objID, variable, getMinGapLat(objID)); case VAR_MAXSPEED_LAT: return wrapper->wrapDouble(objID, variable, getMaxSpeedLat(objID)); case VAR_LATALIGNMENT: return wrapper->wrapString(objID, variable, getLateralAlignment(objID)); case VAR_PERSON_CAPACITY: return wrapper->wrapInt(objID, variable, getPersonCapacity(objID)); default: return false; } }
int mk_s_purchase(void *pDest, ds_key_t kIndex) { int i; mk_master(pDest, kIndex); genrand_integer(&nItemIndex, DIST_UNIFORM, 1, (int)getIDCount(ITEM), 0, S_PLINE_ITEM_ID); for (i=1; i <= 12; i++) { mk_detail(i, 1); } return(0); }
/* * Routine: * Purpose: * Algorithm: * Data Structures: * * Params: * Returns: * Called By: * Calls: * Assumptions: * Side Effects: * TODO: None */ int mk_s_warehouse (void* row, ds_key_t index) { static int bInit = 0; static int *pPermutation; ds_key_t kIndex; if (!bInit) { pPermutation = makePermutation(NULL, (int)getIDCount(WAREHOUSE), S_WRHS_ID); bInit = 1; } kIndex = getPermutationEntry(pPermutation, (int)index); mk_w_warehouse(NULL, kIndex); return(0); }
/* * mk_store_sales */ static void mk_master (void *row, ds_key_t index) { struct W_STORE_SALES_TBL *r; static decimal_t dMin, dMax; static int bInit = 0, nMaxItemCount; static ds_key_t kNewDateIndex = 0; if (row == NULL) r = &g_w_store_sales; else r = row; if (!bInit) { strtodec (&dMin, "1.00"); strtodec (&dMax, "100000.00"); nMaxItemCount = 20; jDate = skipDays(STORE_SALES, &kNewDateIndex); pItemPermutation = makePermutation(NULL, nItemCount = (int)getIDCount(ITEM), SS_PERMUTATION); bInit = 1; } while (index > kNewDateIndex) /* need to move to a new date */ { jDate += 1; kNewDateIndex += dateScaling(STORE_SALES, jDate); } r->ss_sold_store_sk = mk_join (SS_SOLD_STORE_SK, STORE, 1); r->ss_sold_time_sk = mk_join (SS_SOLD_TIME_SK, TIME, 1); r->ss_sold_date_sk = mk_join (SS_SOLD_DATE_SK, DATE, 1); r->ss_sold_customer_sk = mk_join (SS_SOLD_CUSTOMER_SK, CUSTOMER, 1); r->ss_sold_cdemo_sk = mk_join (SS_SOLD_CDEMO_SK, CUSTOMER_DEMOGRAPHICS, 1); r->ss_sold_hdemo_sk = mk_join (SS_SOLD_HDEMO_SK, HOUSEHOLD_DEMOGRAPHICS, 1); r->ss_sold_addr_sk = mk_join (SS_SOLD_ADDR_SK, CUSTOMER_ADDRESS, 1); r->ss_ticket_number = index; genrand_integer(&nItemIndex, DIST_UNIFORM, 1, nItemCount, 0, SS_SOLD_ITEM_SK); return; }
int vld_s_item(int nTable, ds_key_t kRow, int *Permutation) { static int bInit = 0; static int *pPermutation; table_func_t *pTF = getTdefFunctionsByNumber(ITEM); if (!bInit) { pPermutation = makePermutation(NULL, (int)getIDCount(ITEM), S_ITEM_PERMUTE); bInit = 1; } memset(&g_OldValues, 0, sizeof(struct W_ITEM_TBL)); pTF->validate(S_ITEM, kRow, pPermutation); return(0); }
/* * Routine: * Purpose: * Algorithm: * Data Structures: * * Params: * Returns: * Called By: * Calls: * Assumptions: * Side Effects: * TODO: None */ int mk_s_promotion (void* row, ds_key_t index) { static int bInit = 0; static int *pPermutation; ds_key_t kIndex; if (!bInit) { pPermutation = makePermutation(NULL, (int)getIDCount(PROMOTION), S_PROMOTION_ID); bInit = 1; } kIndex = getPermutationEntry(pPermutation, (int)index); mk_w_promotion(NULL, kIndex); row_stop(PROMOTION); return(0); }
/* * Routine: * Purpose: * Algorithm: * Data Structures: * * Params: * Returns: * Called By: * Calls: * Assumptions: * Side Effects: * TODO: None */ int mk_s_item (void* row, ds_key_t index) { static int bInit = 0; static int *pPermutation; ds_key_t kIndex; if (!bInit) { pPermutation = makePermutation(NULL, (int)getIDCount(ITEM), S_ITEM_PERMUTE); bInit = 1; } kIndex = getPermutationEntry(pPermutation, (int)index); mk_w_item(NULL, getSKFromID(kIndex, S_ITEM_ID)); row_stop(ITEM); return(0); }
int vld_s_purchase(int nTable, ds_key_t kRow, int* bPermutation) { int nLineitem, i; row_skip(S_PURCHASE, kRow - 1); row_skip(S_PURCHASE_LINEITEM, (kRow - 1)); row_skip(S_STORE_RETURNS, (kRow - 1)); mk_master(NULL, kRow); genrand_integer(&nLineitem, DIST_UNIFORM, 1, 12, 0, S_PLINE_NUMBER); genrand_integer(&nItemIndex, DIST_UNIFORM, 1, (int)getIDCount(ITEM), 0, S_PLINE_ITEM_ID); for (i=1; i < nLineitem; i++) mk_detail(i, 0); print_start(S_PURCHASE_LINEITEM); print_key(0, (kRow - 1) * 12 + nLineitem, 1); mk_detail(i, 1); return(0); }
int vld_s_promotion(int nTable, ds_key_t kRow, int *Permutation) { static int bInit = 0; static int *pPermutation; ds_key_t kIndex; table_func_t *pTF = getTdefFunctionsByNumber(PROMOTION); if (!bInit) { pPermutation = makePermutation(NULL, (int)getIDCount(PROMOTION), S_PROMOTION_ID); bInit = 1; } kIndex = getPermutationEntry(pPermutation, (int)kRow); row_skip(PROMOTION, kRow - 1); pTF->builder(NULL, kIndex); row_stop(PROMOTION); return(0); }
bool Person::handleVariable(const std::string& objID, const int variable, VariableWrapper* wrapper) { switch (variable) { case TRACI_ID_LIST: return wrapper->wrapStringList(objID, variable, getIDList()); case ID_COUNT: return wrapper->wrapInt(objID, variable, getIDCount()); case VAR_POSITION: return wrapper->wrapPosition(objID, variable, getPosition(objID)); case VAR_POSITION3D: return wrapper->wrapPosition(objID, variable, getPosition(objID, true)); case VAR_ANGLE: return wrapper->wrapDouble(objID, variable, getAngle(objID)); case VAR_SLOPE: return wrapper->wrapDouble(objID, variable, getSlope(objID)); case VAR_SPEED: return wrapper->wrapDouble(objID, variable, getSpeed(objID)); case VAR_ROAD_ID: return wrapper->wrapString(objID, variable, getRoadID(objID)); case VAR_LANEPOSITION: return wrapper->wrapDouble(objID, variable, getLanePosition(objID)); case VAR_COLOR: return wrapper->wrapColor(objID, variable, getColor(objID)); case VAR_WAITING_TIME: return wrapper->wrapDouble(objID, variable, getWaitingTime(objID)); case VAR_TYPE: return wrapper->wrapString(objID, variable, getTypeID(objID)); case VAR_NEXT_EDGE: return wrapper->wrapString(objID, variable, getNextEdge(objID)); case VAR_STAGES_REMAINING: return wrapper->wrapInt(objID, variable, getRemainingStages(objID)); case VAR_VEHICLE: return wrapper->wrapString(objID, variable, getVehicle(objID)); default: return false; } }
/* * Routine: * Purpose: * Algorithm: * Data Structures: * * Params: * Returns: * Called By: * Calls: * Assumptions: * Side Effects: * TODO: None */ int mk_s_customer (void *pDest, ds_key_t kIndex) { static int bInit = 0; struct S_CUSTOMER_TBL *r; static date_t dtMin, dtMax, dtBirthMin, dtBirthMax, dtToday, dt1YearAgo, dt10YearsAgo; static decimal_t dMinIncome, dMaxIncome; int nTemp; ds_key_t kTempDemographic; char *szTemp; static int *pPermutation; if (pDest == NULL) r = &g_s_customer; else r = pDest; if (!bInit) { memset (&g_s_customer, 0, sizeof (struct S_CUSTOMER_TBL)); setUpdateDateRange (S_CUSTOMER, &dtMin, &dtMax); strtodec (&dMinIncome, "0.00"); strtodec (&dMaxIncome, "200000.00"); r->pBirthCountry = strdup ("<UNKNOWN>"); strtodt (&dtBirthMin, "1924-01-01"); strtodt (&dtBirthMax, "1992-12-31"); strtodt (&dtToday, TODAYS_DATE); jtodt (&dt1YearAgo, dtToday.julian - 365); jtodt (&dt10YearsAgo, dtToday.julian - 365); pPermutation = makePermutation (NULL, (int) getIDCount (CUSTOMER), S_CUST_ID); bInit = 1; } r->kID = getPermutationEntry (pPermutation, (int) kIndex); kTempDemographic = mk_join (S_CUST_GENDER, CUSTOMER_DEMOGRAPHICS, 1) - 1; bitmap_to_dist (&szTemp, "gender", &kTempDemographic, 1, CUSTOMER_DEMOGRAPHICS); switch (*szTemp) { case 'M': /* male */ r->sGender[0] = 'M'; pick_distribution (&r->pFirstName, "first_names", 1, 1, S_CUST_FIRST_NAME); pick_distribution (&r->pSalutation, "salutations", 1, 2, S_CUST_SALUTATION); break; case 'F': /* female */ r->sGender[0] = 'F'; pick_distribution (&r->pFirstName, "first_names", 1, 2, S_CUST_FIRST_NAME); pick_distribution (&r->pSalutation, "salutations", 1, 3, S_CUST_SALUTATION); break; default: /* gender neutral */ r->sGender[0] = 'U'; pick_distribution (&r->pFirstName, "first_names", 1, 3, S_CUST_FIRST_NAME); pick_distribution (&r->pSalutation, "salutations", 1, 1, S_CUST_SALUTATION); break; } bitmap_to_dist (&r->pMaritalStatus, "marital_status", &kTempDemographic, 1, CUSTOMER_DEMOGRAPHICS); bitmap_to_dist (&r->pEducation, "education", &kTempDemographic, 1, CUSTOMER_DEMOGRAPHICS); bitmap_to_dist (&r->nPurchaseEstimate, "purchase_band", &kTempDemographic, 1, CUSTOMER_DEMOGRAPHICS); bitmap_to_dist (&r->pCreditRating, "credit_rating", &kTempDemographic, 1, CUSTOMER_DEMOGRAPHICS); r->nDependents = (int) (kTempDemographic % (ds_key_t) CD_MAX_CHILDREN); kTempDemographic /= (ds_key_t) CD_MAX_CHILDREN; r->nEmployed = (int) (kTempDemographic % (ds_key_t) CD_MAX_EMPLOYED); kTempDemographic /= (ds_key_t) CD_MAX_EMPLOYED; r->nCollege = (int) (kTempDemographic % (ds_key_t) CD_MAX_COLLEGE); pick_distribution (&r->pLastName, "last_names", 1, 1, S_CUST_LAST_NAME); r->bPreferredFlag = (genrand_integer (NULL, DIST_UNIFORM, 1, 100, 0, S_CUST_PREFERRED_FLAG) > 50) ? 1 : 0; genrand_date (&r->dtBirthDate, DIST_UNIFORM, &dtBirthMin, &dtBirthMax, NULL, S_CUST_BIRTH_DATE); genrand_date (&r->dtFirstPurchaseDate, DIST_UNIFORM, &dt10YearsAgo, &dt1YearAgo, NULL, S_CUST_FIRST_PURCHASE_DATE); genrand_integer (&nTemp, DIST_UNIFORM, 1, 30, 0, S_CUST_FIRST_SHIPTO_DATE); jtodt (&r->dtFirstShipToDate, r->dtFirstPurchaseDate.julian + nTemp); gen_charset (r->szLogin, ALPHANUM, 5, RS_S_CUST_LOGIN, S_CUST_LOGIN); genrand_email (r->szEmail, r->pFirstName, r->pLastName, S_CUST_EMAIL); genrand_date (&r->dtLastLogin, DIST_UNIFORM, &dt1YearAgo, &dtToday, NULL, S_CUST_LAST_LOGIN); genrand_date (&r->dtReview, DIST_UNIFORM, &dt1YearAgo, &dtToday, NULL, S_CUST_LAST_REVIEW); genrand_ipaddr (r->szPrimaryMachine, S_CUST_PRIMARY_MACHINE); genrand_ipaddr (r->szSecondaryMachine, S_CUST_SECONDARY_MACHINE); pick_distribution (&r->pLocationType, "location_type", 1, 1, S_CUST_LOCATION_TYPE); pick_distribution (&r->nVehicle, "vehicle_count", 1, 1, S_CUST_VEHICLE_CNT); genrand_decimal (&r->dIncome, DIST_UNIFORM, &dMinIncome, &dMaxIncome, NULL, S_CUST_INCOME); pick_distribution (&r->pBuyPotential, "buy_potential", 1, 1, S_CUST_PURCHASE_ESTIMATE); mk_w_customer_address (NULL, kIndex); return (0); }
/* * the validation process requires generating a single lineitem * so the main mk_xxx routine has been split into a master record portion * and a detail/lineitem portion. */ static void mk_master (void *row, ds_key_t index) { static decimal_t dMin, dMax; int nGiftPct; struct W_WEB_SALES_TBL *r; static int bInit = 0, nItemCount; if (row == NULL) r = &g_w_web_sales; else r = row; if (!bInit) { strtodec (&dMin, "1.00"); strtodec (&dMax, "100000.00"); jDate = skipDays(WEB_SALES, &kNewDateIndex); nItemCount = (int)getIDCount(ITEM); bInit = 1; } /*** * some attributes reamin the same for each lineitem in an order; others are different * for each lineitem. Since the number of lineitems per order is static, we can use a * modulo to determine when to change the semi-static values */ while (index > kNewDateIndex) /* need to move to a new date */ { jDate += 1; kNewDateIndex += dateScaling(WEB_SALES, jDate); } r->ws_sold_date_sk = mk_join (WS_SOLD_DATE_SK, DATE, 1); r->ws_sold_time_sk = mk_join(WS_SOLD_TIME_SK, TIME, 1); r->ws_bill_customer_sk = mk_join (WS_BILL_CUSTOMER_SK, CUSTOMER, 1); r->ws_bill_cdemo_sk = mk_join (WS_BILL_CDEMO_SK, CUSTOMER_DEMOGRAPHICS, 1); r->ws_bill_hdemo_sk = mk_join (WS_BILL_HDEMO_SK, HOUSEHOLD_DEMOGRAPHICS, 1); r->ws_bill_addr_sk = mk_join (WS_BILL_ADDR_SK, CUSTOMER_ADDRESS, 1); /* most orders are for the ordering customers, some are not */ genrand_integer(&nGiftPct, DIST_UNIFORM, 0, 99, 0, WS_SHIP_CUSTOMER_SK); if (nGiftPct > WS_GIFT_PCT) { r->ws_ship_customer_sk = mk_join (WS_SHIP_CUSTOMER_SK, CUSTOMER, 2); r->ws_ship_cdemo_sk = mk_join (WS_SHIP_CDEMO_SK, CUSTOMER_DEMOGRAPHICS, 2); r->ws_ship_hdemo_sk = mk_join (WS_SHIP_HDEMO_SK, HOUSEHOLD_DEMOGRAPHICS, 2); r->ws_ship_addr_sk = mk_join (WS_SHIP_ADDR_SK, CUSTOMER_ADDRESS, 2); } else { r->ws_ship_customer_sk = r->ws_bill_customer_sk; r->ws_ship_cdemo_sk = r->ws_bill_cdemo_sk; r->ws_ship_hdemo_sk = r->ws_bill_hdemo_sk; r->ws_ship_addr_sk = r->ws_bill_addr_sk; } r->ws_order_number = index; genrand_integer(&nItemIndex, DIST_UNIFORM, 1, nItemCount, 0, WS_ITEM_SK); return; }
static void mk_detail (void *row, int bPrint) { static int *pItemPermutation, nItemCount, bInit = 0; struct W_WEB_SALES_TBL *r; int nShipLag, nTemp; struct W_WEB_RETURNS_TBL w_web_returns; tdef *pT = getSimpleTdefsByNumber(WEB_SALES); if (!bInit) { jDate = skipDays(WEB_SALES, &kNewDateIndex); pItemPermutation = makePermutation(NULL, nItemCount = (int)getIDCount(ITEM), WS_PERMUTATION); bInit = 1; } if (row == NULL) r = &g_w_web_sales; else r = row; nullSet(&pT->kNullBitMap, WS_NULLS); /* orders are shipped some number of days after they are ordered, * and not all lineitems ship at the same time */ genrand_integer (&nShipLag, DIST_UNIFORM, WS_MIN_SHIP_DELAY, WS_MAX_SHIP_DELAY, 0, WS_SHIP_DATE_SK); r->ws_ship_date_sk = r->ws_sold_date_sk + nShipLag; if (++nItemIndex > nItemCount) nItemIndex = 1; r->ws_item_sk = matchSCDSK(getPermutationEntry(pItemPermutation, nItemIndex), r->ws_sold_date_sk, ITEM); /* the web page needs to be valid for the sale date */ r->ws_web_page_sk = mk_join (WS_WEB_PAGE_SK, WEB_PAGE, r->ws_sold_date_sk); r->ws_web_site_sk = mk_join (WS_WEB_SITE_SK, WEB_SITE, r->ws_sold_date_sk); r->ws_ship_mode_sk = mk_join (WS_SHIP_MODE_SK, SHIP_MODE, 1); r->ws_warehouse_sk = mk_join (WS_WAREHOUSE_SK, WAREHOUSE, 1); r->ws_promo_sk = mk_join (WS_PROMO_SK, PROMOTION, 1); set_pricing(WS_PRICING, &r->ws_pricing); /** * having gone to the trouble to make the sale, now let's see if it gets returned */ if (!is_set("FILTER") || is_set("_CHILD_ONLY")) { genrand_integer(&nTemp, DIST_UNIFORM, 0, 99, 0, WR_IS_RETURNED); if (nTemp < WR_RETURN_PCT) { mk_w_web_returns(&w_web_returns, 1); if (bPrint) pr_w_web_returns(&w_web_returns); } } /** * now we print out the order and lineitem together as a single row */ if (bPrint && (!is_set("FILTER") || !is_set("_CHILD_ONLY"))) pr_w_web_sales(NULL); return; }