nutritional_calculator 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +2 -0
  6. data/.travis.yml +5 -0
  7. data/Gemfile +6 -0
  8. data/Guardfile +82 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +44 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/docs/NutritionalCalculator.html +423 -0
  15. data/docs/NutritionalCalculator/Food.html +912 -0
  16. data/docs/NutritionalCalculator/FoodGroup.html +498 -0
  17. data/docs/NutritionalCalculator/LinkedList.html +1312 -0
  18. data/docs/NutritionalCalculator/LinkedList/Node.html +409 -0
  19. data/docs/_index.html +151 -0
  20. data/docs/class_list.html +51 -0
  21. data/docs/css/common.css +1 -0
  22. data/docs/css/full_list.css +58 -0
  23. data/docs/css/style.css +492 -0
  24. data/docs/file.README.html +138 -0
  25. data/docs/file_list.html +56 -0
  26. data/docs/frames.html +17 -0
  27. data/docs/index.html +138 -0
  28. data/docs/js/app.js +248 -0
  29. data/docs/js/full_list.js +216 -0
  30. data/docs/js/jquery.js +4 -0
  31. data/docs/method_list.html +275 -0
  32. data/docs/top-level-namespace.html +110 -0
  33. data/lib/files/food_database.config +22 -0
  34. data/lib/files/glycemic_index.config +8 -0
  35. data/lib/files/nutritional_file.txt +5 -0
  36. data/lib/files/nutritional_group.config +22 -0
  37. data/lib/nutritional_calculator.rb +55 -0
  38. data/lib/nutritional_calculator/food.rb +99 -0
  39. data/lib/nutritional_calculator/foodgroup.rb +32 -0
  40. data/lib/nutritional_calculator/linkedlist.rb +194 -0
  41. data/lib/nutritional_calculator/plate.rb +294 -0
  42. data/lib/nutritional_calculator/sort_methods.rb +34 -0
  43. data/lib/nutritional_calculator/version.rb +4 -0
  44. data/nutritional_calculator.gemspec +40 -0
  45. metadata +186 -0
