Skip to content

Commit

Permalink
works duration calculation fixed for stage modes in in both timelines
Browse files Browse the repository at this point in the history
work time estimator's signature updated
scheduling examples added
  • Loading branch information
simpledumpling committed Jul 8, 2024
1 parent 78debc1 commit 9c3a1cf
Show file tree
Hide file tree
Showing 16 changed files with 55,912 additions and 437 deletions.
9,602 changes: 9,602 additions & 0 deletions examples/SAMPO_scheduling_tutorial.ipynb

Large diffs are not rendered by default.

150 changes: 150 additions & 0 deletions examples/dormitory_field_dev_demo_with_granular_new_measurements.csv

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions examples/electroline_field_dev_demo.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
activity_name;granular_name;volume;measurement;granular_measurement
Бурение лидерных скважин;Бурение лидерных скважин;25.0;шт;шт
Установка в скважины свай;Установка в скважины свай;18.0;шт;шт
Монтаж оголовников;Монтаж оголовков;14.0;шт;шт
Монтаж ростверков и опорных конструкций под порталы, опоры ВЛ;Монтаж ростверков и опорных конструкций под порталы, опоры вл;4.0;шт;шт
Сборка опор/порталов;Сборка опор/порталов;2.0;шт;шт
Установка опор/порталов;Установка опор/порталов;2.0;шт;шт
Подвеска провода;Подвеска провода;200.0;м.;м
Подвеска грозозащитного троса;Подвеска грозозащитного троса;160.0;м.;м
Укладка полосового заземления;Укладка полосового заземления;24.0;м.;м
Укладка активного соляного заземления;Укладка активного соляного заземления;35.6;шт;шт
96 changes: 96 additions & 0 deletions examples/field_dev_resources_time_estimator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import math
from itertools import chain
from operator import attrgetter
from random import Random
from sampo.schemas.time import Time

from typing import Type

from sampo.utilities.collections_util import build_index
from sampo.schemas import WorkTimeEstimator, WorkUnit, Worker, WorkerReq, WorkEstimationMode, WorkerProductivityMode
from idbadapter import MschmAdapter, Schedules
from stairsres.res_time_model import ResTimeModel

URL = "postgresql+psycopg2://testuser:[email protected]:25432/test"

dbwrapper = MschmAdapter(URL)
model = ResTimeModel(dbwrapper)


class FieldDevWorkEstimator(WorkTimeEstimator):
def __init__(self,
rand: Random = Random()):
self._use_idle = True
self._estimation_mode = WorkEstimationMode.Realistic
self.rand = rand
self._productivity_mode = WorkerProductivityMode.Static

def estimate_time(self, work_unit: WorkUnit, worker_list: list[Worker]):
w_u = {'name': work_unit.name.split('_stage_')[0],
'volume': work_unit.volume,
'measurement': work_unit.volume_type}
w_l = [{'name': w.name, '_count': w.count} for w in worker_list]
name2worker = build_index(worker_list, attrgetter('name'))
if self._estimation_mode == WorkEstimationMode.Realistic:
mode_str = '0.5'
elif self._estimation_mode == WorkEstimationMode.Optimistic:
mode_str = '0.1'
else:
mode_str = '0.9'

for res_req in work_unit.worker_reqs:
if name2worker.get(res_req.kind, None) is None:
w_l.append({'name': res_req.kind, '_count': 0})
if w_u['name'] in ['Начало работ по марке', 'Окончание работ по марке', 'NaN', 'start of project',
'finish of project']:
return Time(0)
try:
return Time(int(model.estimate_time(work_unit=w_u, worker_list=w_l, mode=mode_str)))
except:
print(w_u['name'])

def find_work_resources(self, work_name: str, work_volume: float, measurement: str = None,
resource_name: list[str] | None = None) \
-> list[WorkerReq]:
if work_name in ['Начало работ по марке', 'Окончание работ по марке', 'NaN', 'start of project',
'finish of project']:
return []
worker_req_dict = model.get_resources_volumes(work_name=work_name, work_volume=work_volume,
measurement=measurement)
avg_work_duration = 1
if worker_req_dict:
w_l = [{'name': req['kind'], '_count': req['volume']} for req in worker_req_dict['worker_reqs']]
avg_work_duration = model.estimate_time({'name': work_name,
'volume': work_volume,
'measurement': measurement}, w_l)

# worker_reqs = [[WorkerReq(kind=req['kind'],
# volume=Time(math.ceil(req['volume'] / avg_work_duration)),
# min_count=math.ceil(req['min_count'] / avg_work_duration) if (req[
# 'min_count'] != 0.0 and
# req[
# 'volume'] != 0.0) or (
# req[
# 'min_count'] == 0.0 and
# req[
# 'volume'] == 0.0) else 1,
# max_count=math.ceil(req['max_count'] / avg_work_duration)) for req in worker_req] for
# worker_req in
# worker_req_dict.values()]
worker_reqs = [[WorkerReq(kind=req['kind'],
volume=Time(req['volume']),
min_count=req['min_count'],
max_count=req['max_count']) for req in worker_req] for
worker_req in
worker_req_dict.values()]
return list(chain.from_iterable(worker_reqs))

def set_estimation_mode(self, use_idle: bool = True, mode: WorkEstimationMode = WorkEstimationMode.Realistic):
self._use_idle = use_idle
self._estimation_mode = mode

def set_productivity_mode(self, mode: WorkerProductivityMode = WorkerProductivityMode.Static):
self._productivity_mode = mode

def get_recreate_info(self) -> tuple[Type, tuple]:
return FieldDevWorkEstimator, ()
27 changes: 27 additions & 0 deletions examples/gas_network_field_dev_demo.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
activity_name;granular_name;volume;measurement;granular_measurement
Изготовление свай;Изготовление металлических свай;1496.0;шт;шт
Бурение скважин;Бурение скважин;1496.0;шт;шт
Погружение свай;Погружение свай;1496.0;шт;шт
Заполнение полости свай ЦПС;Забивка свай;1500.0;шт;шт
Срезка свай, монтаж оголовков;Срезка голов металлических свай;1496.0;шт;шт
Засыпка пространства между сваями щебнем фракции 15-20 мм;Отсыпка площадки щебнем;82.8;м3;м3
Монтаж деформационных марок;Монтаж деформационной марки;100.0;шт;шт
Монтаж траверс;Монтаж траверс;945.0;шт;шт
Монтаж м/к (связи, стойки, упоры, подкосы);Монтаж металлоконструкций (м/к);148.6;шт;шт
Устройство термометрических скважин;Устройство термометрических скважин;11.0;шт;шт
Монтаж термометрических трубок;Монтаж термометрической трубки;59.0;шт;шт
Устройство песчанной подушки;Устройство песчаного основания (подушки);144.47;м3;м3
Укладка габионов;Укладка георешетки, габионов;92.0;м2;м2
Заполнение габионов щебнем фракции 70-120мм;Укладка геосеток, георешеток, габионов с заполнением щебнем;247.97;м2;м2
Монтаж термостабилизаторов;Монтаж термостабилизаторов;81.0;шт;шт
АКЗ свай и металлоконструкций;АКЗ свай и металлоконструкций (м/к);11017.0;м2;м2
Монтаж опор DN 500 (неподвижная, направляющая, скользящая);Монтаж опор;84.0;шт;шт
Сварка газопровода 530х24 мм;Сварка трубопроводов;203.0;стык;стык
Надземная прокладка газопровода 530х24 мм;Прокладка наружной канализации;1267.12;м;м
Монтаж опор метанолопровода;Монтаж опор трубопровода;238.0;шт;шт
Сварка метанолопровода 57х6мм;Автоматическая сварка труб;121.0;стык;стык
Надземная прокладка метанолопровода 57х6мм;Провод для систем опс, прокладываемый по металлическим основаниям;1200.17;м;м
Монтаж заземления;Монтаж заземлений;100.0;м;м
Очистка полости трубопроводов;Очистка полости трубопровода;100.0;м3;м3
Гидроиспытания трубопроводов;Гидроиспытания резервуара;100.0;шт;шт
Изоляция сварных соединений газопровода;Изоляция сварных стыков;203.0;стык;стык
Loading

0 comments on commit 9c3a1cf

Please sign in to comment.