Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

baseline.py TypeError: object of type 'generator' has no len() #11

Open
Hufnagels opened this issue Sep 11, 2023 · 0 comments
Open

baseline.py TypeError: object of type 'generator' has no len() #11

Hufnagels opened this issue Sep 11, 2023 · 0 comments

Comments

@Hufnagels
Copy link

Hi,
this is a very thankful job, u done.
I tried to play with it, but some error occurs.

In baseline.py, when reached the notebook section [35] the following error occurs: TypeError: object of type 'generator' has no len()

Conda installed python is 3.11 instead given in Dockerfile
ortools==8.2.8710 isn't installable

In every case of calling ortools 'cp_model.LinearExpr.Sum' function it returns this error.

Can You help to solve this?

Thanks

Related info

[35]
bl_bin_pool = main.main(bl_order, procedure="bl", tlim=20)
bl_bin_pool.get_original_layer_pool().to_dataframe()

2023-09-11 09:29:04.210 | INFO     | baseline:baseline:165 - Solving baseline model
2023-09-11 09:29:04.201 | INFO     | main:main:169 - BL procedure starting
2023-09-11 09:29:04.202 | INFO     | main:main:179 - BL iteration 1/1
2023-09-11 09:29:04.205 | DEBUG    | superitems:_gen_single_items_superitems:639 - Generated 20 superitems with a single item
2023-09-11 09:29:04.205 | INFO     | superitems:gen_superitems:623 - Generating horizontal superitems of type 'two-width'
2023-09-11 09:29:04.206 | DEBUG    | superitems:_gen_superitems_horizontal:685 - Generated 0 horizontal superitems with 2 items
2023-09-11 09:29:04.207 | DEBUG    | superitems:_gen_superitems_horizontal:692 - Generated 0 horizontal superitems with 4 items
2023-09-11 09:29:04.207 | INFO     | superitems:gen_superitems:626 - Generating vertical superitems with maximum stacking of 4
2023-09-11 09:29:04.208 | DEBUG    | superitems:_gen_superitems_vertical:770 - Generated 15 wide vertical superitems
2023-09-11 09:29:04.209 | DEBUG    | superitems:_gen_superitems_vertical:772 - Generated 0 deep vertical superitems
2023-09-11 09:29:04.209 | INFO     | superitems:gen_superitems:628 - Generated 35 superitems
2023-09-11 09:29:04.209 | INFO     | superitems:gen_superitems:630 - Remaining superitems after filtering by pallet dimensions: 35
2023-09-11 09:29:04.210 | INFO     | baseline:baseline:165 - Solving baseline model
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[35], line 1
----> 1 bl_bin_pool = main.main(bl_order, procedure="bl", tlim=20)
      2 bl_bin_pool.get_original_layer_pool().to_dataframe()

File ~/work/src/main.py:194, in main(order, procedure, max_iters, superitems_horizontal, superitems_horizontal_type, superitems_max_vstacked, density_tol, filtering_two_dims, filtering_max_coverage_all, filtering_max_coverage_single, tlim, enable_solver_output, height_tol, cg_use_height_groups, cg_mr_warm_start, cg_max_iters, cg_max_stag_iters, cg_sp_mr, cg_sp_np_type, cg_sp_p_type, cg_return_only_last)
    192 # Call the right packing procedure
    193 if procedure == "bl":
--> 194     layer_pool = baseline.baseline(superitems_pool, config.PALLET_DIMS, tlim=tlim)
    195 elif procedure == "mr":
    196     layer_pool = maxrects_warm_start(
    197         superitems_pool, height_tol=height_tol, density_tol=density_tol, add_single=False
    198     )

File ~/work/src/baseline.py:166, in baseline(superitems_pool, pallet_dims, tlim, num_workers)
    164 # Call the baseline model
    165 logger.info("Solving baseline model")
--> 166 sol, solve_time = baseline_model(
    167     fsi, ws, ds, hs, pallet_dims, tlim=tlim, num_workers=num_workers
    168 )
    169 logger.info(f"Solved baseline model in {solve_time:.2f} seconds")
    171 # Build the layer pool from the model's solution

