// SPDX-License-Identifier: GPL-3.0-or-later /* * $Id: budget.h,v 1.1 2026/05/08 03:23:57 asm Exp $ * * budget.h - USDA Food Pattern budget system for GNUtrition * * Copyright (C) 2026 Free Software Foundation, Inc. * * Author: Jason Self * Anton McClure */ #ifndef BUDGET_H #define BUDGET_H /* Daily budget for the USDA Healthy US-Style Eating Pattern. Units: cup-equivalents for vegetables, fruits, dairy; ounce-equivalents for grains, protein; grams for oils. */ struct daily_budget { int calories; /* kcal level */ double vegetables; /* cup-eq */ double fruits; /* cup-eq */ double grains; /* oz-eq */ double dairy; /* cup-eq */ double protein; /* oz-eq */ double oils; /* grams */ }; /* Physical activity level multiplier categories. */ enum activity_level { ACTIVITY_SEDENTARY, /* little or no exercise: 1.2 */ ACTIVITY_LIGHT, /* light exercise 1-3 days/wk: 1.375 */ ACTIVITY_MODERATE, /* moderate exercise 3-5 days/wk: 1.55 */ ACTIVITY_VERY_ACTIVE, /* hard exercise 6-7 days/wk: 1.725 */ ACTIVITY_EXTRA_ACTIVE /* very hard exercise / physical job: 1.9 */ }; /* User gender, for equations */ enum user_gender { GENDER_NEUTRAL = 0, GENDER_FEMALE, GENDER_MALE }; /* Estimate daily calorie needs using the Mifflin-St Jeor equation with a neutral midpoint default (-78). AGE_YEARS is the person's age. HEIGHT_CM is height in centimeters. WEIGHT_KG is weight in kilograms. ACTIVITY is the physical activity multiplier. Returns estimated kcal/day, already rounded to the nearest USDA pattern level (200-kcal steps, 1000-3200). */ int budget_estimate_calories (int age_years, double height_cm, double weight_kg, enum activity_level activity, enum user_gender gender); /* Round a raw calorie value to the nearest USDA Food Pattern level (200-kcal steps), clamped to the range 1000-3200. */ int budget_round_to_pattern (int kcal_raw); /* Return the daily budget for a given calorie level KCAL, using the USDA Healthy US-Style Eating Pattern table (Dietary Guidelines for Americans, 2020-2025, Appendix 3). Supported levels are 1000 to 3200 kcal. Values between table entries are linearly interpolated; values outside the range are clamped. */ struct daily_budget budget_for_calories (int kcal); /* Return the standard 2,000 kcal daily budget. */ struct daily_budget budget_get_default (void); /* Print a budget summary to stdout, showing CONSUMED against BUDGET. */ void budget_print (const struct daily_budget *budget, const struct daily_budget *consumed); #endif /* BUDGET_H */