toji 2.11.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) 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 +35 -35
  5. data/example/example_core.rb +882 -230
  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 -2
  20. data/lib/toji/calendar.rb +12 -12
  21. data/lib/toji/calendar/date_column.rb +8 -8
  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 -32
  47. data/lib/toji/product/schedule_factory.rb +80 -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 +51 -39
  68. data/lib/toji/recipe/ab_expect.rb +2 -2
  69. data/lib/toji/recipe/action.rb +2 -2
  70. data/lib/toji/recipe/step.rb +99 -71
  71. data/lib/toji/schedule.rb +5 -0
  72. data/lib/toji/schedule/action_schedule.rb +9 -0
  73. data/lib/toji/{event → schedule}/base.rb +1 -1
  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 -45
  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/event.rb +0 -5
  89. data/lib/toji/event/action_event.rb +0 -12
  90. data/lib/toji/event/kake_event.rb +0 -13
  91. data/lib/toji/event/koji_event.rb +0 -19
  92. data/lib/toji/event/rice_event.rb +0 -34
  93. data/lib/toji/ingredient/kake/actual.rb +0 -26
  94. data/lib/toji/ingredient/kake/base.rb +0 -18
  95. data/lib/toji/ingredient/kake/expected.rb +0 -40
  96. data/lib/toji/ingredient/koji/actual.rb +0 -29
  97. data/lib/toji/ingredient/koji/actual_fermentable.rb +0 -15
  98. data/lib/toji/ingredient/koji/base.rb +0 -35
  99. data/lib/toji/ingredient/koji/expected.rb +0 -45
  100. data/lib/toji/ingredient/koji/expected_fermentable.rb +0 -15
  101. data/lib/toji/ingredient/koji_rate.rb +0 -16
  102. data/lib/toji/ingredient/rice/actual_steamable.rb +0 -27
  103. data/lib/toji/ingredient/rice/base.rb +0 -40
  104. data/lib/toji/ingredient/rice/expected_steamable.rb +0 -27
  105. data/lib/toji/ingredient/rice_rate.rb +0 -23
  106. data/lib/toji/product/event_factory.rb +0 -70
@@ -1,7 +1,7 @@
1
1
  module Toji
2
- module Brew
2
+ module Progress
3
3
  module Graph
4
- class Progress
4
+ class ProgressNote
5
5
 
6
6
  PLOT_KEYS = [:temps, :preset_temp, :room_temp, :room_psychrometry, :baume, :acid, :amino_acid, :alcohol, :bmd].freeze
7
7
 
@@ -26,13 +26,13 @@ module Toji
26
26
  :dashdot,
27
27
  ].freeze
28
28
 
29
- attr_reader :brew
29
+ attr_reader :progress
30
30
  attr_accessor :name
31
31
  attr_accessor :dash
32
32
  attr_accessor :enable_annotations
33
33
 
34
- def initialize(brew, name: nil, dash: :solid, enable_annotations: true)
35
- @brew = brew
34
+ def initialize(progress, name: nil, dash: :solid, enable_annotations: true)
35
+ @progress = progress
36
36
  @name = name
37
37
  @dash = dash
38
38
  @enable_annotations = enable_annotations
@@ -40,7 +40,7 @@ module Toji
40
40
 
41
41
  def plot_data(keys=nil, use_name=false)
42
42
  if !keys
43
- keys = @brew.has_keys
43
+ keys = @progress.has_keys
44
44
  end
45
45
 
46
46
  name = ""
@@ -56,7 +56,7 @@ module Toji
56
56
  xs = []
57
57
  ys = []
58
58
  text = []
