toji 2.8.0 → 2.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/example/calendar.ipynb +42 -51
  3. data/example/calendar.yaml +6 -6
  4. data/example/calendar_file.ipynb +36 -36
  5. data/example/example_core.rb +877 -205
  6. data/example/kake_ingredient.rb +21 -15
  7. data/example/koji_ingredient.rb +31 -21
  8. data/example/{koji_making.ipynb → koji_progress.ipynb} +14 -14
  9. data/example/{koji_making.rb → koji_progress.rb} +3 -2
  10. data/example/{koji_making.yaml → koji_progress.yaml} +8 -9
  11. data/example/{koji_making_multi.ipynb → koji_progress_multi.ipynb} +21 -22
  12. data/example/{moromi.ipynb → moromi_progress.ipynb} +22 -22
  13. data/example/{moromi.rb → moromi_progress.rb} +3 -2
  14. data/example/{moromi.yaml → moromi_progress.yaml} +0 -0
  15. data/example/moto_progress.ipynb +121 -0
  16. data/example/{moto.rb → moto_progress.rb} +3 -2
  17. data/example/{moto.yaml → moto_progress.yaml} +14 -15
  18. data/example/recipe.rb +44 -32
  19. data/lib/toji.rb +4 -1
  20. data/lib/toji/calendar.rb +18 -18
  21. data/lib/toji/calendar/date_column.rb +7 -22
  22. data/lib/toji/calendar/date_row.rb +6 -6
  23. data/lib/toji/ingredient.rb +6 -2
  24. data/lib/toji/ingredient/alcohol.rb +14 -0
  25. data/lib/toji/ingredient/base.rb +11 -0
  26. data/lib/toji/ingredient/kake.rb +3 -9
  27. data/lib/toji/ingredient/koji.rb +19 -10
  28. data/lib/toji/ingredient/lactic_acid.rb +14 -0
  29. data/lib/toji/ingredient/rice.rb +50 -4
  30. data/lib/toji/ingredient/tanekoji.rb +29 -0
  31. data/lib/toji/ingredient/water.rb +18 -0
  32. data/lib/toji/ingredient/yeast.rb +20 -0
  33. data/lib/toji/processing.rb +18 -0
  34. data/lib/toji/processing/base.rb +7 -0
  35. data/lib/toji/processing/cooled_rice.rb +22 -0
  36. data/lib/toji/processing/cooled_rice_element.rb +8 -0
  37. data/lib/toji/processing/dekoji.rb +22 -0
  38. data/lib/toji/processing/dekoji_element.rb +8 -0
  39. data/lib/toji/processing/kake_processing.rb +7 -0
  40. data/lib/toji/processing/koji_processing.rb +10 -0
  41. data/lib/toji/processing/rice_processing.rb +19 -0
  42. data/lib/toji/processing/soaked_rice.rb +49 -0
  43. data/lib/toji/processing/soaked_rice_element.rb +18 -0
  44. data/lib/toji/processing/steamed_rice.rb +22 -0
  45. data/lib/toji/processing/steamed_rice_element.rb +8 -0
  46. data/lib/toji/product.rb +11 -83
  47. data/lib/toji/product/schedule_factory.rb +74 -0
  48. data/lib/toji/progress.rb +23 -0
  49. data/lib/toji/progress/base_progress.rb +37 -0
  50. data/lib/toji/progress/base_state.rb +39 -0
  51. data/lib/toji/progress/builder.rb +53 -0
  52. data/lib/toji/progress/graph.rb +11 -0
  53. data/lib/toji/{brew → progress}/graph/ab.rb +4 -4
  54. data/lib/toji/{brew → progress}/graph/bmd.rb +2 -2
  55. data/lib/toji/{brew/graph/multi_progress.rb → progress/graph/multi_progress_note.rb} +11 -11
  56. data/lib/toji/{brew/graph/progress.rb → progress/graph/progress_note.rb} +20 -18
  57. data/lib/toji/progress/koji_progress.rb +15 -0
  58. data/lib/toji/progress/koji_state.rb +23 -0
  59. data/lib/toji/{brew/moromi.rb → progress/moromi_progress.rb} +9 -5
  60. data/lib/toji/progress/moromi_state.rb +77 -0
  61. data/lib/toji/progress/moto_progress.rb +15 -0
  62. data/lib/toji/progress/moto_state.rb +31 -0
  63. data/lib/toji/progress/progress.rb +15 -0
  64. data/lib/toji/progress/state.rb +9 -0
  65. data/lib/toji/progress/state/baume_to_nihonshudo.rb +21 -0
  66. data/lib/toji/progress/state/nihonshudo_to_baume.rb +21 -0
  67. data/lib/toji/recipe.rb +54 -39
  68. data/lib/toji/recipe/ab_expect.rb +2 -2
  69. data/lib/toji/recipe/action.rb +8 -0
  70. data/lib/toji/recipe/step.rb +97 -71
  71. data/lib/toji/schedule.rb +5 -0
  72. data/lib/toji/schedule/action_schedule.rb +9 -0
  73. data/lib/toji/schedule/base.rb +9 -0
  74. data/lib/toji/schedule/kake_schedule.rb +11 -0
  75. data/lib/toji/schedule/koji_schedule.rb +11 -0
  76. data/lib/toji/schedule/rice_schedule.rb +16 -0
  77. data/lib/toji/utils.rb +43 -0
  78. data/lib/toji/version.rb +1 -1
  79. metadata +59 -40
  80. data/lib/toji/brew.rb +0 -18
  81. data/lib/toji/brew/base.rb +0 -55
  82. data/lib/toji/brew/builder.rb +0 -98
  83. data/lib/toji/brew/graph.rb +0 -11
  84. data/lib/toji/brew/koji.rb +0 -11
  85. data/lib/toji/brew/moto.rb +0 -11
  86. data/lib/toji/brew/state.rb +0 -122
  87. data/lib/toji/brew/wrapped_state.rb +0 -109
  88. data/lib/toji/ingredient/kake/actual.rb +0 -26
  89. data/lib/toji/ingredient/kake/base.rb +0 -18
  90. data/lib/toji/ingredient/kake/expected.rb +0 -40
  91. data/lib/toji/ingredient/koji/actual.rb +0 -29
  92. data/lib/toji/ingredient/koji/actual_fermentable.rb +0 -15
  93. data/lib/toji/ingredient/koji/base.rb +0 -35
  94. data/lib/toji/ingredient/koji/expected.rb +0 -45
  95. data/lib/toji/ingredient/koji/expected_fermentable.rb +0 -15
  96. data/lib/toji/ingredient/koji_rate.rb +0 -16
  97. data/lib/toji/ingredient/rice/actual_steamable.rb +0 -27
  98. data/lib/toji/ingredient/rice/base.rb +0 -40
  99. data/lib/toji/ingredient/rice/expected_steamable.rb +0 -27
  100. data/lib/toji/ingredient/rice_rate.rb +0 -23
  101. data/lib/toji/product/event.rb +0 -13
  102. data/lib/toji/product/rice_event.rb +0 -28
  103. data/lib/toji/product/rice_event_group.rb +0 -19
