class_docstr: Environment for cutting 2D pieces based on the customer demand. Works as follows:
   - Keeps inventory of 2D pieces available for cutting and fulfilling the demand.
   - Produces a new demand for one piece in every step (here a static demand).
   - The agent should decide which piece from inventory to cut (and how) to fulfill the given demand.
   - What remains from the cut piece is put back in inventory.
   - All the time, one raw (full-size) piece is available in inventory.
     (If it gets cut, it is replenished in the next step.)
   - Rewards are calculated to motivate the agent to consume as few raw pieces as possible.
   - If inventory gets full, the oldest pieces get discarded.
  
  :param max_pieces_in_inventory: Size of the inventory.
  :param raw_piece_size: Size of a fresh raw (= full-size) piece.
  :param static_demand: List of orders to issue.
  :param reward_aggregator: Either an instantiated aggregator or a configuration dictionary.
class_docstr_tok: ["Environment","for","cutting","2D","pieces","based","on","the","customer","demand",".","Works","as","follows",":","-","Keeps","inventory","of","2D","pieces","available","for","cutting","and","fulfilling","the","demand",".","-","Produces","a","new","demand","for","one","piece","in","every","step","(","here","a","static","demand",")",".","-","The","agent","should","decide","which","piece","from","inventory","to","cut","(","and","how",")","to","fulfill","the","given","demand",".","-","What","remains","from","the","cut","piece","is","put","back","in","inventory",".","-","All","the","time",",","one","raw","(","full-size",")","piece","is","available","in","inventory",".","(","If","it","gets","cut",",","it","is","replenished","in","the","next","step",".",")","-","Rewards","are","calculated","to","motivate","the","agent","to","consume","as","few","raw","pieces","as","possible",".","-","If","inventory","gets","full",",","the","oldest","pieces","get","discarded",".",":","param","max_pieces_in_inventory",":","Size","of","the","inventory",".",":","param","raw_piece_size",":","Size","of","a","fresh","raw","(","=","full-size",")","piece",".",":","param","static_demand",":","List","of","orders","to","issue",".",":","param","reward_aggregator",":","Either","an","instantiated","aggregator","or","a","configuration","dictionary","."]
docstr: No additional cleanup necessary.
docstr_tok: ["No","additional","cleanup","necessary","."]
code: def close(self):
      """No additional cleanup necessary."""
  
imports: from typing import Union, Tuple, Dict, Any, List
  import numpy
  from maze.core.env.core_env import CoreEnv
  from maze.core.env.reward import RewardAggregatorInterface
  from maze.core.env.structured_env import ActorID
  from maze.core.events.pubsub import Pubsub
  from .maze_state import Cutting2DMazeState
  from .maze_action import Cutting2DMazeAction
  from .inventory import Inventory
  from .renderer import Cutting2DRenderer
  from .events import CuttingEvents, InventoryEvents
  from .kpi_calculator import Cutting2dKpiCalculator
label_desc: Use image node_id 6 for calling the Cutting2DCoreEnvironment obj's underlying member method code with example usage: obj.close() without return types