@@ -0,0 +1,110 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.9.9
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ pathId = "";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+
41
+
42
+ <span class="title">Top Level Namespace</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Top Level Namespace
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ </div>
80
+
81
+ <h2>Defined Under Namespace</h2>
82
+ <p class="children">
83
+
84
+
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="NutritionalCalculator.html" title="NutritionalCalculator (module)">NutritionalCalculator</a></span>
86
+
87
+
88
+
89
+
90
+ </p>
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+ </div>
101
+
102
+ <div id="footer">
103
+ Generated on Tue Nov 14 20:38:37 2017 by
104
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
105
+ 0.9.9 (ruby-2.3.1).
106
+ </div>
107
+
108
+ </div>
109
+ </body>
110
+ </html>
@@ -0,0 +1,22 @@
1
+ Huevo frito 14.1 0.0 19.5
2
+ Leche vaca 3.3 4.8 3.2
3
+ Yogurt 3.8 4.9 3.8
4
+ Cerdo 21.5 0.0 6.3
5
+ Ternera 21.1 0.0 3.1
6
+ Pollo 20.6 0.0 5.6
7
+ Bacalao 17.7 0.0 0.4
8
+ Atún 21.5 0.0 15.5
9
+ Salmón 19.9 0.0 13.6
10
+ Aceite de oliva 0.0 0.2 99.6
11
+ Mantequilla 0.7 0.0 83.2
12
+ Chocolate 5.3 47.0 30.0
13
+ Azúcar 0.0 99.8 0.0
14
+ Arroz 6.8 77.7 0.6
15
+ Lentejas 23.5 52.0 1.4
16
+ Papas 2.0 15.4 0.1
17
+ Tomate 1.0 3.5 0.2
18
+ Cebolla 1.3 5.8 0.3
19
+ Calabaza 1.1 4.8 0.1
20
+ Manzana 0.3 12.4 0.4
21
+ Plátano 1.2 21.4 0.2
22
+ Pera 0.5 12.7 0.3
@@ -0,0 +1,8 @@
1
+ 1 comp. manzana 0.0 0.0 0.0 6.7 6.5 6.8 6.9 7.0 7.1 6.9 6.9 6.9 6.7 6.9 7.3 7.0 7.0 7.2 7.1 6.8 7.2 7.3 7.0 6.8 6.7 6.8 6.7 6.9
2
+ 1 yogurt 0.0 4.9 3.8 6.1 6.6 6.3 6.3 6.1 6.9 6.8 6.5 6.4 6.9 6.8 6.5 6.3 6.2 6.7 6.2 5.9 5.8 5.8 5.8 5.8 5.8 5.9 6.2 6.4
3
+ 1 chocolate 5.3 47.0 30.0 6.5 6.5 6.7 6.5 6.5 6.8 6.7 6.2 6.5 7.2 6.9 7.0 6.3 6.2 6.1 5.9 5.8 6.1 6.7 6.7 6.6 6.7 6.9 7.2 7.1
4
+ 1 glucosa 0.0 10.0 0.0 4.9 5.3 5.9 6.7 7.2 7.6 8.0 8.2 8.2 8.4 8.3 8.3 8.0 7.5 7.1 6.8 6.8 6.9 6.8 6.3 6.2 6.3 6.2 6.3 6.1
5
+ 2 comp. manzana 0.0 0.0 0.0 4.6 4.8 5.3 5.6 6.1 6.5 6.6 7.0 7.0 6.8 6.4 6.3 6.1 6.1 6.2 6.0 6.1 6.1 6.2 6.3 6.4 6.1 6.1 5.7 5.9
6
+ 2 yogurt 0.0 4.9 3.8 4.9 4.9 5.2 5.8 6.5 7.0 7.2 7.3 7.3 6.6 6.2 6.1 6.0 6.1 5.9 5.9 5.9 5.9 5.8 5.8 5.5 5.5 5.6 5.9 5.9
7
+ 2 chocolate 0.0 4.9 3.8 4.6 4.6 4.7 4.7 4.8 4.7 4.8 4.8 4.6 4.4 4.7 4.7 4.8 4.7 5.2 5.9 5.9 5.7 5.4 5.3 5.1 4.8 4.8 4.9 5.9
8
+ 2 glucosa 0.0 10.0 0.0 6.3 5.4 5.6 5.7 6.5 7.4 7.9 7.4 7.7 7.9 7.9 7.8 7.8 7.8 8.0 8.5 9.4 10.8 10.5 9.1 8.9 8.3 7.7 7.6 7.5
@@ -0,0 +1,5 @@
1
+ Huevo frito 14.1 0.0 19.5
2
+ Leche vaca 3.3 4.8 3.2
3
+ Yogurt 0.0 4.9 3.8
4
+ Cerdo 21.5 0.0 6.3
5
+ Ternera 21.1 0.0 3.1
@@ -0,0 +1,22 @@
1
+ Huevo frito 14.1 0.0 19.5 Huevos, lácteos y helados
2
+ Leche vaca 3.3 4.8 3.2 Huevos, lácteos y helados
3
+ Yogurt 3.8 4.9 3.8 Huevos, lácteos y helados
4
+ Cerdo 21.5 0.0 6.3 Carnes y derivados
5
+ Ternera 21.1 0.0 3.1 Carnes y derivados
6
+ Pollo 20.6 0.0 5.6 Carnes y derivados
7
+ Bacalao 17.7 0.0 0.4 Pescados y mariscos
8
+ Atún 21.5 0.0 15.5 Pescados y mariscos
9
+ Salmón 19.9 0.0 13.6 Pescados y mariscos
10
+ Aceite de oliva 0.0 0.2 99.6 Alimentos grasos
11
+ Mantequilla 0.7 0.0 83.2 Alimentos grasos
12
+ Chocolate 5.3 47.0 30.0 Alimentos grasos
13
+ Azúcar 0.0 99.8 0.0 Alimentos ricos en carbohidratos
14
+ Arroz 6.8 77.7 0.6 Alimentos ricos en carbohidratos
15
+ Lentejas 23.5 52.0 1.4 Alimentos ricos en carbohidratos
16
+ Papas 2.0 15.4 0.1 Alimentos ricos en carbohidratos
17
+ Tomate 1.0 3.5 0.2 Verduras y Hortalizas
18
+ Cebolla 1.3 5.8 0.3 Verduras y Hortalizas
19
+ Calabaza 1.1 4.8 0.1 Verduras y Hortalizas
20
+ Manzana 0.3 12.4 0.4 Frutas
21
+ Plátanos 1.2 21.4 0.2 Frutas
22
+ Pera 0.5 12.7 0.3 Frutas
@@ -0,0 +1,55 @@
1
+
2
+ require 'nutritional_calculator/food'
3
+ require 'nutritional_calculator/linkedlist'
4
+ require 'nutritional_calculator/foodgroup'
5
+ require 'nutritional_calculator/sort_methods'
6
+ require 'nutritional_calculator/plate'
7
+
8
+ # encoding: utf-8
9
+ # El módulo se crea para describir los distintos elementos
10
+ # que compondrán una calculadora nutricional de alimentos.
11
+ # Author:: Cristian Abrante (mailto: alu0100945850@ull.edu.es)
12
+ # Copyright:: Creative Commons
13
+ # License:: Distributed under the same license as Ruby.
14
+
15
+ module NutritionalCalculator
16
+
17
+ # Método que lee la configuración del fichero y devuelve un vector de los alimentos.
18
+
19
+ def self.get_food_vector(file_name)
20
+
21
+ food_vector = Array.new
22
+
23
+ File.open(file_name, "r") do |file|
24
+ file.each_line do |line|
25
+
26
+ check_food_name = true
27
+ nutritional_values = Array.new
28
+ food_name = ""
29
+ food_group = ""
30
+
31
+ line.split(" ").each_with_index do |element, i|
32
+ if element.to_f == 0.0 and element != "#{element.to_f}"
33
+ if check_food_name
34
+ food_name += element + " "
35
+ else
36
+ food_group += element + " "
37
+ end
38
+ else
39
+ check_food_name = false
40
+ nutritional_values.push(element.to_f)
41
+ end
42
+ end
43
+
44
+ if food_group.empty?
45
+ food_vector.push(NutritionalCalculator::Food.new(food_name.chop, nutritional_values[0], nutritional_values[1], nutritional_values[2]))
46
+ else
47
+ food_vector.push(NutritionalCalculator::FoodGroup.new(food_name.chop, nutritional_values[0], nutritional_values[1], nutritional_values[2], food_group.chop))
48
+ end
49
+
50
+ end
51
+ end
52
+ food_vector
53
+ end
54
+
55
+ end
@@ -0,0 +1,99 @@
1
+
2
+ module NutritionalCalculator
3
+
4
+ # Esta clase representa a un alimento de manera abstracta.
5
+ # Contiene su nombre y su información nutricional.
6
+ # Se ha incluido el módulo Comparable.
7
+
8
+ class Food
9
+
10
+ # valor nutricional de las proteinas: <b>4.0</b>
11
+ PROTEINS_VALUE = 4.0
12
+
13
+ # Valor nutricional de los glúcidos: <b>4.0</b>
14
+ CARBOHYDRATE_VALUE = 4.0
15
+
16
+ # Valor nutricional de los lípidos: <b>9.0</b>
17
+ LIPIDS_VALUE = 9.0
18
+
19
+ attr_reader :name, :proteins, :carbohydrates, :lipids, :glucose_concentration
20
+ include Comparable
21
+
22
+ # Constructor.
23
+ # @param name [String] Nombre del alimento que queremos representar.
24
+ # @param proteins [float] Gramos de proteína que contiene el alimanto.
25
+ # @param carbohydrates [float] Gramos de glúcidos que contiene el alimanto.
26
+ # @param lipids [float] Gramos de lípidos que contiene el alimanto.
27
+ # @param glucose_concentration[Array[Array[float]]] listas de concentraciones de glucosa tras la ingesta del alimento para varios individuos.
28
+ # @param glucose[Food] objeto glucosa de la clase Food, necesario para hacer los cálculos. Si el valor es nulo entonces es el objeto glucosa.
29
+
30
+ def initialize(name, proteins, carbohydrates, lipids, glucose_concentration = nil, glucose = nil)
31
+ @name = name
32
+ @proteins = proteins
33
+ @carbohydrates = carbohydrates
34
+ @lipids = lipids
35
+ @glucose_concentration = glucose_concentration
36
+ @glucose = glucose
37
+ end
38
+
39
+ # Método que transforma el objeto en un String.
40
+ # De esta forma será formateado por pantalla.
41
+ # @return [String] String con el objeto formateado.
42
+
43
+ def to_s
44
+ "#{@name} -> proteínas(#{@proteins}) glúcidos(#{@carbohydrates}) lípidos(#{@lipids})"
45
+ end
46
+
47
+ # Método que devuelve el valor nutricional del alimento.
48
+ # El valor nutricional se calcula como la suma del producto
49
+ # de los valores nutricionales de los macronutrientes por los gramos
50
+ # de dicho macronutriente presente en el alimento.
51
+ # @return [float] Valor nutricional del alimento
52
+
53
+ def get_nutritional_value
54
+ @proteins * PROTEINS_VALUE + @carbohydrates * CARBOHYDRATE_VALUE + @lipids * LIPIDS_VALUE
55
+ end
56
+
57
+ # Método que permite hacer al alimento Comparable.
58
+ # En mi caso el criterio de comparación ha sido el valor
59
+ # nutricional del alimento.
60
+ # @param other [NutritionalCalculator::Food] alimento con el cual queremos comparar el alimento.
61
+
62
+ def <=> (other)
63
+ get_nutritional_value <=> other.get_nutritional_value
64
+ end
65
+
66
+ # Método que permite calcular el área incremental bajo la curva de las mediciones de glucosa de un alimento.
67
+ # Se ha realizado mediante programación funcional.
68
+ # @param individual [int] Individuo para el cual queremos calcular el AIBC del alimento.
69
+
70
+ def aibc(individual)
71
+ (1..24).lazy.map { |i| s_value(individual, i) }.map { |j| (5.0 / 2.0) * j }.reduce('+')
72
+ end
73
+
74
+ # Método que calcula el índice glucémico del alimento para un individuo concreto.
75
+ # Se ha realizado mediante programación funcional.
76
+ # @param individual [int] Individuo para el cual queremos calcular el índice glucémico del alimento.
77
+
78
+ def individual_glycemic_index(individual)
79
+ 100.0 * (aibc(individual) / @glucose.aibc(individual))
80
+ end
81
+
82
+ # Método que calcula el índice glucémico del alimento, haciendo la media del índice glucémico para los individuos.
83
+
84
+ def glycemic_index
85
+ (0...@glucose_concentration.size).map { |i| individual_glycemic_index(i) }.instance_eval { reduce('+') / size.to_f}
86
+ end
87
+
88
+ def weight
89
+ @proteins + @carbohydrates + @lipids
90
+ end
91
+
92
+ private
93
+ def s_value(individual, i)
94
+ @glucose_concentration[individual][i] + @glucose_concentration[individual][i - 1] - 2 * @glucose_concentration[individual][0]
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -0,0 +1,32 @@
1
+
2
+ module NutritionalCalculator
3
+
4
+ # Clase concreta de un alimento
5
+ # Contiene además el grupo al que pertenece el alimento.
6
+
7
+ class FoodGroup < NutritionalCalculator::Food
8
+
9
+ attr_reader :group
10
+
11
+ # Constructor.
12
+ # @param name [String] Nombre del alimento que queremos representar.
13
+ # @param proteins [float] Gramos de proteína que contiene el alimanto.
14
+ # @param carbohydrates [float] Gramos de glúcidos que contiene el alimanto.
15
+ # @param lipids [float] Gramos de lípidos que contiene el alimanto.
16
+ # @param group [String] Nombre del grupo al que pertenece el alimento.
17
+
18
+ def initialize(name, proteins, carbohydrates, lipids, group)
19
+ @group = group
20
+ super(name, proteins, carbohydrates, lipids, [[]])
21
+ end
22
+
23
+ # Método que transforma el objeto en un String.
24
+ # De esta forma será formateado por pantalla.
25
+ # @return [String] String con el objeto formateado.
26
+
27
+ def to_s
28
+ super.to_s + " grupo(#{@group})"
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,194 @@
1
+
2
+
3
+ module NutritionalCalculator
4
+
5
+ # Clase que representa a una lista doblemente enlazada.
6
+
7
+ class LinkedList
8
+
9
+ include Enumerable;
10
+
11
+ # Estructura que representa a un nodo de la lista enlazada.
12
+ Node = Struct.new(:value, :next, :prev)
13
+
14
+ # Constructor que inicializa una lista vacía.
15
+ def initialize
16
+
17
+ # Atribute that represents the head
18
+ # of the list.
19
+ @head = nil
20
+
21
+ # Atribute that represents the tail
22
+ # of the list.
23
+ @tail = nil
24
+ end
25
+
26
+ # -- ISERTION METHODS
27
+
28
+ # Método que inseta un valor por la parte posterior de la lista.
29
+ # @param value [value] Valor que queremos insertar.
30
+
31
+ def push_back(value)
32
+ if @head == nil
33
+ @head = Node.new(value, nil, nil)
34
+ @tail = @head
35
+ else
36
+ current_node = Node.new(value, nil, @tail)
37
+ @tail.next = current_node
38
+ @tail = current_node
39
+ end
40
+ end
41
+
42
+ # Método que inseta un valor por la parte delantera de la lista.
43
+ # @param value [value] Valor que queremos insertar.
44
+
45
+ def push_front(value)
46
+ if @head == nil
47
+ @head = Node.new(value, nil, nil)
48
+ @tail = @head
49
+ else
50
+ current_node = Node.new(value, @head, nil)
51
+ @head.prev = current_node
52
+ @head = current_node
53
+ end
54
+ end
55
+
56
+ # Método que inserta un conjunto de valores por la parte posterior de la lista.
57
+ # @param values [value] conjunto de elementos que queremos insertar en la lista.
58
+
59
+ def insert(*values)
60
+ values.each do |value|
61
+ push_back(value)
62
+ end
63
+ end
64
+
65
+ # -- EXTRACTION METHODS
66
+
67
+ # Método que extrae el último elemento posterior de la lista
68
+
69
+ def pop_back
70
+ if @head == @tail
71
+ @head = @tail = nil
72
+ else
73
+ if @tail
74
+ @tail = @tail.prev
75
+ @tail.next = nil;
76
+ end
77
+ end
78
+ end
79
+
80
+ # Método que extrae el primer elemento de la lista.
81
+
82
+ def pop_front
83
+ if @head == @tail
84
+ @head = @tail = nil
85
+ else
86
+ if @head
87
+ @head = @head.next
88
+ @head.prev = nil;
89
+ end
90
+ end
91
+ end
92
+
93
+ # Método que busca la primera ocurrencia de un elemento en la lista
94
+ # y lo elimina.
95
+ # @param value [value] [value] Valor que pretendemos eliminar.
96
+
97
+ def erase(value)
98
+
99
+ if @head and @head.value == value
100
+ pop_front
101
+ elsif @tail and @tail.value == value
102
+ pop_back
103
+ else
104
+
105
+ current_node = @head
106
+ while current_node
107
+
108
+ if current_node.value == value
109
+ current_node.prev.next = current_node.next
110
+ current_node.next.prev = current_node.prev
111
+ end
112
+
113
+ current_node = current_node.next
114
+ end
115
+
116
+ end
117
+ end
118
+
119
+ # -- ACCESS METHODS
120
+
121
+ # Método que accede al valor del primer elemento de la lista.
122
+ # @return [value, nil] Primer elemento de la lista.
123
+
124
+ def front
125
+ if @head
126
+ @head.value
127
+ else
128
+ nil
129
+ end
130
+ end
131
+
132
+ # Método que accede al último elemento de la lista.
133
+ # @return [value, nil] Último elemento de la lista.
134
+
135
+ def back
136
+ if @tail
137
+ @tail.value
138
+ else
139
+ nil
140
+ end
141
+ end
142
+
143
+ # Método que accede a un elemento dada su posición en la lista.
144
+ # @param pos [number] Posición del elemento en la lista.
145
+ # @return [value,nil] Elemento que se encuentra en la posición pos.
146
+
147
+ def [] (pos)
148
+
149
+ current_node = @head
150
+ i = 0
151
+ while current_node and i != pos
152
+ current_node = current_node.next
153
+ i += 1
154
+ end
155
+ if current_node
156
+ current_node.value
157
+ else
158
+ nil
159
+ end
160
+ end
161
+
162
+ # Método que pasa a cada elemento de la lista un bloque para que se ejecute.
163
+
164
+ def each
165
+ current_node = @head
166
+ while current_node
167
+ yield current_node.value
168
+ current_node = current_node.next
169
+ end
170
+ end
171
+
172
+ # Método que transforma el objeto en un String.
173
+ # De esta forma será formateado por pantalla.
174
+ # @return [String] String con el objeto formateado.
175
+
176
+ def to_s
177
+ list_as_string = ""
178
+
179
+ current_node = @head
180
+ while current_node
181
+ list_as_string += "#{current_node.value}"
182
+
183
+ if current_node.next
184
+ list_as_string += " <-- "
185
+ end
186
+
187
+ current_node = current_node.next
188
+ end
189
+
190
+ list_as_string
191
+ end
192
+
193
+ end
194
+ end