Skip to content

Commit 1b988a2

Browse files
committed
Merge branch 'codac2_dev' of github.com:codac-team/codac into codac2_dev
2 parents bd1ec88 + b2e688c commit 1b988a2

21 files changed

+565
-7
lines changed

python/src/core/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
contractors/codac2_py_Ctc.h
1414
contractors/codac2_py_CtcAction.cpp
1515
contractors/codac2_py_CtcCartProd.cpp
16+
contractors/codac2_py_CtcCtcBoundary.cpp
1617
contractors/codac2_py_CtcEmpty.cpp
1718
contractors/codac2_py_CtcFixpoint.cpp
1819
contractors/codac2_py_CtcInnerOuter.cpp
@@ -23,6 +24,7 @@
2324
contractors/codac2_py_CtcLazy.cpp
2425
contractors/codac2_py_CtcNot.cpp
2526
contractors/codac2_py_CtcPolar.cpp
27+
contractors/codac2_py_CtcPolygon.cpp
2628
contractors/codac2_py_CtcProj.cpp
2729
contractors/codac2_py_CtcSegment.cpp
2830
contractors/codac2_py_CtcUnion.cpp

python/src/core/codac2_py_core.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ void export_OctaSym(py::module& m);
3131
py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector> export_CtcIntervalVector(py::module& m/*, py::class_<Ctc,pyCtc>& py_ctc*/);
3232
void export_CtcAction(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
3333
void export_CtcCartProd(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
34+
void export_CtcCtcBoundary(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
3435
void export_CtcEmpty(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
3536
void export_CtcFixpoint(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
3637
void export_CtcIdentity(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
@@ -39,6 +40,7 @@ void export_CtcInter(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcInte
3940
void export_CtcLazy(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
4041
void export_CtcNot(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
4142
void export_CtcPolar(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
43+
void export_CtcPolygon(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
4244
void export_CtcProj(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
4345
void export_CtcSegment(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
4446
void export_CtcUnion(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& ctc);
@@ -123,6 +125,7 @@ PYBIND11_MODULE(_core, m)
123125
auto py_ctc_iv = export_CtcIntervalVector(m/*,py_ctc*/);
124126
export_CtcAction(m, py_ctc_iv);
125127
export_CtcCartProd(m, py_ctc_iv);
128+
export_CtcCtcBoundary(m, py_ctc_iv);
126129
export_CtcEmpty(m, py_ctc_iv);
127130
export_CtcFixpoint(m, py_ctc_iv);
128131
export_CtcIdentity(m, py_ctc_iv);
@@ -135,6 +138,7 @@ PYBIND11_MODULE(_core, m)
135138
export_CtcLazy(m, py_ctc_iv);
136139
export_CtcNot(m, py_ctc_iv);
137140
export_CtcPolar(m, py_ctc_iv);
141+
export_CtcPolygon(m, py_ctc_iv);
138142
export_CtcProj(m, py_ctc_iv);
139143
export_CtcSegment(m, py_ctc_iv);
140144
export_CtcUnion(m, py_ctc_iv);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Codac binding (core)
3+
* ----------------------------------------------------------------------------
4+
* \date 2024
5+
* \author Simon Rohou
6+
* \copyright Copyright 2024 Codac Team
7+
* \license GNU Lesser General Public License (LGPL)
8+
*/
9+
10+
#include <pybind11/pybind11.h>
11+
#include <pybind11/operators.h>
12+
#include <pybind11/functional.h>
13+
#include <pybind11/stl.h>
14+
#include <codac2_template_tools.h>
15+
#include <codac2_CtcCtcBoundary.h>
16+
#include "codac2_py_Ctc.h"
17+
#include "codac2_py_CtcCtcBoundary_docs.h" // Generated file from Doxygen XML (doxygen2docstring.py):
18+
19+
using namespace std;
20+
using namespace codac2;
21+
namespace py = pybind11;
22+
using namespace pybind11::literals;
23+
24+
void export_CtcCtcBoundary(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& pyctc)
25+
{
26+
py::class_<CtcCtcBoundary> exported(m, "CtcCtcBoundary", pyctc, CTCCTCBOUNDARY_MAIN);
27+
exported
28+
29+
.def(py::init(
30+
[](const CtcBase<IntervalVector>& ctc_boundary, const std::function<BoolInterval(const Vector&)>& inside_test)
31+
{
32+
return std::make_unique<CtcCtcBoundary>(ctc_boundary.copy(),inside_test);
33+
}),
34+
CTCCTCBOUNDARY_CTCCTCBOUNDARY_CONST_C_REF_CONST_FUNCTION_BOOLINTERVAL_CONST_VECTOR_REF__REF,
35+
"ctc_boundary"_a, "inside_test"_a)
36+
37+
.def(CONTRACT_BOX_METHOD(CtcCtcBoundary,
38+
VOID_CTCCTCBOUNDARY_CONTRACT_INTERVALVECTOR_REF_CONST))
39+
40+
;
41+
}

python/src/core/contractors/codac2_py_CtcInter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ void export_CtcInter(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcInte
2424
py::class_<CtcInter<IntervalVector>> exported(m, "CtcInter", pyctc, CTCINTER_MAIN);
2525
exported
2626

27+
.def(py::init<size_t>(),
28+
CTCINTER_X_CTCINTER_SIZET,
29+
"n"_a)
30+
2731
.def(py::init(
2832
[](const CtcBase<IntervalVector>& c)
2933
{
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* Codac binding (core)
3+
* ----------------------------------------------------------------------------
4+
* \date 2024
5+
* \author Simon Rohou
6+
* \copyright Copyright 2024 Codac Team
7+
* \license GNU Lesser General Public License (LGPL)
8+
*/
9+
10+
#include <pybind11/pybind11.h>
11+
#include <pybind11/operators.h>
12+
#include <pybind11/stl.h>
13+
#include <codac2_template_tools.h>
14+
#include <codac2_CtcPolygon.h>
15+
#include "codac2_py_Ctc.h"
16+
#include "codac2_py_CtcPolygon_docs.h" // Generated file from Doxygen XML (doxygen2docstring.py):
17+
18+
using namespace std;
19+
using namespace codac2;
20+
namespace py = pybind11;
21+
using namespace pybind11::literals;
22+
23+
void export_CtcPolygon(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcIntervalVector>& pyctc)
24+
{
25+
py::class_<CtcPolygon> exported(m, "CtcPolygon", pyctc, CTCPOLYGON_MAIN);
26+
exported
27+
28+
.def(py::init<const Polygon&>(),
29+
CTCPOLYGON_CTCPOLYGON_CONST_POLYGON_REF,
30+
"p"_a)
31+
32+
.def(CONTRACT_BOX_METHOD(CtcPolygon,
33+
VOID_CTCPOLYGON_CONTRACT_INTERVALVECTOR_REF_CONST))
34+
35+
;
36+
37+
py::implicitly_convertible<Polygon,CtcPolygon>();
38+
}

python/src/core/contractors/codac2_py_CtcUnion.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ void export_CtcUnion(py::module& m, py::class_<CtcBase<IntervalVector>,pyCtcInte
2424
py::class_<CtcUnion<IntervalVector>> exported(m, "CtcUnion", pyctc, CTCUNION_MAIN);
2525
exported
2626

27+
.def(py::init<size_t>(),
28+
CTCUNION_X_CTCUNION_SIZET,
29+
"n"_a)
30+
2731
.def(py::init(
2832
[](const CtcBase<IntervalVector>& c)
2933
{

src/core/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcAction.cpp
1616
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcAction.h
1717
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcCartProd.h
18+
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcCtcBoundary.cpp
19+
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcCtcBoundary.h
1820
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcDist.cpp
1921
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcDist.h
2022
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcEllipse.cpp
@@ -35,6 +37,8 @@
3537
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcUnion.h
3638
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcPolar.cpp
3739
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcPolar.h
40+
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcPolygon.cpp
41+
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcPolygon.h
3842
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcProj.cpp
3943
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcProj.h
4044
${CMAKE_CURRENT_SOURCE_DIR}/contractors/codac2_CtcSegment.cpp
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* codac2_CtcCtcBoundary.cpp
3+
* ----------------------------------------------------------------------------
4+
* \date 2024
5+
* \author Simon Rohou, Benoit Desrochers
6+
* \copyright Copyright 2024 Codac Team
7+
* \license GNU Lesser General Public License (LGPL)
8+
*/
9+
10+
#include "codac2_CtcCtcBoundary.h"
11+
12+
using namespace std;
13+
using namespace codac2;
14+
15+
void CtcCtcBoundary::contract(IntervalVector& x) const
16+
{
17+
assert_release(x.size() == this->size());
18+
19+
size_t attempt_nb = 5;
20+
IntervalVector prev_x(x);
21+
_ctc_boundary.front().contract(x);
22+
23+
for(const auto& b : prev_x.diff(x,false))
24+
{
25+
if(b.is_empty())
26+
continue;
27+
28+
Vector m = b.mid(); // first try: midpoint of the box
29+
BoolInterval d;
30+
size_t k = 0;
31+
32+
do
33+
{
34+
d = _inside_test(m);
35+
if(d == BoolInterval::UNKNOWN)
36+
m = b.rand(); // now, trying a random vector in the box
37+
} while(d == BoolInterval::UNKNOWN && k++ < attempt_nb);
38+
39+
switch(d)
40+
{
41+
case BoolInterval::TRUE:
42+
case BoolInterval::UNKNOWN:
43+
x |= b;
44+
break;
45+
case BoolInterval::FALSE:
46+
break;
47+
case BoolInterval::EMPTY:
48+
assert(false && "BoolInterval::EMPTY should not happen");
49+
break;
50+
}
51+
}
52+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* \file codac2_CtcCtcBoundary.h
3+
* ----------------------------------------------------------------------------
4+
* \date 2024
5+
* \author Simon Rohou, Benoit Desrochers
6+
* \copyright Copyright 2024 Codac Team
7+
* \license GNU Lesser General Public License (LGPL)
8+
*/
9+
10+
#pragma once
11+
12+
#include <functional>
13+
#include "codac2_Ctc.h"
14+
#include "codac2_IntervalVector.h"
15+
#include "codac2_Collection.h"
16+
#include "codac2_BoolInterval.h"
17+
#include "codac2_template_tools.h"
18+
19+
namespace codac2
20+
{
21+
class CtcCtcBoundary : public Ctc<CtcCtcBoundary,IntervalVector>
22+
{
23+
public:
24+
25+
template<typename C>
26+
requires IsCtcBaseOrPtr<C,IntervalVector>
27+
CtcCtcBoundary(const C& ctc_boundary, const std::function<BoolInterval(const Vector&)>& inside_test)
28+
: Ctc<CtcCtcBoundary,IntervalVector>(size_of(ctc_boundary)), _ctc_boundary(ctc_boundary), _inside_test(inside_test)
29+
{ }
30+
31+
void contract(IntervalVector& x) const;
32+
33+
protected:
34+
35+
const Collection<CtcBase<IntervalVector>> _ctc_boundary;
36+
const std::function<BoolInterval(const Vector&)> _inside_test;
37+
};
38+
}

src/core/contractors/codac2_CtcInter.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ namespace codac2
2121
{
2222
public:
2323

24+
explicit CtcInter(size_t n)
25+
: Ctc<CtcInter<X>,X>(n)
26+
{
27+
if constexpr(std::is_same_v<X,Interval>)
28+
{
29+
assert(n == 1);
30+
}
31+
}
32+
2433
template<typename C>
2534
requires (IsCtcBaseOrPtr<C,X> && !std::is_same_v<CtcInter<X>,C>)
2635
CtcInter(const C& c)

0 commit comments

Comments
 (0)