@@ -0,0 +1,21 @@
1
+ module Toji
2
+ module Progress
3
+ module State
4
+ module NihonshudoToBaume
5
+ def baume
6
+ if self.nihonshudo
7
+ self.nihonshudo / -10.0
8
+ end
9
+ end
10
+
11
+ def baume=(val)
12
+ if val
13
+ self.nihonshudo = val.to_f * -10
14
+ else
15
+ self.nihonshudo = nil
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,44 +1,47 @@
1
1
  require 'toji/recipe/step'
2
+ require 'toji/recipe/action'
2
3
  require 'toji/recipe/ab_expect'
3
4
 
4
5
  module Toji
5
6
  module Recipe
6
- attr_accessor :steps
7
- attr_accessor :has_moto
8
- attr_accessor :has_moromi
9
- attr_accessor :ab_coef
10
- attr_accessor :ab_expects
11
- attr_accessor :squeeze_interval_days
12
-
13
- def scale(rice_total)
14
- rate = rice_total / steps.map(&:rice_total).sum
15
- new_steps = steps.map {|step|
16
- step * rate
7
+ attr_reader :steps
8
+ attr_reader :actions
9
+ attr_reader :has_moto
10
+ attr_reader :has_moromi
11
+ attr_reader :ab_coef
12
+ attr_reader :ab_expects
13
+
14
+ def scale_rice_total(rice_total)
15
+ ratio = rice_total / steps.map(&:rice_total).sum
16
+ scale(ratio)
17
+ end
18
+
19
+ def scale!(ratio)
20
+ steps.each {|step|
21
+ step.scale!(ratio)
17
22
  }
23
+ self
24
+ end
25
+
26
+ def scale(ratio)
27
+ Utils.check_dup(self)
28
+
29
+ dst = self.dup
30
+ dst.scale!(ratio)
31
+ end
18
32
 
19
- self.class.new.tap {|o|
20
- o.steps = new_steps
21
- o.has_moto = has_moto
22
- o.has_moromi = has_moromi
23
- o.ab_coef = ab_coef
24
- o.ab_expects = ab_expects.deep_dup
25
- o.squeeze_interval_days = squeeze_interval_days
33
+ def round!(ndigit=0, mini_ndigit=nil, half: :up)
34
+ steps.each {|step|
35
+ step.round!(ndigit, mini_ndigit, half: half)
26
36
  }
37
+ self
27
38
  end
28
39
 
29
40
  def round(ndigit=0, mini_ndigit=nil, half: :up)
30
- new_steps = steps.map {|step|
31
- step.round(ndigit, mini_ndigit, half: half)
32
- }
41
+ Utils.check_dup(self)
33
42
 
34
- self.class.new.tap {|o|
35
- o.steps = new_steps
36
- o.has_moto = has_moto
37
- o.has_moromi = has_moromi
38
- o.ab_coef = ab_coef
39
- o.ab_expects = ab_expects.deep_dup
40
- o.squeeze_interval_days = squeeze_interval_days
41
- }
43
+ dst = self.dup
44
+ dst.round!(ndigit, mini_ndigit, half: half)
42
45
  end
43
46
 
44
47
  # 総米の累計
@@ -51,7 +54,7 @@ module Toji
51
54
  end
52
55
 
53
56
  # 酒母歩合の累計
54
- def cumulative_moto_rates
57
+ def cumulative_moto_ratios
55
58
  rice_total = steps.map(&:rice_total)
56
59
  moto = rice_total.first
57
60
 
@@ -66,8 +69,8 @@ module Toji
66
69
  # 汲水歩合が大きい高温糖化酒母では6%程度である
67
70
  #
68
71
  # 出典: 酒造教本 P96
69
- def moto_rate
70
- cumulative_moto_rates.last || 0.0
72
+ def moto_ratio
73
+ cumulative_moto_ratios.last || 0.0
71
74
  end
72
75
 
73
76
  # 白米比率
@@ -78,22 +81,34 @@ module Toji
78
81
  # 湧き抑え型 1 2 4 7 長期醪、甘口、おだやかな酒質
79
82
  #
80
83
  # 出典: 酒造教本 P95
81
- def rice_rates
84
+ def rice_ratios
82
85
  steps.map {|step|
83
86
  step.rice_total / steps.first.rice_total
84
87
  }
85
88
  end
86
89
 
87
90
  def table_data
88
- headers = [""] + steps.map(&:name) + [:total]
89
- keys = [:rice_total, :kake, :koji, :alcohol, :water, :lactic_acid]
91
+ headers = [""] + steps.map.with_index{|s,i| :"Step#{i}"} + [:total]
92
+ keys = [["RiceTotal", :rice_total], ["Kake", :kakes], ["Koji", :kojis], ["Alcohol", :alcohols], ["Water", :waters], ["LacticAcid", :lactic_acids]]
90
93
 
91
- cells = [keys]
94
+ cells = [keys.map(&:first)]
92
95
  cells += steps.map {|step|
93
- [step.rice_total, step.kake, step.koji, step.alcohol, step.water, step.lactic_acid]
96
+ keys.map(&:last).map {|key|
97
+ vals = step.send(key)
98
+ if Numeric===vals
99
+ vals
100
+ else
101
+ vals.compact.map(&:weight).sum
102
+ end
103
+ }
94
104
  }
95
- cells << keys.map {|key|
96
- steps.map(&key).compact.sum
105
+ cells << keys.map(&:last).map {|key|
106
+ vals = steps.map(&key)
107
+ if Numeric===vals[0]
108
+ vals.sum
109
+ else
110
+ vals.flatten.compact.map(&:weight).sum
111
+ end
97
112
  }
98
113
 
99
114
  cells = cells.map {|cell|
@@ -1,8 +1,8 @@
1
1
  module Toji
2
2
  module Recipe
3
3
  module AbExpect
4
- attr_accessor :alcohol
5
- attr_accessor :nihonshudo
4
+ attr_reader :alcohol
5
+ attr_reader :nihonshudo
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,8 @@
1
+ module Toji
2
+ module Recipe
3
+ module Action
4
+ attr_reader :type
5
+ attr_reader :interval_days
6
+ end
7
+ end
8
+ end
@@ -1,25 +1,31 @@
1
1
  module Toji
2
2
  module Recipe
3
3
  module Step
4
- attr_accessor :koji
5
- attr_accessor :koji_soaked_rate
6
- attr_accessor :koji_steamed_rate
7
- attr_accessor :koji_dekoji_rate
8
- attr_accessor :koji_interval_days
9
-
10
- attr_accessor :kake
11
- attr_accessor :kake_soaked_rate
12
- attr_accessor :kake_steamed_rate
13
- attr_accessor :kake_interval_days
14
-
15
- attr_accessor :water
16
- attr_accessor :lactic_acid
17
- attr_accessor :alcohol
18
- attr_accessor :yeast
4
+ attr_accessor :kojis
5
+ attr_accessor :kakes
6
+ attr_accessor :waters
7
+ attr_accessor :lactic_acids
8
+ attr_accessor :alcohols
9
+ attr_accessor :yeasts
10
+
11
+ # 麹米
12
+ def koji_total
13
+ (kojis || []).map(&:weight).map(&:to_f).sum.to_f
14
+ end
15
+
16
+ # 掛米
17
+ def kake_total
18
+ (kakes || []).map(&:weight).map(&:to_f).sum.to_f
19
+ end
19
20
 
20
21
  # 総米
21
22
  def rice_total
22
- kake.to_f + koji.to_f
23
+ koji_total + kake_total
24
+ end
25
+
26
+ # 汲水
27
+ def water_total
28
+ (waters || []).map(&:weight).map(&:to_f).sum.to_f
23
29
  end
24
30
 
25
31
  # 麹歩合
@@ -27,8 +33,8 @@ module Toji
27
33
  # 留め仕込みまでの総米重量の20〜22%が標準である
28
34
  # なお、留め仕込みまでの麹歩合が20%を下回ると蒸米の溶解糖化に影響が出るので注意がいる
29
35
  # 出典: 酒造教本 P95
30
- def koji_rate
31
- val = koji.to_f / rice_total
36
+ def koji_ratio
37
+ val = koji_total / rice_total
32
38
  val.nan? ? 0.0 : val
33
39
  end
34
40
 
@@ -41,54 +47,90 @@ module Toji
41
47
  # 全体: 留までの総米に対し120〜130%、標準は125%、高級酒は130〜145%である
42
48
  #
43
49
  # 出典: 酒造教本 P96
44
- def water_rate
45
- val = water.to_f / rice_total
50
+ def water_ratio
51
+ val = water_total / rice_total
46
52
  val.nan? ? 0.0 : val
47
53
  end
48
54
 
49
- def round(ndigit=0, mini_ndigit=nil, half: :up)
55
+ def scale!(ratio)
56
+ kojis&.each {|koji|
57
+ koji.weight *= ratio
58
+ }
59
+ kakes&.each {|kake|
60
+ kake.weight *= ratio
61
+ }
62
+ waters&.each {|water|
63
+ water.weight *= ratio
64
+ }
65
+ lactic_acids&.each {|lactic_acid|
66
+ lactic_acid.weight *= ratio
67
+ }
68
+ alcohols&.each {|alcohol|
69
+ alcohol.weight *= ratio
70
+ }
71
+ yeasts&.each {|yeast|
72
+ yeast.weight *= ratio
73
+ }
74
+ self
75
+ end
76
+
77
+ def scale(ratio)
78
+ Utils.check_dup(self)
79
+
80
+ dst = self.dup
81
+ dst.scale!(ratio)
82
+ end
83
+
84
+ def round!(ndigit=0, mini_ndigit=nil, half: :up)
50
85
  if !mini_ndigit
51
86
  mini_ndigit = ndigit + 3
52
87
  end
53
88
 
54
- self.class.new.tap {|o|
55
- o.koji = koji.to_f.round(ndigit, half: half)
56
- o.koji_soaked_rate = koji_soaked_rate.to_f
57
- o.koji_steamed_rate = koji_steamed_rate.to_f
58
- o.koji_dekoji_rate = koji_dekoji_rate.to_f
59
- o.koji_interval_days = koji_interval_days.to_i
60
-
61
- o.kake = kake.to_f.round(ndigit, half: half)
62
- o.kake_soaked_rate = kake_soaked_rate.to_f
63
- o.kake_steamed_rate = kake_steamed_rate.to_f
64
- o.kake_interval_days = kake_interval_days.to_i
65
-
66
- o.water = water.to_f.round(ndigit, half: half)
67
- o.lactic_acid = lactic_acid.to_f.round(mini_ndigit, half: half)
68
- o.alcohol = alcohol.to_f.round(ndigit, half: half)
69
- o.yeast = yeast.to_f.round(mini_ndigit, half: half)
89
+ kojis&.each {|koji|
90
+ koji.weight = koji.weight.to_f.round(ndigit, half: half)
91
+ }
92
+ kakes&.each {|kake|
93
+ kake.weight = kake.weight.to_f.round(ndigit, half: half)
94
+ }
95
+ waters&.each {|water|
96
+ water.weight = water.weight.to_f.round(ndigit, half: half)
70
97
  }
98
+ lactic_acids&.each {|lactic_acid|
99
+ lactic_acid.weight = lactic_acid.weight.to_f.round(mini_ndigit, half: half)
100
+ }
101
+ alcohols&.each {|alcohol|
102
+ alcohol.weight = alcohol.weight.to_f.round(ndigit, half: half)
103
+ }
104
+ yeasts&.each {|yeast|
105
+ yeast.weight = yeast.weight.to_f.round(mini_ndigit, half: half)
106
+ }
107
+
108
+ self
109
+ end
110
+
111
+ def round(ndigit=0, mini_ndigit=nil, half: :up)
112
+ Utils.check_dup(self)
113
+
114
+ dst = self.dup
115
+ dst.round!(ndigit, mini_ndigit, half: half)
71
116
  end
72
117
 
73
118
  def +(other)
74
119
  if Step===other
75
- self.class.new.tap {|o|
76
- o.koji = koji.to_f + other.koji.to_f
77
- o.koji_soaked_rate = koji_soaked_rate.to_f
78
- o.koji_steamed_rate = koji_steamed_rate.to_f
79
- o.koji_dekoji_rate = koji_dekoji_rate.to_f
80
- o.koji_interval_days = koji_interval_days.to_i
81
-
82
- o.kake = kake.to_f + other.kake.to_f
83
- o.kake_soaked_rate = kake_soaked_rate.to_f
84
- o.kake_steamed_rate = kake_steamed_rate.to_f
85
- o.kake_interval_days = kake_interval_days.to_i
86
-
87
- o.water = water.to_f + other.water.to_f
88
- o.lactic_acid = lactic_acid.to_f + other.lactic_acid.to_f
89
- o.alcohol = alcohol.to_f + other.alcohol.to_f
90
- o.yeast = yeast.to_f + other.yeast.to_f
91
- }
120
+ Utils.check_dup(self)
121
+ Utils.check_dup(other)
122
+
123
+ dst = self.dup
124
+ other = other.dup
125
+
126
+ dst.kojis = Utils.merge_ingredients(dst.kojis, other.kojis)
127
+ dst.kakes = Utils.merge_ingredients(dst.kakes, other.kakes)
128
+ dst.waters = Utils.merge_ingredients(dst.waters, other.waters)
129
+ dst.lactic_acids = Utils.merge_ingredients(dst.lactic_acids, other.lactic_acids)
130
+ dst.alcohols = Utils.merge_ingredients(dst.alcohols, other.alcohols)
131
+ dst.yeasts = Utils.merge_ingredients(dst.yeasts, other.yeasts)
132
+
133
+ dst
92
134
  else
93
135
  x, y = other.coerce(self)
94
136
  x + y
@@ -97,23 +139,7 @@ module Toji
97
139
 
98
140
  def *(other)
99
141
  if Integer===other || Float===other
100
- self.class.new.tap {|o|
101
- o.koji = koji.to_f * other
102
- o.koji_soaked_rate = koji_soaked_rate.to_f
103
- o.koji_steamed_rate = koji_steamed_rate.to_f
104
- o.koji_dekoji_rate = koji_dekoji_rate.to_f
105
- o.koji_interval_days = koji_interval_days.to_i
106
-
107
- o.kake = kake.to_f * other
108
- o.kake_soaked_rate = kake_soaked_rate.to_f
109
- o.kake_steamed_rate = kake_steamed_rate.to_f
110
- o.kake_interval_days = kake_interval_days.to_i
111
-
112
- o.water = water.to_f * other
113
- o.lactic_acid = lactic_acid.to_f * other
114
- o.alcohol = alcohol.to_f * other
115
- o.yeast = yeast.to_f * other
116
- }
142
+ scale(other)
117
143
  else
118
144
  x, y = other.coerce(self)
119
145
  x * y
@@ -0,0 +1,5 @@
1
+ require 'toji/schedule/base'
2
+ require 'toji/schedule/rice_schedule'
3
+ require 'toji/schedule/koji_schedule'
4
+ require 'toji/schedule/kake_schedule'
5
+ require 'toji/schedule/action_schedule'
@@ -0,0 +1,9 @@
1
+ module Toji
2
+ module Schedule
3
+ module ActionSchedule
4
+ include Base
5
+
6
+ attr_reader :index
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Toji
2
+ module Schedule
3
+ module Base
4
+ attr_reader :product
5
+ attr_reader :date
6
+ attr_reader :type
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module Toji
2
+ module Schedule
3
+ module KakeSchedule
4
+ include RiceSchedule
5
+
6
+ def rice_type
7
+ :kake
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Toji
2
+ module Schedule
3
+ module KojiSchedule
4
+ include RiceSchedule
5
+
6
+ def rice_type
7
+ :koji
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module Toji
2
+ module Schedule
3
+ module RiceSchedule
4
+ include Base
5
+
6
+ attr_reader :rice_type
7
+ attr_reader :step_indexes
8
+
9
+ attr_reader :expect
10
+
11
+ def type
12
+ :rice
13
+ end
14
+ end
15
+ end
16
+ end