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);
172 loadplanlist::const_iterator i = loadplans.
begin();
176 for (; i!=loadplans.
end(); ++i)
246 throw LogicException(
"Incorrect object type during read operation");
248 "' has invalid type for use as resource max calendar");
259 else throw LogicException(
"Incorrect object type during read operation");
267 else throw LogicException(
"Incorrect object type during read operation");
281 for (loadlist::iterator i=loads.begin(); i!=loads.end(); ++i)
310 loadplanlist::const_iterator i = ldplan ?
314 Date latestCheckDate = ldplan ? ldplan->
getDate() : Date::infiniteFuture;
443 PyErr_SetString(
PythonDataException,
"resource maximum_calendar must be of type calendar_double");
461 PyErr_SetString(
PythonDataException,
"resource setup_matrix must be of type setup_matrix");
473 extern "C" PyObject* Resource::plan(PyObject *
self, PyObject *args)
479 PyObject* buckets = NULL;
480 int ok = PyArg_ParseTuple(args,
"O:plan", &buckets);
481 if (!ok)
return NULL;
484 PyObject* iter = PyObject_GetIter(buckets);
487 PyErr_Format(PyExc_AttributeError,
"Argument to resource.plan() must support iteration");
492 return new Resource::PlanIterator(resource, iter);
500 x.
setName(
"resourceplanIterator");
501 x.
setDoc(
"frePPLe iterator for resourceplan");
509 cur_setup(0.0), cur_load(0.0), cur_size(0.0), start_date(NULL), end_date(NULL)
513 bucketiterator = NULL;
514 throw LogicException(
"Creating resource plan iterator for NULL resource");
518 end_date = PyIter_Next(bucketiterator);
519 if (!end_date)
throw LogicException(
"Expecting at least two dates as argument");
521 prev_date = cur_date;
525 if (hasUnavailability)
528 prev_value = unavailableIterator.
getBucket() ?
534 while (ldplaniter != res->
getLoadPlans().
end() && ldplaniter->getDate() <= cur_date)
536 if (ldplaniter->getType() == 4)
538 cur_size = ldplaniter->getMax();
542 if (!ldplan)
continue;
545 cur_setup = ldplan->
getQuantity() < 0 ? 0.0 : cur_size;
557 if (bucketiterator) Py_DECREF(bucketiterator);
558 if (start_date) Py_DECREF(start_date);
559 if (end_date) Py_DECREF(end_date);
563 void Resource::PlanIterator::update(
Date till)
566 if (hasUnavailability)
569 while (unavailableIterator.getDate() <= till)
571 timedelta = unavailableIterator.getDate() - prev_date;
574 bucket_available += cur_size * timedelta;
575 bucket_load += cur_load * timedelta;
576 bucket_setup += cur_setup * timedelta;
579 bucket_unavailable += cur_size * timedelta;
580 prev_value = unavailableIterator.getBucket() ?
581 unavailableIterator.getBucket()->getBool() :
582 res->getLocation()->getAvailable()->getDefault()!=0;
583 prev_date = unavailableIterator.getDate();
584 ++unavailableIterator;
587 timedelta = till - prev_date;
590 bucket_available += cur_size * timedelta;
591 bucket_load += cur_load * timedelta;
592 bucket_setup += cur_setup * timedelta;
595 bucket_unavailable += cur_size * timedelta;
600 timedelta = till - prev_date;
601 bucket_available += cur_size * timedelta;
602 bucket_load += cur_load * timedelta;
603 bucket_setup += cur_setup * timedelta;
613 bucket_available = 0.0;
614 bucket_unavailable = 0.0;
619 if (start_date) Py_DECREF(start_date);
620 start_date = end_date;
621 end_date = PyIter_Next(bucketiterator);
622 if (!end_date)
return NULL;
626 if (ldplaniter != res->getLoadPlans().end() && ldplaniter->getDate() < cur_date)
627 update(ldplaniter->getDate());
630 while (ldplaniter != res->getLoadPlans().end() && ldplaniter->getDate() <= cur_date)
633 update(ldplaniter->getDate());
636 if (ldplaniter->getType() == 4)
638 cur_size = ldplaniter->getMax();
645 cur_setup = ldplan->getQuantity() < 0 ? 0.0 : cur_size;
648 cur_load = ldplan->getOnhand();
659 bucket_available /= 3600;
661 bucket_unavailable /= 3600;
662 bucket_setup /= 3600;
665 return Py_BuildValue(
"{s:O,s:O,s:d,s:d,s:d,s:d,s:d}",
668 "available", bucket_available,
670 "unavailable", bucket_unavailable,
671 "setup", bucket_setup,
672 "free", bucket_available - bucket_load - bucket_setup);