Generated on Thu Jan 16 2025 00:00:00 for Gecode by doxygen 1.14.0
subsumption.hpp
Go to the documentation of this file.
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Christian Schulte <schulte@gecode.org>
5 *
6 * Copyright:
7 * Christian Schulte, 2015
8 *
9 * This file is part of Gecode, the generic constraint
10 * development environment:
11 * http://www.gecode.org
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining
14 * a copy of this software and associated documentation files (the
15 * "Software"), to deal in the Software without restriction, including
16 * without limitation the rights to use, copy, modify, merge, publish,
17 * distribute, sublicense, and/or sell copies of the Software, and to
18 * permit persons to whom the Software is furnished to do so, subject to
19 * the following conditions:
20 *
21 * The above copyright notice and this permission notice shall be
22 * included in all copies or substantial portions of the Software.
23 *
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 *
32 */
33
34namespace Gecode { namespace Int { namespace Cumulative {
35
36 template<class Task>
38 subsumed(Space& home, Propagator& p, int c, TaskArray<Task>& t) {
39 Region r;
40
41 if (Event* e = Event::events(r,t)) {
42 // Process events, use ccur as the capacity that is still free
43 do {
44 // Current time
45 int time = e->time();
46 // Process events for completion of required part
47 for ( ; (e->type() == Event::LRT) && (e->time() == time); e++)
48 c += t[e->idx()].c();
49 // Process events for zero-length task
50 for ( ; (e->type() == Event::ZRO) && (e->time() == time); e++)
51 if (c < t[e->idx()].c())
52 return ES_FAILED;
53 // Process events for start of required part
54 for ( ; (e->type() == Event::ERT) && (e->time() == time); e++) {
55 c -= t[e->idx()].c();
56 if (c < 0)
57 return ES_FAILED;
58 }
59 } while (e->type() != Event::END);
60 } else {
61 return ES_OK;
62 }
63
64 return home.ES_SUBSUMED(p);
65 }
66
67}}}
68
69// STATISTICS: int-prop
Time-tabling event for task.
Definition task.hh:490
static Event * events(Region &r, const TaskArray< Task > &t, bool &assigned)
Allocate from r and initialize event array with tasks t.
Definition event.hpp:83
@ ZRO
Zero-length task start time.
Definition task.hh:497
@ ERT
Earliest required time of task.
Definition task.hh:498
@ LRT
Latest required time of task.
Definition task.hh:494
@ END
End marker.
Definition task.hh:499
Task array.
Definition task.hh:165
Base-class for propagators.
Definition core.hpp:1066
Handle to region.
Definition region.hpp:55
Computation spaces.
Definition core.hpp:1744
ExecStatus ES_SUBSUMED(Propagator &p)
Propagator p is subsumed
Definition core.hpp:3570
Scheduling for cumulative resources
ExecStatus subsumed(Space &home, Propagator &p, int c, TaskArray< Task > &t)
Check for subsumption (all tasks must be assigned)
Finite domain integers.
Gecode toplevel namespace
Post propagator for SetVar SetOpType SetVar SetRelType r
Definition set.hh:773
ExecStatus
Definition core.hpp:472
@ ES_OK
Execution is okay.
Definition core.hpp:476
@ ES_FAILED
Execution has resulted in failure.
Definition core.hpp:474
#define forceinline
Definition config.hpp:194