File ~/work/src/baseline.py:62, in baseline_model(fsi, ws, ds, hs, pallet_dims, tlim, num_workers)
     58 # Constraints
     59 # Ensure that every item is included in exactly one layer
     60 for i in range(n_items):
     61     model.Add(
---> 62         cp_model.LinearExpr.Sum(
     63             fsi[s, i] * zsl[s, l] for s in range(n_superitems) for l in range(max_layers)
     64         )
     65         == 1
     66     )
     68 # Define the height of layer l
     69 for l in range(max_layers):

File /opt/conda/lib/python3.11/site-packages/ortools/sat/python/cp_model.py:183, in LinearExpr.Sum(cls, expressions)
    180 @classmethod
    181 def Sum(cls, expressions):
    182     """Creates the expression sum(expressions)."""
--> 183     if len(expressions) == 1:
    184         return expressions[0]
    185     return _SumArray(expressions)

TypeError: object of type 'generator' has no len()

I tried to convert it to a docker container with the following params:

  • ortools==9.5.2237 (original isn't reachable)
  • python 3.9.6
  • nb_black (installed from git --> 1.0.7 has restriction for python < 3.6)

The Dockerfile:

FROM jupyter/base-notebook

# Name your environment and choose the python version
ARG env_name=python3.9.6
ARG py_ver=3.9.6

COPY --chown=${NB_UID}:${NB_GID} /init/requirements.txt /tmp/
COPY --chown=${NB_UID}:${NB_GID} /init/environment.yml /tmp/
RUN mamba env create -p "${CONDA_DIR}/envs/${env_name}" -f /tmp/environment.yml && \
  mamba clean --all -f -y

# Create Python kernel and link it to jupyter
RUN "${CONDA_DIR}/envs/${env_name}/bin/python" -m ipykernel install --user --name="${env_name}" && \
  fix-permissions "${CONDA_DIR}" && \
  fix-permissions "/home/${NB_USER}"

RUN "${CONDA_DIR}/envs/${env_name}/bin/pip" install --no-cache-dir \
  'flake8'

USER root
RUN apt update -y
RUN apt install git -y

RUN pip install --no-cache-dir -r /tmp/requirements.txt
#USER ${NB_UID}
RUN pip install git+https://github.com/IsaGrue/nb_black.git

USER root
RUN activate_custom_env_script=/usr/local/bin/before-notebook.d/activate_custom_env.sh && \
  echo "#!/bin/bash" > ${activate_custom_env_script} && \
  echo "eval \"$(conda shell.bash activate "${env_name}")\"" >> ${activate_custom_env_script} && \
  chmod +x ${activate_custom_env_script}

USER ${NB_UID}

RUN echo "conda activate ${env_name}" >> "${HOME}/.bashrc"

The docker-compose.yaml

version: "3"

services:
  app:
    container_name: 3dp-packing
    build:
      context: .
      dockerfile: ./Dockerfile
    # command: flask --app ./src/hello --debug run --host=0.0.0.0 --port=8080
    image: 3dp-packing:latest
    volumes:
      - ${PWD}/work:/home/jovyan/work

    ports:
      - 8888:8888
      - 8787:8787

requirements.txt

numpy
pandas
ortools==9.5.2237
matplotlib
ipympl==0.7.0
rectpack
tqdm==4.60.0
scipy
seaborn
streamlit==1.8.1
watchdogs==1.8.2
loguru==0.5.3

environment.yaml

name: 3d-bpp

channels:
  - conda-forge
  - defaults

dependencies:
  - black==21.7b0
  - loguru==0.5.3
  - matplotlib==3.4.2
  - nb_black==1.0.7
  - numpy
  - pandas
  - pip==21.2.1
  - python==3.9.6
  - seaborn==0.11.2
  - tqdm==4.61.2
  - streamlit==0.85.1
  - pip:
      - ortools==9.5.2237
      - rectpack==0.2.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant