LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
CompoundsCompatibilityBuilder.cpp
Go to the documentation of this file.
1// Copyright 2002-2022 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
8
9#include <iostream>
10#include <algorithm>
11
12namespace Lima
13{
14namespace LinguisticProcessing
15{
16namespace Compounds
17{
18
22
24 std::map< uint64_t, std::set< uint64_t > >& exclusions,
25 std::map< uint64_t, bool >& sizes,
26 std::vector< uint64_t >& order)
27{
28 std::vector< std::set< uint64_t > > searchspace;
29 searchspace = buildSearchSpace(exclusions, order);
30
31 std::set< std::set< uint64_t >, SizeSorter > cleanedSearchSpace;
32 cleanedSearchSpace = removeVertexEntriesFromSearchSpace(searchspace, sizes);
33
34 std::list< std::set< uint64_t > > result;
35 result = removeIncludedVector(cleanedSearchSpace);
36
37// displayResult(result);
38 return result;
39}
40
42 std::map< uint64_t, std::set< uint64_t > >& exclusions,
43 std::map< uint64_t, bool >& sizes,
44 std::vector< uint64_t >& order)
45{
46/*
47 Critical Function : comment logging messages
48*/
49// COMPOUNDSLOGINIT;
50// LDEBUG << "Exclusions size = " << exclusions.size();
51 std::map< uint64_t, std::set< uint64_t > >::const_iterator it, it_end;
52 it = exclusions.begin(); it_end = exclusions.end();
53 std::set< uint64_t > soleResult;
54 for (; it != it_end; it++)
55 {
56 soleResult.insert((*it).first);
57 }
58 std::vector< std::set< uint64_t > > searchspace;
59// LDEBUG << "Building search space";
60 searchspace = buildSearchSpace(exclusions, order);
61 // searchspace.push_back(soleResult);
62
63// LDEBUG << "Removing vertices from search space";
64 std::set< std::set< uint64_t >, SizeSorter > cleanedSearchSpace;
65 cleanedSearchSpace = removeVertexEntriesFromSearchSpace(searchspace, sizes);
66
67// LDEBUG << "Removing included from search space";
68 std::list< std::set< uint64_t > > result;
69 result = removeIncludedVector(cleanedSearchSpace);
70
71// displayResult(result);
72 return result;
73}
74
75std::vector< std::set< uint64_t > > CompoundsCompatibilityBuilder::buildSearchSpace(
76 std::map< uint64_t, std::set< uint64_t > >& exclusions,
77 const std::vector< uint64_t >& order)
78{
79/*
80 Critical Function : comment logging messages
81*/
82// COMPOUNDSLOGINIT;
83 std::vector< std::set< uint64_t > > searchspace;
84 std::vector< uint64_t >::const_iterator itOrder, itOrder_end;
85 itOrder = order.begin(); itOrder_end = order.end();
86 for(; itOrder != itOrder_end; itOrder++)
87 {
88 uint64_t el = *itOrder;
89// if (logger.isDebugEnabled()) {
90// std::ostringstream oss;
91// oss << "Working on element " << el << " / (" << exclusions[el] << ")";
92// LDEBUG << oss.str();
93// }
94 const std::set< uint64_t >& localexclusions = exclusions[el];
95 std::vector< std::set< uint64_t > > newsearchspace;
96
97 std::vector< std::set< uint64_t > >::const_iterator sSpaceIt, sSpaceIt_end;
98 sSpaceIt = searchspace.begin(); sSpaceIt_end = searchspace.end();
99 for (; sSpaceIt != sSpaceIt_end; sSpaceIt++)
100 {
101 const std::set< uint64_t >& subansw = *sSpaceIt;
102 bool toinclude = true;
103 std::set< uint64_t >::const_iterator exIt, exIt_end;
104 exIt = localexclusions.begin(); exIt_end = localexclusions.end();
105 for(; exIt != exIt_end; exIt++)
106 {
107 uint64_t ex = *exIt;
108// if (logger.isDebugEnabled()) {
109// std::ostringstream oss;
110// oss << "testing " << el << " / " << ex << " on (" << subansw << ")";
111// LDEBUG << oss.str();
112// }
113 if (subansw.find(ex) != subansw.end())
114 {
115// LDEBUG << "Subanswer cannot include "<<el;
116 toinclude = false;
117 break;
118 }
119 }
120 if (toinclude)
121 {
122// LDEBUG << "Subanswer can include " << el;
123 std::set< uint64_t > newsubansw = subansw;
124 newsubansw.insert(el);
125 newsearchspace.push_back(newsubansw);
126 }
127 else
128 {
129 newsearchspace.push_back(subansw);
130 }
131 }
132 if (!newsearchspace.empty())
133 {
134 searchspace = newsearchspace;
135/* std::vector< std::set< uint64_t > >::const_iterator nssit, nssit_end;
136 nssit = newsearchspace.begin(); nssit_end = newsearchspace.end();
137 for(; nssit != nssit_end; nssit++)
138 {
139 searchspace.push_back(*nssit);
140 }*/
141 }
142/* if (!exclusions[el].empty())
143 {*/
144 std::set< uint64_t > elarray;
145 elarray.insert(el);
146 searchspace.push_back(elarray);
147/* }*/
148 }
149 return searchspace;
150}
151
152std::set< std::set< uint64_t >, CompoundsCompatibilityBuilder::SizeSorter > CompoundsCompatibilityBuilder::removeVertexEntriesFromSearchSpace(
153 const std::vector< std::set< uint64_t > >& searchspace,
154 std::map< uint64_t, bool >& sizes)
155{
156/*
157 Critical Function : comment logging messages
158*/
159// COMPOUNDSLOGINIT;
160 std::set< std::set< uint64_t >, SizeSorter > newsearchspace;
161 std::vector< std::set< uint64_t > >::const_iterator searchSpaceIt, searchSpaceIt_end;
162 searchSpaceIt = searchspace.begin(); searchSpaceIt_end = searchspace.end();
163// std::ostringstream oss;
164 for (; searchSpaceIt != searchSpaceIt_end; searchSpaceIt++)
165 {
166 const std::set< uint64_t >& searchspaceelem = *searchSpaceIt;
167// if (logger.isDebugEnabled()) {
168// oss << "Cleaning " << searchspaceelem;
169// LDEBUG << oss.str();
170// }
171 std::set< uint64_t > newelem;
172 std::set< uint64_t >::const_iterator elemIt, elemIt_end;
173 elemIt = searchspaceelem.begin(); elemIt_end = searchspaceelem.end();
174 for (; elemIt != elemIt_end; elemIt++)
175 {
176 if (sizes[*elemIt])
177 {
178 newelem.insert(*elemIt);
179 }
180 }
181
182 if (!newelem.empty())
183 {
184// if (logger.isDebugEnabled()) {
185// oss.clear();
186// oss << "Adding " << newelem << " to newsearchspace";
187// LDEBUG << oss.str();
188// }
189 newsearchspace.insert(newelem);
190 }
191// else
192// {
193// LDEBUG << "New elem empty";
194// }
195 }
196 return newsearchspace;
197}
198
199
200std::list< std::set< uint64_t > > CompoundsCompatibilityBuilder::removeIncludedVector(
201 const std::set< std::set< uint64_t >, CompoundsCompatibilityBuilder::SizeSorter >& searchSpace)
202{
203 std::list< std::set< uint64_t > > result;
204 std::set< std::set< uint64_t >, SizeSorter >::const_iterator searchSpaceIt, searchSpaceIt_end;
205 searchSpaceIt = searchSpace.begin(); searchSpaceIt_end = searchSpace.end();
206 for (; searchSpaceIt != searchSpaceIt_end; searchSpaceIt++)
207 {
208 const std::set< uint64_t >& searchspaceelem = *searchSpaceIt;
209 bool found = false;
210 std::list< std::set< uint64_t > >::const_iterator resit, resit_end;
211 resit = result.begin(); resit_end = result.end();
212 for (; resit != resit_end; resit++)
213 {
214 const std::set< uint64_t >& res = *resit;
215 std::set< uint64_t > intersec;
216 std::insert_iterator< std::set< uint64_t > > ins(intersec, intersec.end());
217 std::set_difference(searchspaceelem.begin(), searchspaceelem.end(),
218 res.begin(), res.end(), ins );
219
220 if (intersec.empty()){ found = true; break; }
221 }
222 if (!found)
223 {
224 result.push_back(searchspaceelem);
225 }
226 }
227 return result;
228}
229
230
231void CompoundsCompatibilityBuilder::displayResult(const std::list< std::set< uint64_t > >& searchSpace)
232{
233 std::cerr << "Displaying " << searchSpace.size() << " results" << std::endl;
234 std::list< std::set< uint64_t > >::const_iterator it, it_end;
235 it = searchSpace.begin(); it_end = searchSpace.end();
236
237 for (;it != it_end; it++)
238 {
239 std::cerr << *it << std::endl;
240 }
241}
242
243std::ostream& operator<<(std::ostream& os, const std::set< uint64_t >& subres)
244{
245 std::set< uint64_t >::const_iterator it, it_end;
246 it= subres.begin(); it_end = subres.end();
247 if (it != it_end)
248 {
249 os << *it++;
250 }
251 for (; it != it_end; it++)
252 {
253 os << ", " << *it;
254 }
255 return os;
256}
257
258std::ostream& operator<<(std::ostream& os, const std::vector< uint64_t >& subres)
259{
260 std::vector< uint64_t >::const_iterator it, it_end;
261 it= subres.begin(); it_end = subres.end();
262 if (it != it_end)
263 {
264 os << *it++;
265 }
266 for (; it != it_end; it++)
267 {
268 os << ", " << *it;
269 }
270 return os;
271}
272
273} // SyntacticAnalysis
274} // LinguisticProcessing
275} // Lima
276
std::list< std::set< uint64_t > > computeCompatibilitiesWithChain(std::map< uint64_t, std::set< uint64_t > > &exclusions, std::map< uint64_t, bool > &sizes, std::vector< uint64_t > &order)
void displayResult(const std::list< std::set< uint64_t > > &searchSpace)
std::list< std::set< uint64_t > > computeCompatibilities(std::map< uint64_t, std::set< uint64_t > > &exclusions, std::map< uint64_t, bool > &sizes, std::vector< uint64_t > &order)
std::ostream & operator<<(std::ostream &os, const std::set< uint64_t > &subres)
NAUTITIA.