40 "Return an iterator with tuples representing the resource plan in each time bucket");
51 Object::createString<ResourceDefault>,
65 Object::createString<ResourceInfinite>);
92 for (loadplanlist::iterator oo=loadplans.
begin(); oo!=loadplans.
end(); oo++)
93 if (oo->getType() == 4)
96 static_cast<loadplanlist::EventMaxQuantity *
>(&*oo)->setMax(size_max);
100 loadplanlist::EventMaxQuantity *newEvent =
101 new loadplanlist::EventMaxQuantity(Date::infinitePast, size_max);
102 loadplans.
insert(newEvent);
109 if (size_max_cal == c)
return;
115 for (loadplanlist::iterator oo=loadplans.
begin(); oo!=loadplans.
end(); )
116 if (oo->getType() == 4)
118 loadplans.
erase(&(*oo));
134 if (curMax != x.getValue())
137 loadplanlist::EventMaxQuantity *newBucket =
138 new loadplanlist::EventMaxQuantity(x.getDate(), curMax);
139 loadplans.
insert(newBucket);
158 HasDescription::writeElement(o, tag);
173 loadplanlist::const_iterator i = loadplans.
begin();
177 for (; i!=loadplans.
end(); ++i)
258 throw LogicException(
"Incorrect object type during read operation");
260 "' has invalid type for use as resource max calendar");
271 else throw LogicException(
"Incorrect object type during read operation");
279 else throw LogicException(
"Incorrect object type during read operation");
284 HasDescription::endElement(pIn, pAttr, pElement);
293 for (loadlist::iterator i=loads.begin(); i!=loads.end(); ++i)
322 loadplanlist::const_iterator i = ldplan ?
326 Date latestCheckDate = ldplan ? ldplan->
getDate() : Date::infiniteFuture;
455 PyErr_SetString(
PythonDataException,
"resource maximum_calendar must be of type calendar_double");
473 PyErr_SetString(
PythonDataException,
"resource setup_matrix must be of type setup_matrix");
485 extern "C" PyObject* Resource::plan(PyObject *
self, PyObject *args)
491 PyObject* buckets = NULL;
492 int ok = PyArg_ParseTuple(args,
"O:plan", &buckets);
493 if (!ok)
return NULL;
496 PyObject* iter = PyObject_GetIter(buckets);
499 PyErr_Format(PyExc_AttributeError,
"Argument to resource.plan() must support iteration");
504 return new Resource::PlanIterator(resource, iter);
512 x.
setName(
"resourceplanIterator");
513 x.
setDoc(
"frePPLe iterator for resourceplan");
521 cur_setup(0.0), cur_load(0.0), cur_size(0.0), start_date(NULL), end_date(NULL)
525 bucketiterator = NULL;
526 throw LogicException(
"Creating resource plan iterator for NULL resource");
530 end_date = PyIter_Next(bucketiterator);
531 if (!end_date)
throw LogicException(
"Expecting at least two dates as argument");
533 prev_date = cur_date;
537 if (hasUnavailability)
540 prev_value = unavailableIterator.
getBucket() ?
546 while (ldplaniter != res->
getLoadPlans().
end() && ldplaniter->getDate() <= cur_date)
548 if (ldplaniter->getType() == 4)
550 cur_size = ldplaniter->getMax();
554 if (!ldplan)
continue;
557 cur_setup = ldplan->
getQuantity() < 0 ? 0.0 : cur_size;
569 if (bucketiterator) Py_DECREF(bucketiterator);
570 if (start_date) Py_DECREF(start_date);
571 if (end_date) Py_DECREF(end_date);
575 void Resource::PlanIterator::update(
Date till)
578 if (hasUnavailability)
581 while (unavailableIterator.getDate() <= till)
583 timedelta = unavailableIterator.getDate() - prev_date;
586 bucket_available += cur_size * timedelta;
587 bucket_load += cur_load * timedelta;
588 bucket_setup += cur_setup * timedelta;
591 bucket_unavailable += cur_size * timedelta;
592 prev_value = unavailableIterator.getBucket() ?
593 unavailableIterator.getBucket()->getBool() :
594 res->getLocation()->getAvailable()->getDefault()!=0;
595 prev_date = unavailableIterator.getDate();
596 ++unavailableIterator;
599 timedelta = till - prev_date;
602 bucket_available += cur_size * timedelta;
603 bucket_load += cur_load * timedelta;
604 bucket_setup += cur_setup * timedelta;
607 bucket_unavailable += cur_size * timedelta;
612 timedelta = till - prev_date;
613 bucket_available += cur_size * timedelta;
614 bucket_load += cur_load * timedelta;
615 bucket_setup += cur_setup * timedelta;
622 PyObject* Resource::PlanIterator::iternext()
625 bucket_available = 0.0;
626 bucket_unavailable = 0.0;
631 if (start_date) Py_DECREF(start_date);
632 start_date = end_date;
633 end_date = PyIter_Next(bucketiterator);
634 if (!end_date)
return NULL;
638 if (ldplaniter != res->getLoadPlans().end() && ldplaniter->getDate() < cur_date)
639 update(ldplaniter->getDate());
642 while (ldplaniter != res->getLoadPlans().end() && ldplaniter->getDate() <= cur_date)
645 update(ldplaniter->getDate());
648 if (ldplaniter->getType() == 4)
650 cur_size = ldplaniter->getMax();
657 cur_setup = ldplan->getQuantity() < 0 ? 0.0 : cur_size;
660 cur_load = ldplan->getOnhand();
671 bucket_available /= 3600;
673 bucket_unavailable /= 3600;
674 bucket_setup /= 3600;
677 return Py_BuildValue(
"{s:O,s:O,s:d,s:d,s:d,s:d,s:d}",
680 "available", bucket_available,
682 "unavailable", bucket_unavailable,
683 "setup", bucket_setup,
684 "free", bucket_available - bucket_load - bucket_setup);