59
- @brew.wrapped_states.each {|s|
59
+ @progress.states.each {|s|
60
60
  val = s.send(key)
61
61
  if val
62
62
  [val].flatten.each_with_index {|v,i|
@@ -75,7 +75,7 @@ module Toji
75
75
  result << {x: xs, y: ys, text: text, name: "#{name}#{key}", line: {dash: @dash, shape: line_shape}, marker: {color: PLOT_COLORS[key]}}
76
76
  }
77
77
 
78
- if 0<@brew.wrapped_states.length && 0<@brew.day_offset
78
+ if 0<@progress.states.length && 0<@progress.day_offset
79
79
  result = result.map{|h|
80
80
  h[:x].unshift(0)
81
81
  h[:y].unshift(nil)
@@ -84,8 +84,8 @@ module Toji
84
84
  }
85
85
  end
86
86
 
87
- #if 0<@brew.wrapped_states.length && @brew.wrapped_states.last.time.strftime("%T")!="00:00:00"
88
- # t = @brew.wrapped_states.last.elapsed_time_with_offset
87
+ #if 0<@progress.states.length && @progress.states.last.time.strftime("%T")!="00:00:00"
88
+ # t = @progress.states.last.elapsed_time_with_offset
89
89
  # t -= (t % DAY) - DAY
90
90
  #
91
91
  # result = result.map{|h|
@@ -102,7 +102,7 @@ module Toji
102
102
  def annotations
103
103
  return [] if !@enable_annotations
104
104
 
105
- @brew.wrapped_states.select{|s| s.mark}.map {|s|
105
+ @progress.states.select{|s| s.mark}.map {|s|
106
106
  {
107
107
  x: s.elapsed_time_with_offset,
108
108
  y: s.temps.first || 0,
@@ -119,19 +119,21 @@ module Toji
119
119
 
120
120
  def table_data(keys=nil)
121
121
  if !keys
122
- keys = @brew.has_keys
122
+ keys = @progress.has_keys
123
123
  keys.delete(:elapsed_time)
124
124
  keys.delete(:time)
125
125
  keys.delete(:day)
126
126
  keys.delete(:moromi_day)
127
- keys.delete(:baume)
128
- keys.delete(:nihonshudo)
127
+ if keys.include?(:display_baume)
128
+ keys.delete(:baume)
129
+ keys.delete(:nihonshudo)
130
+ end
129
131
  else
130
- keys &= @brew.has_keys
132
+ keys &= @progress.has_keys
131
133
  end
132
134
 
133
135
  rows = []
134
- @brew.wrapped_states.each {|state|
136
+ @progress.states.each {|state|
135
137
  rows << keys.map {|k|
136
138
  v = state&.send(k)
137
139
  if Array===v
@@ -155,8 +157,8 @@ module Toji
155
157
  layout: {
156
158
  xaxis: {
157
159
  dtick: DAY,
158
- tickvals: @brew.days.times.map{|d| d*DAY},
159
- ticktext: @brew.day_labels
160
+ tickvals: @progress.days.times.map{|d| d*DAY},
161
+ ticktext: @progress.day_labels
160
162
  },
161
163
  annotations: annotations,
162
164
  }
@@ -0,0 +1,15 @@
1
+ module Toji
2
+ module Progress
3
+ module KojiProgress
4
+ include BaseProgress
5
+
6
+ def all_keys
7
+ KojiState::REQUIRED_KEYS + KojiState::OPTIONAL_KEYS
8
+ end
9
+
10
+ def progress_note(name: nil, dash: :solid, enable_annotations: true)
11
+ Graph::ProgressNote.new(self, name: name, dash: dash, enable_annotations: enable_annotations)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module Toji
2
+ module Progress
3
+ module KojiState
4
+ include BaseState
5
+
6
+ OPTIONAL_KEYS = [
7
+ :temps,
8
+ :preset_temp,
9
+ :room_temp,
10
+ :room_psychrometry,
11
+
12
+ :note,
13
+ ].freeze
14
+
15
+ attr_accessor :temps
16
+ attr_accessor :preset_temp
17
+ attr_accessor :room_temp
18
+ attr_accessor :room_psychrometry
19
+
20
+ attr_accessor :note
21
+ end
22
+ end
23
+ end
@@ -1,7 +1,7 @@
1
1
  module Toji
2
- module Brew
3
- module Moromi
4
- include Base
2
+ module Progress
3
+ module MoromiProgress
4
+ include BaseProgress
5
5
 
6
6
  attr_accessor :prefix_day_labels
7
7
 
@@ -28,8 +28,12 @@ module Toji
28
28
  end
29
29
  end
30
30
 
31
- def progress(name: nil, dash: :solid, enable_annotations: true)
32
- Graph::Progress.new(self, name: name, dash: dash, enable_annotations: enable_annotations)
31
+ def all_keys
32
+ MoromiState::REQUIRED_KEYS + MoromiState::OPTIONAL_KEYS
33
+ end
34
+
35
+ def progress_note(name: nil, dash: :solid, enable_annotations: true)
36
+ Graph::ProgressNote.new(self, name: name, dash: dash, enable_annotations: enable_annotations)
33
37
  end
34
38
 
35
39
  def bmd
@@ -0,0 +1,77 @@
1
+ module Toji
2
+ module Progress
3
+ module MoromiState
4
+ include BaseState
5
+
6
+ OPTIONAL_KEYS = [
7
+ :moromi_day,
8
+ :temps,
9
+ :preset_temp,
10
+ :room_temp,
11
+ :room_psychrometry,
12
+
13
+ :baume,
14
+ :nihonshudo,
15
+ :display_baume,
16
+ :acid,
17
+ :amino_acid,
18
+ :alcohol,
19
+ :bmd,
20
+
21
+ :warmings,
22
+ :note,
23
+ ].freeze
24
+
25
+ attr_accessor :temps
26
+ attr_accessor :preset_temp
27
+ attr_accessor :room_temp
28
+ attr_accessor :room_psychrometry
29
+
30
+ attr_accessor :baume
31
+ attr_accessor :nihonshudo
32
+ attr_accessor :acid
33
+ attr_accessor :amino_acid
34
+ attr_accessor :alcohol
35
+
36
+ attr_accessor :warmings
37
+ attr_accessor :note
38
+
39
+ def moromi_day
40
+ _tome_day = progress.moromi_tome_day
41
+ _now_day = day
42
+
43
+ if _tome_day && _tome_day < _now_day
44
+ _now_day - _tome_day + 1
45
+ end
46
+ end
47
+
48
+ def display_baume
49
+ _baume = baume
50
+ if _baume
51
+ if _baume<3.0
52
+ nihonshudo
53
+ else
54
+ _baume
55
+ end
56
+ end
57
+ end
58
+
59
+ def bmd
60
+ _moromi_day = moromi_day
61
+ _baume = baume
62
+
63
+ if _moromi_day && _baume
64
+ _moromi_day * _baume
65
+ end
66
+ end
67
+
68
+ def expected_alcohol(target_alc, target_nihonshudo, coef)
69
+ _baume = baume
70
+
71
+ if _baume
72
+ target_alc - (_baume - target_nihonshudo * -0.1) * coef
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,15 @@
1
+ module Toji
2
+ module Progress
3
+ module MotoProgress
4
+ include BaseProgress
5
+
6
+ def all_keys
7
+ MotoState::REQUIRED_KEYS + MotoState::OPTIONAL_KEYS
8
+ end
9
+
10
+ def progress_note(name: nil, dash: :solid, enable_annotations: true)
11
+ Graph::ProgressNote.new(self, name: name, dash: dash, enable_annotations: enable_annotations)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ module Toji
2
+ module Progress
3
+ module MotoState
4
+ include BaseState
5
+
6
+ OPTIONAL_KEYS = [
7
+ :temps,
8
+ :preset_temp,
9
+ :room_temp,
10
+ :room_psychrometry,
11
+
12
+ :baume,
13
+ :acid,
14
+
15
+ :warmings,
16
+ :note,
17
+ ].freeze
18
+
19
+ attr_accessor :temps
20
+ attr_accessor :preset_temp
21
+ attr_accessor :room_temp
22
+ attr_accessor :room_psychrometry
23
+
24
+ attr_accessor :baume
25
+ attr_accessor :acid
26
+
27
+ attr_accessor :warmings
28
+ attr_accessor :note
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ module Toji
2
+ module Progress
3
+ module Progress
4
+ attr_reader :states
5
+ attr_reader :date_line
6
+
7
+ attr_reader :base_time
8
+ attr_reader :day_offset
9
+ attr_reader :days
10
+ attr_reader :day_labels
11
+
12
+ attr_reader :all_keys
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ require 'toji/progress/state/baume_to_nihonshudo'
2
+ require 'toji/progress/state/nihonshudo_to_baume'
3
+
4
+ module Toji
5
+ module Progress
6
+ module State
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module Toji
2
+ module Progress
3
+ module State
4
+ module BaumeToNihonshudo
5
+ def nihonshudo
6
+ if self.baume
7
+ self.baume * -10
8
+ end
9
+ end
10
+
11
+ def nihonshudo=(val)
12
+ if val
13
+ self.baume = val.to_f / -10.0
14
+ else
15
+ self.baume = nil
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -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
@@ -4,42 +4,42 @@ require 'toji/recipe/ab_expect'
4
4
 
5
5
  module Toji
6
6
  module Recipe
7
- attr_accessor :steps
8
- attr_accessor :actions
9
- attr_accessor :has_moto
10
- attr_accessor :has_moromi
11
- attr_accessor :ab_coef
12
- attr_accessor :ab_expects
13
-
14
- def scale(rice_total)
15
- rate = rice_total / steps.map(&:rice_total).sum
16
- new_steps = steps.map {|step|
17
- step * rate
7
+ attr_reader :steps
8
+ attr_reader :actions
9
+ attr_reader :ab_coef
10
+ attr_reader :ab_expects
11
+
12
+ def scale_rice_total(rice_total)
13
+ ratio = rice_total / steps.map(&:rice_total).sum
14
+ scale(ratio)
15
+ end
16
+
17
+ def scale!(ratio)
18
+ steps.each {|step|
19
+ step.scale!(ratio)
18
20
  }
21
+ self
22
+ end
23
+
24
+ def scale(ratio)
25
+ Utils.check_dup(self)
26
+
27
+ dst = self.dup
28
+ dst.scale!(ratio)
29
+ end
19
30
 
20
- self.class.new.tap {|o|
21
- o.steps = new_steps
22
- o.actions = actions.deep_dup
23
- o.has_moto = has_moto
24
- o.has_moromi = has_moromi
25
- o.ab_coef = ab_coef
26
- o.ab_expects = ab_expects.deep_dup
31
+ def round!(ndigit=0, mini_ndigit=nil, half: :up)
32
+ steps.each {|step|
33
+ step.round!(ndigit, mini_ndigit, half: half)
27
34
  }
35
+ self
28
36
  end
29
37
 
30
38
  def round(ndigit=0, mini_ndigit=nil, half: :up)
31
- new_steps = steps.map {|step|
32
- step.round(ndigit, mini_ndigit, half: half)
33
- }
39
+ Utils.check_dup(self)
34
40
 
35
- self.class.new.tap {|o|
36
- o.steps = new_steps
37
- o.actions = actions.deep_dup
38
- o.has_moto = has_moto
39
- o.has_moromi = has_moromi
40
- o.ab_coef = ab_coef
41
- o.ab_expects = ab_expects.deep_dup
42
- }
41
+ dst = self.dup
42
+ dst.round!(ndigit, mini_ndigit, half: half)
43
43
  end
44
44
 
45
45
  # 総米の累計
@@ -52,7 +52,7 @@ module Toji
52
52
  end
53
53
 
54
54
  # 酒母歩合の累計
55
- def cumulative_moto_rates
55
+ def cumulative_moto_ratios
56
56
  rice_total = steps.map(&:rice_total)
57
57
  moto = rice_total.first
58
58
 
@@ -67,8 +67,8 @@ module Toji
67
67
  # 汲水歩合が大きい高温糖化酒母では6%程度である
68
68
  #
69
69
  # 出典: 酒造教本 P96
70
- def moto_rate
71
- cumulative_moto_rates.last || 0.0
70
+ def moto_ratio
71
+ cumulative_moto_ratios.last || 0.0
72
72
  end
73
73
 
74
74
  # 白米比率
@@ -79,22 +79,34 @@ module Toji
79
79
  # 湧き抑え型 1 2 4 7 長期醪、甘口、おだやかな酒質
80
80
  #
81
81
  # 出典: 酒造教本 P95
82
- def rice_rates
82
+ def rice_ratios
83
83
  steps.map {|step|
84
84
  step.rice_total / steps.first.rice_total
85
85
  }
86
86
  end
87
87
 
88
88
  def table_data
89
- headers = [""] + steps.map.with_index{|s,i| :"step#{i}"} + [:total]
90
- keys = [:rice_total, :kake, :koji, :alcohol, :water, :lactic_acid]
89
+ headers = [""] + steps.map.with_index{|s,i| :"Step#{i}"} + [:total]
90
+ keys = [["RiceTotal", :rice_total], ["Kake", :kakes], ["Koji", :kojis], ["Alcohol", :alcohols], ["Water", :waters], ["LacticAcid", :lactic_acids]]
91
91
 
92
- cells = [keys]
92
+ cells = [keys.map(&:first)]
93
93
  cells += steps.map {|step|
94
- [step.rice_total, step.kake, step.koji, step.alcohol, step.water, step.lactic_acid]
94
+ keys.map(&:last).map {|key|
95
+ vals = step.send(key)
96
+ if Numeric===vals
97
+ vals
98
+ else
99
+ vals.compact.map(&:weight).sum
100
+ end
101
+ }
95
102
  }
96
- cells << keys.map {|key|
97
- steps.map(&key).compact.sum
103
+ cells << keys.map(&:last).map {|key|
104
+ vals = steps.map(&key)
105
+ if Numeric===vals[0]
106
+ vals.sum
107
+ else
108
+ vals.flatten.compact.map(&:weight).sum
109
+ end
98
110
  }
99
111
 
100
112
  cells = cells.map {|cell|