├── .gitignore
├── .ipynb_checkpoints
└── example-checkpoint.ipynb
├── LICENSE
├── README.md
├── examples
├── example.ipynb
└── example_files
│ ├── example_1_0.png
│ ├── example_3_0.png
│ ├── example_3_1.png
│ ├── example_3_2.png
│ ├── example_3_3.png
│ ├── example_3_4.png
│ └── example_3_5.png
├── pyproject.toml
├── requirements.txt
└── src
├── __init__.py
├── __pycache__
└── __init__.cpython-39.pyc
├── constrained_diffusion.egg-info
├── PKG-INFO
├── SOURCES.txt
├── dependency_links.txt
├── requires.txt
└── top_level.txt
├── constrained_diffusion.py
└── tests
├── __init__.py
└── test_constrained_diffusion_decomposition.py
/.gitignore:
--------------------------------------------------------------------------------
1 | .gitignore
2 | /dist
3 | run.sh
4 | :
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Constrained diffusion decomposition: A new PDE-based image decomposition method
4 |
5 |
6 | # General Design
7 | A natural image often contains components of different scales.
8 |
9 | This project decomposition to numpy.ndarray data, decomposing it into scale components, or scales, 1, 2, 4, 8, 16, ... pixels, enabling multi-scale analysis.
10 |
11 | The code is based on
12 | Li 2022, Multi-Scale Decomposition of Astronomical Maps -- Constrained Diffusion Method .
13 |
14 |
15 | Assuuming an input of I(x, y), the decomposition is achieved by solving the equation
16 |
17 | ```math
18 | \frac{\partial I_t }{\partial t} ={\rm sgn}(I_t) \mathcal{H}({- \rm sgn}(I_t) \nabla^2 I_t) \nabla^2 I_t ;,
19 | ```
20 | where t is related to the scale l by t = l**2.
21 |
22 |
23 |
24 |
25 | # Installation
26 |
27 |
28 | 1. Use git clone
29 | ```bash
30 | git clone https://github.com/gxli/Constrained-Diffusion-Decomposition.git
31 | cd constrained_diffusion
32 | pip install .
33 | ```
34 |
35 | 2. Use pip
36 |
37 | ```bash
38 | pip install --upgrade scipy numpy
39 | pip install -i https://test.pypi.org/simple/ constrained-diffusion==1.0.1
40 | ```
41 | https://test.pypi.org/project/constrained-diffusion/1.0.1/
42 |
43 |
44 | # Usage:
45 |
46 | ### Input:
47 |
48 | numpy nd array, of shape e.g. (nx, ny, nz)
49 |
50 | ### Output:
51 |
52 | result: numpy nd array, of shape (m, nx, ny, nz). The mth commponent contain structures of sizes 2$^(m-1)$ to 2$^m$ pixels. residual: numpy nd array, of shape (nx, ny, nz) the input data will be recovered as input = sum_i result[i] + residual
53 |
54 |
55 |
56 | ```python
57 | import constrained_diffusion as cdd
58 |
59 | result, residual = cdd.constrained_diffusion_decomposition(data)
60 | ```
61 |
62 |
63 |
64 |
65 | # Example
66 |
67 | ```python
68 | import matplotlib.pyplot as plt
69 | from matplotlib import cm
70 | import numpy as np
71 | from astropy.io import fits
72 | from constrained_diffusion import constrained_diffusion_decomposition
73 |
74 | def multivariate_gaussian(pos, mu, Sigma):
75 | """Return the multivariate Gaussian distribution on array pos.
76 |
77 | pos is an array constructed by packing the meshed arrays of variables
78 | x_1, x_2, x_3, ..., x_k into its _last_ dimension.
79 |
80 | """
81 |
82 | n = mu.shape[0]
83 | Sigma_det = np.linalg.det(Sigma)
84 | Sigma_inv = np.linalg.inv(Sigma)
85 | N = np.sqrt((2*np.pi)**n * Sigma_det)
86 |
87 | fac = np.einsum('...k,kl,...l->...', pos-mu, Sigma_inv, pos-mu)
88 |
89 | return np.exp(-fac / 2) / N
90 | ```
91 |
92 |
93 | ```python
94 | # Preparing sample input
95 | N_x = 300
96 | N_y = 200
97 | X = np.linspace(0, 300, N_x)
98 | Y = np.linspace(0, 200, N_y)
99 | X, Y = np.meshgrid(X, Y)
100 |
101 | mu = np.array([150., 100.])
102 | Sigma = np.array([[200, 0], [0, 200]])
103 |
104 | pos = np.empty(X.shape + (2,))
105 | pos[:, :, 0] = X
106 | pos[:, :, 1] = Y
107 |
108 |
109 | Z1 = multivariate_gaussian(pos, mu, Sigma) * 100
110 | Z3 = multivariate_gaussian(pos, mu - 10 , Sigma * 0.03) * 3
111 |
112 | Z = Z1 + Z3
113 |
114 | plt.figure()
115 | plt.imshow(Z)
116 | plt.colorbar()
117 | plt.show()
118 | ```
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 | ```python
128 | # performing decomposition
129 | result, residual = constrained_diffusion_decomposition(Z)
130 | ```
131 |
132 | ntot 6
133 | i = 0
134 | kernel_size 0.31622776601683794
135 | i = 1
136 | kernel_size 0.34641016151377546
137 | i = 2
138 | kernel_size 0.6928203230275509
139 | i = 3
140 | kernel_size 1.3856406460551018
141 | i = 4
142 | kernel_size 2.7712812921102037
143 | i = 5
144 | kernel_size 5.542562584220407
145 |
146 |
147 |
148 | ```python
149 | # visualizing results
150 | from pylab import *
151 | for i in result:
152 | figure()
153 | imshow(i)
154 | colorbar()
155 | ```
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 | ## License
181 | See the [LICENSE](LICENSE) file for details.
182 |
183 |
--------------------------------------------------------------------------------
/examples/example.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import matplotlib.pyplot as plt\n",
10 | "from matplotlib import cm\n",
11 | "import numpy as np\n",
12 | "from astropy.io import fits\n",
13 | "from constrained_diffusion import constrained_diffusion_decomposition\n",
14 | "\n",
15 | "def multivariate_gaussian(pos, mu, Sigma):\n",
16 | " \"\"\"Return the multivariate Gaussian distribution on array pos.\n",
17 | "\n",
18 | " pos is an array constructed by packing the meshed arrays of variables\n",
19 | " x_1, x_2, x_3, ..., x_k into its _last_ dimension.\n",
20 | "\n",
21 | " \"\"\"\n",
22 | "\n",
23 | " n = mu.shape[0]\n",
24 | " Sigma_det = np.linalg.det(Sigma)\n",
25 | " Sigma_inv = np.linalg.inv(Sigma)\n",
26 | " N = np.sqrt((2*np.pi)**n * Sigma_det)\n",
27 | "\n",
28 | " fac = np.einsum('...k,kl,...l->...', pos-mu, Sigma_inv, pos-mu)\n",
29 | "\n",
30 | " return np.exp(-fac / 2) / N"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 2,
36 | "metadata": {},
37 | "outputs": [
38 | {
39 | "data": {
40 | "image/png": "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",
41 | "text/plain": [
42 | ""
43 | ]
44 | },
45 | "metadata": {
46 | "needs_background": "light"
47 | },
48 | "output_type": "display_data"
49 | }
50 | ],
51 | "source": [
52 | "# Preparing sample input\n",
53 | "N_x = 300\n",
54 | "N_y = 200\n",
55 | "X = np.linspace(0, 300, N_x)\n",
56 | "Y = np.linspace(0, 200, N_y)\n",
57 | "X, Y = np.meshgrid(X, Y)\n",
58 | "\n",
59 | "mu = np.array([150., 100.])\n",
60 | "Sigma = np.array([[200, 0], [0, 200]])\n",
61 | "\n",
62 | "pos = np.empty(X.shape + (2,))\n",
63 | "pos[:, :, 0] = X\n",
64 | "pos[:, :, 1] = Y\n",
65 | "\n",
66 | "\n",
67 | "Z1 = multivariate_gaussian(pos, mu, Sigma) * 100\n",
68 | "Z3 = multivariate_gaussian(pos, mu - 10 , Sigma * 0.03) * 3\n",
69 | "\n",
70 | "Z = Z1 + Z3\n",
71 | "\n",
72 | "plt.figure()\n",
73 | "plt.imshow(Z)\n",
74 | "plt.colorbar()\n",
75 | "plt.show()"
76 | ]
77 | },
78 | {
79 | "cell_type": "code",
80 | "execution_count": 3,
81 | "metadata": {},
82 | "outputs": [
83 | {
84 | "name": "stdout",
85 | "output_type": "stream",
86 | "text": [
87 | "total number of scales 6\n",
88 | "current channel 0 current scale 1\n",
89 | "current channel 1 current scale 2\n",
90 | "current channel 2 current scale 4\n",
91 | "current channel 3 current scale 8\n",
92 | "current channel 4 current scale 16\n",
93 | "current channel 5 current scale 32\n"
94 | ]
95 | }
96 | ],
97 | "source": [
98 | "# performing decomposition\n",
99 | "result, residual = constrained_diffusion_decomposition(Z)"
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "execution_count": 4,
105 | "metadata": {},
106 | "outputs": [
107 | {
108 | "data": {
109 | "image/png": "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",
110 | "text/plain": [
111 | ""
112 | ]
113 | },
114 | "metadata": {
115 | "needs_background": "light"
116 | },
117 | "output_type": "display_data"
118 | },
119 | {
120 | "data": {
121 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAADtCAYAAABNoZUVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAboklEQVR4nO3df6xc5X3n8ffn3ms7DWDAP3AdIDUBUwXSrRu8BG2TLCkb4qBuTXaB2IoCzaI4UbGUartakaxCItRIzW4pUhRCZRYvP5TwY6EUK+uG8CNbNqtCbScWYH6UawLCrrFj4wUTgvG9890/zjPXx3Nn7px7Z+bOnJnPS3p0Z54558zXo/H3Pvc5zw9FBGZmVm5D3Q7AzMxa52RuZtYHnMzNzPqAk7mZWR9wMjcz6wMj3Q7AzGy2feoTx8WB18cLHbvtqcMPRcSqDofUMidzMxs4+18f58mHTit07JylOxd1OJy2cDI3swEUjEel20G0lZO5mQ2cACr014RJJ3MzG0gV3DI3Myu1IDjibhYzs3ILYNzdLGZm5ec+czOzkgtgvM9WjHUyN7OB1F895k7mZjaAgnCfuZlZ2UXAkf7K5U7mZjaIxDjqdhBt5WRuZgMngIpb5mZm5eeWuZlZyWWThpzMzcxKLYAj0V9783TsXyNplaQXJI1KurZT72NmNl2BGGeoUCmLjrTMJQ0DNwGfBHYBWyRtiohnO/F+ZmbTVYn+6mbp1K+d84HRiHgpIt4F7gZWd+i9zMympdpnXqSURaf6zE8FXs093wV8JH+ApHXAOoBhhs97L/M7FIqZ9ZNDHNwfEYtbu4oY77M+867dAI2IDcAGgPlaEB/RRd0KxcxK5JG475VWr5HtNORkXsRu4PTc89NSnZlZ10WId2O422G0Vad+NW0Blks6Q9JcYA2wqUPvZWY2bRVUqJRFR1rmETEmaT3wEDAMbIyIHZ14LzOz6cpugPZXN0vH/jURsTkizo6IMyPiW516HzOz6ctugBYpTa/UZE6NpHmS7kmvPylpWar/pKRtkp5OP/8gd855qX5U0nckNf0Tob9+NZmZFVC9AVqkTCU3p+bTwDnAWknn1Bx2NXAwIs4CbgS+ner3A/82In4HuAq4M3fOzcAXgeWprGr2b3IyN7OBNB4qVJooMqdmNXB7enwfcJEkRcTPI+KfU/0O4DdSK34pMD8inoiIAO4ALm0WiNdmMbOBE4gjUTj9LZK0Nfd8QxpaDQXm1OSPSfcT3wAWkrXMq/498LOIOCzp1HSd/DVPbRakk7mZDZxp3gDdHxErOxWLpHPJul4ubuU6TuZmNnCCQl0oRRSZU1M9ZpekEeBE4ACApNOAB4ArI2Jn7vjTmlxzEveZm9lAascNUIrNqdlEdoMT4DLgsYgISScB/wu4NiL+b/XgiNgDvCnpgjSK5UrgwWaBOJmb2cCJoC1DEyNiDKjOqXkOuDcidki6XtIfpcNuBRZKGgX+I1AdvrgeOAu4TtL2VE5Jr/0J8N+BUWAn8HfN/k3uZjGzgZPdAG3PdP6I2Axsrqm7Lvf4HeDyOuf9OfDnDa65FfjQdOJwMjezgdRvM0CdzM1s4ATqu80pnMzNbCC5ZW5mVnIBVLw5hZlZ2ZVrS7giZvyrSdLpkn4i6VlJOyR9JdV/U9Lu3FCbS9oXrplZ6wI4EsOFSlm00jIfA/4sIn4m6QRgm6SH02s3RsRfth6emVn7RcjdLFVpltKe9PiQpOcosBiMmVkv6LcNndvyr0mLrf8e8GSqWi/pKUkbJZ3cjvcwM2uXbD3z/to2ruVkLul44H7gTyPiTbJF1c8EVpC13G9ocN46SVslbT3C4VbDMDObhvbtNNQrWhrNImkOWSL/fkT8DUBE7M29fgvww3rnpvWANwDM14JoJQ4zs+nIhiaWp9VdxIyTeVrN61bguYj4q1z90tSfDvAZ4JnWQjQza692rs3SK1ppmf8+8HngaUnbU93XyPbAW0H2y+9l4EstvIeZWUcUWN62VFoZzfJTqHt3YHOdOjOznpEtgetuFjOz0nOfuZlZyWWrJrqbxcys1LLp/E7mZmYl55a5mVlfKNPsziKczM1s4Hg0i5lZn3A3i5lZyXkPUDOzPhDAmFvmZmbl524WM7OyC3ezmJmVXnVzin7iZG5mA8ktczOzkvPmFHVIehk4BIwDYxGxUtIC4B5gGdma5ldExMFW38vMrB0CMVbprxug7frXfCIiVkTEyvT8WuDRiFgOPJqem5n1DG/oXMxq4Pb0+Hbg0g69j5nZ9EXWzVKklEU7knkAP5a0TdK6VLcktw/oa8CS2pMkrZO0VdLWIxxuQxhmZsVU+8z7KZm34wboRyNit6RTgIclPZ9/MSJCUtSeFBEbgA0A87Vg0utmZp1UpkRdRMvJPCJ2p5/7JD0AnA/slbQ0IvZIWgrsa/V9zMzaJRDjvgF6lKTjJJ1QfQxcDDwDbAKuSoddBTzYyvuYmbVbv90AbbVlvgR4QFL1Wj+IiB9J2gLcK+lq4BXgihbfx8ysbSLczXKMiHgJ+N069QeAi1q5tplZJ4WTuZlZ2ZVrpEoR/XUHwMysoAgVKs1IWiXpBUmjkiZNkJQ0T9I96fUnJS1L9Qsl/UTSW5K+W3PO/07X3J7KKc3icMvczAZOBIxXWm+ZSxoGbgI+CewCtkjaFBHP5g67GjgYEWdJWgN8G/gs8A7wdeBDqdT6XERsLRqLW+ZmNpDaNJrlfGA0Il6KiHeBu8lmwOflZ8TfB1wkSRHxq4j4KVlSb5mTuZkNnKBt3SynAq/mnu9KdXWPiYgx4A1gYYEw/0fqYvm60pDBqTiZm9kAKjaVP90kXVRdeiSVdc2u3gafi4jfAT6WyuebneA+czMbSFF8EZH9uRVha+0GTs89Py3V1Ttml6QR4ETgwNSxTcysPyTpB2TdOXdMdY5b5mY2kNrUzbIFWC7pDElzgTVkM+Dz8jPiLwMei2j8q0TSiKRF6fEc4A/JZtZPyS1zMxs42WiW1tuyETEmaT3wEDAMbIyIHZKuB7ZGxCbgVuBOSaPA62QJH5jY3Gc+MFfSpWRLorwCPJQS+TDwCHBLs1iczM1sIE2jm6XJdWIzsLmm7rrc43eAyxucu6zBZc+bbhxO5mY2kDyd38ys5IJiszvLxMnczAZSv+2IM+NkLum3gXtyVR8ArgNOAr4I/DLVfy31KZmZ9YaAaMN0/l4y42QeES8AK2BifYLdwAPAF4AbI+Iv2xGgmVknuJulvouAnRHxSoFZp2ZmXdeu0Sy9ol2ThtYAd+Wer5f0lKSNkk6ud4KkddXpsUc43KYwzMyaa+PaLD2j5WSeZj39EfA/U9XNwJlkXTB7gBvqnRcRGyJiZUSsnMO8VsMwMysugFCxUhLt6Gb5NPCziNgLUP0JIOkW4IdteA8zs7bqt26WdiTzteS6WCQtjYg96elnKLCmgJnZ7JJHs+RJOo5sh40v5ar/q6QVZH/IvFzzmplZb3DL/KiI+BU1i6xHRNN1d82aqh0V1W9/E1t3hYcmmnVeveGt+TondmuHPvsaOZlbb1KDgVZROZrYndStJW6Zm80KDR37ny0qcTTJO6lbqyrdDqC9nMxt1mhkhOHfXML4kpNgaIjh/W9S2bOXyjuTNyefSOS5FrqGjv7vi0pNUndCt+mojjPvI07mNis0MsLQmcvYf/5i/t/ZECNwwi+OZ/G24xnasbNuQkdDkG+d5xK4hnS0pe6EbjPQb18XJ3ObFUMnzuetDy5g30fHuOxfbuXkkbe5bccFDB+ez+K9C6nsqtkDNyXy6lo/EXE0saekrqGKE7rNXJ99VZzMbVZo7lx+vWCY9/3WXr6y6P+weHgez7z/fTy9+IPEe99Tc3BK1hIMpceVXBfLEJCSuBO6zZi7WcymL44cYe6hCq/98kQefOuDLB55k+f2L2Hum4HePTL5hKGUyKs3OVNSp1JB0tQJ3awA9dnvfCdzmxWVQ28x/8VDvP0PJ3HDG5cQI8HxO0f4zed+TeXAwaMHSmh4GA0PZ4k8l8SBY1rqdRN6uoZb5zalEHg6v9n0xeHD6J9eZunhU1nw/HxiCOb98hB65Z8ZP3To6IHVm54pkUtK/eW5pJ6eH5PQ8+e7dW5F9NnveydzmzWVt9+G50eZ8+IwaIjK2JFjW9D5VnlK5Fl1/ibo0NGEXjUkqLh1btPUZ18PJ3ObXRHE2NjkegmNzEFzRmB4GA1PngGqSkro6fiJ1rmTts1En31tnMyt+xol8vxsz4lDRVRb5w2v564Wa6IPJw0V2mkobf+2T9IzuboFkh6W9GL6eXKql6TvSBpNW8d9uFPBW8lJMDQ8OZFr6Ni1WaqPh5r859PQpCUAzBpRFCtlUXTbuNuAVTV11wKPRsRy4NH0HLKdh5anso5sGzkbRNLRMjQ8UTQyksochubWSeRV+cRcu/BWddhitW/dSdymKwqWkiiUzCPiceD1murVwO3p8e3Apbn6OyLzBHCSpKVtiNXKKLWyNaSsDA9niXtkZCKJMzw8cZNzgpOzddigtszrWZLbHu41YEl6fCrwau64XanOBl1+ir5b1tZt3tB5sogIaXq/wyStI+uG4T28tx1hWI+aUT92pebrVHtDszo8sTqapRK+6WnFlawLpYhWWuZ7q90n6ee+VL8bOD133Gmp7hgRsSEiVkbEyjnMayEM63VRm5jrqR5TLyFX6wpcp9B7mcFg9pk3sAm4Kj2+CngwV39lGtVyAfBGrjvGBk2z1nK9ceJRObbkX0qt8Zbe04xs3kKRUhaFulkk3QVcCCyStAv4BvAXwL2SrgZeAa5Ih28GLgFGgbeBL7Q5Ziu5iMhWQcwtpJXVpQNqu2VSa/uYpJ/vYjGbiT776hRK5hGxtsFLF9U5NoBrWgnK+kTE0WRdiWynoErNhhPVlvbQUJbQpbrdKRNJu3YqP0z0lx/TxeIkb1Mo20iVIjwD1DovKseOE68EMcTR1nmu6ySGGvT8VbtWckl94sZn7XuZFVGikSpFOJlbZ9VrnWvo2IQOk5e6rXed3OvHJHK3ym0m+uxr4mRusyO1zusmdGnSeuWT5HcaapTI3Sq3aXA3i9l0VVvnUyR0qEnqdS9TbZ1PkcjdKrciolwjVYpwMrfZ0Sihw8QGzdFsoGxN4nYit5b02dellXHmZtMTUyTjqGTJeqqSG3fuRG4ta9OkIUmrJL2QVoq9ts7r8yTdk15/UtKyVL9Q0k8kvSXpuzXnnCfp6XTOdzRp8aLJnMxtdsWxCTwqMVEmTRaqKXWPzV/TbBrasdCWpGHgJrLVYs8B1ko6p+awq4GDEXEWcCPw7VT/DvB14D/VufTNwBc5ugJt7aq1kziZ2+yLmJTUs4cxZak9/pjrmHXH+cBoRLwUEe8Cd5OtHJuXX2H2PuAiSYqIX0XET8mS+oS0PMr8iHgizdu5g6Or0jbkZG7dUy+pNyu155nNVPFulkWStubKutxViqwSO3FMRIwBbwALp4js1HSdqa45iW+AWvfVbOrc9BizVk1vNMv+iFjZwWjawi1z6y3VVndtMWu39twALbJK7MQxkkaAE4EDTa55WpNrTuJkbmYDR7Rtp6EtwHJJZ0iaC6whWzk2L7/C7GXAYzHFCnFpldk3JV2QRrFcydFVaRtyN4uZDaY2/MEXEWOS1gMPAcPAxojYIel6YGtEbAJuBe6UNEq2/eaa6vmSXgbmA3MlXQpcHBHPAn9CtvfybwB/l8qUnMzNbPC0cdXEiNhMtvR3vu663ON3gMsbnLusQf1W4EPTiaNpN4ukjZL2SXomV/ffJD0v6SlJD0g6KdUvk/RrSdtT+evpBGNmNmsqBUtJFOkzv43JA9YfBj4UEf8C+Cfgq7nXdkbEilS+3J4wzczaq0195j2jaTKPiMfJ+nnydT9O4yUBnuDYO69mZr2vTdP5e0U7RrP8B47tnD9D0s8l/b2kjzU6SdK66iD8IxxuQxhmZgUVTeQlSuYt3QCV9F+AMeD7qWoP8P6IOCDpPOBvJZ0bEW/WnhsRG4ANAPO1oEQfmZn1gzJ1oRQx45a5pD8G/hD4XHXMZEQcjogD6fE2YCdwdhviNDNrL7fMsyUfgf8M/OuIeDtXvxh4PSLGJX2AbLWvl9oSqZlZGw3c5hSS7gIuJFtsZhfwDbLRK/OAh9Myu0+kkSsfB66XdIRsUM+XI+L1uhc2M+uWkrW6i2iazCNibZ3qWxscez9wf6tBmZl1klLpJ54BamaDadBa5mZm/ajfRrM4mZvZYHIyNzMrueltTlEKTuZmNpjcMjczKz/3mZuZ9QMnczOz8nPL3Mys7IJSbTxRhJO5mQ2c6obO/cTJ3MwGk5O5mVn5KformzuZm9ng6cNVE5tuTiFpo6R9kp7J1X1T0m5J21O5JPfaVyWNSnpB0qc6FbiZWSsGbkNn4DZgVZ36GyNiRSqbASSdA6wBzk3nfE/ScLuCNTNrF1WKlbJomswj4nGg6AYTq4G70/ZxvwBGgfNbiM/MrDP6bNu4Ge8BCqyX9FTqhjk51Z0KvJo7Zleqm0TSOklbJW09wuEWwjAzm6aCXSz91s1Sz83AmcAKYA9ww3QvEBEbImJlRKycw7wZhmFmNkN91jKf0WiWiNhbfSzpFuCH6elu4PTcoaelOjOzntGPk4Zm1DKXtDT39DNAdaTLJmCNpHmSzgCWA//YWohmZu2nShQqZdG0ZS7pLuBCYJGkXcA3gAslrSD7I+Rl4EsAEbFD0r3As8AYcE1EjHckcjOzmSpZF0oRTZN5RKytU33rFMd/C/hWK0GZmXVamYYdFuEZoGY2mAatZW5m1o/67Qaok7mZDZ4AvNCWmVn5uc/czKzk+nGcuZO5mQ2eCHezmJn1g35rmbey0JaZWXm1aW0WSavS/g2jkq6t8/o8Sfek15+UtCz3Wt39HyS9LOnptF/E1iL/HLfMzWwgtaNlnvZruAn4JNkqsVskbYqIZ3OHXQ0cjIizJK0Bvg18tmb/h/cBj0g6Ozdr/hMRsb9oLG6Zm9ngCWA8ipWpnQ+MRsRLEfEucDfZvg55q4Hb0+P7gIskiTbv/+BkbmYDaRrrmS+q7r2QyrrcZYrs4TBxTESMAW8AC5ucG8CPJW2reb+G3M1iZoOp+GiW/RGxspOh1PHRiNgt6RTgYUnPp13fGnLL3MwGUpt2Giqyh8PEMZJGgBOBA1OdGxHVn/uAByjQ/dI0madt4fZJeiZXd0+6y7o93XXdnuqXSfp17rW/bnZ9M7NZV3QkS/NkvgVYLukMSXPJbmhuqjlmE3BVenwZ8FhEBA32f5B0nKQTACQdB1zM0T0jGirSzXIb8F3gjmpFRHy2+ljSDWR9QFU7I2JFgeuamXWFADW/udlURIxJWg88BAwDG9O+DtcDWyNiE9mS4XdKGgVeJ0v4Dfd/kLQEeCC7R8oI8IOI+FGzWIqsZ/54flxkXrojewXwB82uY2bWS9SmGaARsRnYXFN3Xe7xO8DlDc6dtP9DRLwE/O5042i1z/xjwN6IeDFXd4akn0v6e0kfa3SipHXVu8NHONxiGGZm09C+bpae0epolrXAXbnne4D3R8QBSecBfyvp3Ih4s/bEiNgAbACYrwUl+sjMrPy8NsuEdFf23wHnVesi4jBkzeyI2CZpJ3A2UGg6qpnZbPHaLEf9G+D5iNhVrZC0OE1vRdIHyO7OvtRaiGZmHVBdObFZKYkiQxPvAv4B+G1JuyRdnV5aw7FdLAAfB55KQxXvA74cEa+3MV4zs9ZFNpqlSCmLIqNZ1jao/+M6dfcD97celplZh5UnTxfi6fxmNpDaNTSxVziZm9lgcjI3Myu5ALyhs5lZuYlwN4uZWV+o9FfT3MnczAaPu1nMzPqDu1nMzPqBk7mZWdmVa6p+EU7mZjZ4AijRVP0inMzNbCC5z9zMrB84mZuZlVwAFSdzM7OS8w1QM7P+4GRuZlZyAYz31xTQnkjmhzi4/5G471fA/m7HMg2LKFe84JhnQ9nihfLF/FutXyIgnMzbLiIWS9oaESu7HUtRZYsXHPNsKFu8UM6Y28LdLGZmJefRLGZmfcIt847Z0O0Apqls8YJjng1lixfKGXPr+iyZK/rsH2Rm1syJc06Jf7Xo8kLH/ui1720rwz2FXmqZm5nNnj5ryDqZm9lg6rNkPtTtACStkvSCpFFJ13Y7nkYkvSzpaUnbJW1NdQskPSzpxfTz5C7HuFHSPknP5OrqxqjMd9Ln/pSkD/dIvN+UtDt9ztslXZJ77asp3hckfWq2400xnC7pJ5KelbRD0ldSfU9+zlPE29Ofc+dFNpqlSCmJriZzScPATcCngXOAtZLO6WZMTXwiIlbk+s+uBR6NiOXAo+l5N90GrKqpaxTjp4HlqawDbp6lGPNuY3K8ADemz3lFRGwGSN+LNcC56Zzvpe/PbBsD/iwizgEuAK5JsfXq59woXujtz7mzAiIqhUpZdLtlfj4wGhEvRcS7wN3A6i7HNB2rgdvT49uBS7sXCkTE48DrNdWNYlwN3BGZJ4CTJC2dlUCTBvE2shq4OyIOR8QvgFGy78+siog9EfGz9PgQ8BxwKj36OU8RbyM98TnPivFKsVIS3U7mpwKv5p7vYuovWjcF8GNJ2yStS3VLImJPevwasKQ7oU2pUYy9/NmvT10SG3NdVz0Xr6RlwO8BT1KCz7kmXijJ59wREVCpFCsl0e1kXiYfjYgPk/3ZfI2kj+dfjGyMZ093sJUhRrJuiDOBFcAe4IauRtOApOOB+4E/jYg386/14udcJ95SfM4dFVGslES3k/lu4PTc89NSXc+JiN3p5z7gAbI/PfdW/2ROP/d1L8KGGsXYk599ROyNiPHIOitv4eif+D0Tr6Q5ZInx+xHxN6m6Zz/nevGW4XPutKhUCpWy6HYy3wIsl3SGpLlkN142dTmmSSQdJ+mE6mPgYuAZslivSoddBTzYnQin1CjGTcCVabTFBcAbuW6CrqnpT/4M2ecMWbxrJM2TdAbZDcV/7EJ8Am4FnouIv8q91JOfc6N4e/1z7ryCrfIStcy7Os48IsYkrQceAoaBjRGxo5sxNbAEeCD7f8EI8IOI+JGkLcC9kq4GXgGu6GKMSLoLuBBYJGkX8A3gL6gf42bgErIbXG8DX+iReC+UtIKsm+Jl4EsAEbFD0r3As2QjNK6JiPHZjhn4feDzwNOStqe6r9G7n3OjeNf2+OfcWX240Jan85vZwJk/tDAuGCk2hP7hI3eVYjp/t7tZzMxmX6TNKYqUJtRk4mPqsronvf5kGlVUfa3uBK1m16zHydzMBlJUolCZSsGJj1cDByPiLOBG4Nvp3LoTtGY6mdLJ3MwGU3ta5kUmPuYnlN0HXJRuTDeaoDWjyZReaMvMBs4hDj70SNy3qODh71FajynZEBHVNeDrTbL6SM35E8ekQR9vAAtT/RM151YnaDW75iRO5mY2cCKi3ppApeZuFjOzmSsyyWriGEkjwInAgSnOndHELSdzM7OZKzLxMT+h7DLgsbTkQ6MJWjOaTOluFjOzGWo08VHS9cDWiNhENgP3TkmjZKuErknnNpygNZPJlJ40ZGbWB9zNYmbWB5zMzcz6gJO5mVkfcDI3M+sDTuZmZn3AydzMrA84mZuZ9YH/D3WJxuL+PMhKAAAAAElFTkSuQmCC",
122 | "text/plain": [
123 | ""
124 | ]
125 | },
126 | "metadata": {
127 | "needs_background": "light"
128 | },
129 | "output_type": "display_data"
130 | },
131 | {
132 | "data": {
133 | "image/png": "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",
134 | "text/plain": [
135 | ""
136 | ]
137 | },
138 | "metadata": {
139 | "needs_background": "light"
140 | },
141 | "output_type": "display_data"
142 | },
143 | {
144 | "data": {
145 | "image/png": "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",
146 | "text/plain": [
147 | ""
148 | ]
149 | },
150 | "metadata": {
151 | "needs_background": "light"
152 | },
153 | "output_type": "display_data"
154 | },
155 | {
156 | "data": {
157 | "image/png": "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",
158 | "text/plain": [
159 | ""
160 | ]
161 | },
162 | "metadata": {
163 | "needs_background": "light"
164 | },
165 | "output_type": "display_data"
166 | },
167 | {
168 | "data": {
169 | "image/png": "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",
170 | "text/plain": [
171 | ""
172 | ]
173 | },
174 | "metadata": {
175 | "needs_background": "light"
176 | },
177 | "output_type": "display_data"
178 | }
179 | ],
180 | "source": [
181 | "# visualizing results\n",
182 | "from pylab import *\n",
183 | "for i in result:\n",
184 | " figure()\n",
185 | " imshow(i)\n",
186 | " colorbar()"
187 | ]
188 | },
189 | {
190 | "cell_type": "code",
191 | "execution_count": null,
192 | "metadata": {},
193 | "outputs": [],
194 | "source": []
195 | }
196 | ],
197 | "metadata": {
198 | "kernelspec": {
199 | "display_name": "base",
200 | "language": "python",
201 | "name": "python3"
202 | },
203 | "language_info": {
204 | "codemirror_mode": {
205 | "name": "ipython",
206 | "version": 3
207 | },
208 | "file_extension": ".py",
209 | "mimetype": "text/x-python",
210 | "name": "python",
211 | "nbconvert_exporter": "python",
212 | "pygments_lexer": "ipython3",
213 | "version": "3.9.12"
214 | }
215 | },
216 | "nbformat": 4,
217 | "nbformat_minor": 2
218 | }
219 |
--------------------------------------------------------------------------------
/examples/example_files/example_1_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/examples/example_files/example_1_0.png
--------------------------------------------------------------------------------
/examples/example_files/example_3_0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/examples/example_files/example_3_0.png
--------------------------------------------------------------------------------
/examples/example_files/example_3_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/examples/example_files/example_3_1.png
--------------------------------------------------------------------------------
/examples/example_files/example_3_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/examples/example_files/example_3_2.png
--------------------------------------------------------------------------------
/examples/example_files/example_3_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/examples/example_files/example_3_3.png
--------------------------------------------------------------------------------
/examples/example_files/example_3_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/examples/example_files/example_3_4.png
--------------------------------------------------------------------------------
/examples/example_files/example_3_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/examples/example_files/example_3_5.png
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [build-system]
2 | requires = ["setuptools>=61.0", "wheel"]
3 | build-backend = "setuptools.build_meta"
4 |
5 | [project]
6 | name = "constrained_diffusion"
7 | version = "1.0.1"
8 | description = "Constrained diffusion decomposition: Diffusion-based Multi-Scale Analysis of Complex Iages"
9 | readme = "README.md"
10 | requires-python = ">=3.9"
11 | license = { file = "LICENSE" }
12 | authors = [
13 | { name = "Guang-Xing Li", email = "ligx.ngc7293@gmail.com" }
14 | ]
15 | classifiers = [
16 | "Programming Language :: Python :: 3",
17 | "Operating System :: OS Independent",
18 | ]
19 | dependencies = [
20 | "astropy>=5.0",
21 | "numpy>=1.20",
22 | "scipy>=1.7",
23 | ]
24 |
25 | [project.urls]
26 | Homepage = "https://gxli.github.io/Constrained-Diffusion-Decomposition/"
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy>=1.20
2 | scipy>=1.7
3 |
--------------------------------------------------------------------------------
/src/__init__.py:
--------------------------------------------------------------------------------
1 | # Package initialization for src
2 | from .constrained_diffusion_decomposition import constrained_diffusion_decomposition
3 | from .scripts.script import main
4 |
--------------------------------------------------------------------------------
/src/__pycache__/__init__.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxli/Constrained-Diffusion-Decomposition/314202764c43d15cc859f8cdbc64637e99b50066/src/__pycache__/__init__.cpython-39.pyc
--------------------------------------------------------------------------------
/src/constrained_diffusion.egg-info/PKG-INFO:
--------------------------------------------------------------------------------
1 | Metadata-Version: 2.4
2 | Name: constrained_diffusion
3 | Version: 1.0.1
4 | Summary: Constrained diffusion decomposition: Diffusion-based Multi-Scale Analysis of Complex Iages
5 | Author-email: Guang-Xing Li
6 | License: GNU GENERAL PUBLIC LICENSE
7 | Version 3, 29 June 2007
8 |
9 | Copyright (C) 2007 Free Software Foundation, Inc.
10 | Everyone is permitted to copy and distribute verbatim copies
11 | of this license document, but changing it is not allowed.
12 |
13 | Preamble
14 |
15 | The GNU General Public License is a free, copyleft license for
16 | software and other kinds of works.
17 |
18 | The licenses for most software and other practical works are designed
19 | to take away your freedom to share and change the works. By contrast,
20 | the GNU General Public License is intended to guarantee your freedom to
21 | share and change all versions of a program--to make sure it remains free
22 | software for all its users. We, the Free Software Foundation, use the
23 | GNU General Public License for most of our software; it applies also to
24 | any other work released this way by its authors. You can apply it to
25 | your programs, too.
26 |
27 | When we speak of free software, we are referring to freedom, not
28 | price. Our General Public Licenses are designed to make sure that you
29 | have the freedom to distribute copies of free software (and charge for
30 | them if you wish), that you receive source code or can get it if you
31 | want it, that you can change the software or use pieces of it in new
32 | free programs, and that you know you can do these things.
33 |
34 | To protect your rights, we need to prevent others from denying you
35 | these rights or asking you to surrender the rights. Therefore, you have
36 | certain responsibilities if you distribute copies of the software, or if
37 | you modify it: responsibilities to respect the freedom of others.
38 |
39 | For example, if you distribute copies of such a program, whether
40 | gratis or for a fee, you must pass on to the recipients the same
41 | freedoms that you received. You must make sure that they, too, receive
42 | or can get the source code. And you must show them these terms so they
43 | know their rights.
44 |
45 | Developers that use the GNU GPL protect your rights with two steps:
46 | (1) assert copyright on the software, and (2) offer you this License
47 | giving you legal permission to copy, distribute and/or modify it.
48 |
49 | For the developers' and authors' protection, the GPL clearly explains
50 | that there is no warranty for this free software. For both users' and
51 | authors' sake, the GPL requires that modified versions be marked as
52 | changed, so that their problems will not be attributed erroneously to
53 | authors of previous versions.
54 |
55 | Some devices are designed to deny users access to install or run
56 | modified versions of the software inside them, although the manufacturer
57 | can do so. This is fundamentally incompatible with the aim of
58 | protecting users' freedom to change the software. The systematic
59 | pattern of such abuse occurs in the area of products for individuals to
60 | use, which is precisely where it is most unacceptable. Therefore, we
61 | have designed this version of the GPL to prohibit the practice for those
62 | products. If such problems arise substantially in other domains, we
63 | stand ready to extend this provision to those domains in future versions
64 | of the GPL, as needed to protect the freedom of users.
65 |
66 | Finally, every program is threatened constantly by software patents.
67 | States should not allow patents to restrict development and use of
68 | software on general-purpose computers, but in those that do, we wish to
69 | avoid the special danger that patents applied to a free program could
70 | make it effectively proprietary. To prevent this, the GPL assures that
71 | patents cannot be used to render the program non-free.
72 |
73 | The precise terms and conditions for copying, distribution and
74 | modification follow.
75 |
76 | TERMS AND CONDITIONS
77 |
78 | 0. Definitions.
79 |
80 | "This License" refers to version 3 of the GNU General Public License.
81 |
82 | "Copyright" also means copyright-like laws that apply to other kinds of
83 | works, such as semiconductor masks.
84 |
85 | "The Program" refers to any copyrightable work licensed under this
86 | License. Each licensee is addressed as "you". "Licensees" and
87 | "recipients" may be individuals or organizations.
88 |
89 | To "modify" a work means to copy from or adapt all or part of the work
90 | in a fashion requiring copyright permission, other than the making of an
91 | exact copy. The resulting work is called a "modified version" of the
92 | earlier work or a work "based on" the earlier work.
93 |
94 | A "covered work" means either the unmodified Program or a work based
95 | on the Program.
96 |
97 | To "propagate" a work means to do anything with it that, without
98 | permission, would make you directly or secondarily liable for
99 | infringement under applicable copyright law, except executing it on a
100 | computer or modifying a private copy. Propagation includes copying,
101 | distribution (with or without modification), making available to the
102 | public, and in some countries other activities as well.
103 |
104 | To "convey" a work means any kind of propagation that enables other
105 | parties to make or receive copies. Mere interaction with a user through
106 | a computer network, with no transfer of a copy, is not conveying.
107 |
108 | An interactive user interface displays "Appropriate Legal Notices"
109 | to the extent that it includes a convenient and prominently visible
110 | feature that (1) displays an appropriate copyright notice, and (2)
111 | tells the user that there is no warranty for the work (except to the
112 | extent that warranties are provided), that licensees may convey the
113 | work under this License, and how to view a copy of this License. If
114 | the interface presents a list of user commands or options, such as a
115 | menu, a prominent item in the list meets this criterion.
116 |
117 | 1. Source Code.
118 |
119 | The "source code" for a work means the preferred form of the work
120 | for making modifications to it. "Object code" means any non-source
121 | form of a work.
122 |
123 | A "Standard Interface" means an interface that either is an official
124 | standard defined by a recognized standards body, or, in the case of
125 | interfaces specified for a particular programming language, one that
126 | is widely used among developers working in that language.
127 |
128 | The "System Libraries" of an executable work include anything, other
129 | than the work as a whole, that (a) is included in the normal form of
130 | packaging a Major Component, but which is not part of that Major
131 | Component, and (b) serves only to enable use of the work with that
132 | Major Component, or to implement a Standard Interface for which an
133 | implementation is available to the public in source code form. A
134 | "Major Component", in this context, means a major essential component
135 | (kernel, window system, and so on) of the specific operating system
136 | (if any) on which the executable work runs, or a compiler used to
137 | produce the work, or an object code interpreter used to run it.
138 |
139 | The "Corresponding Source" for a work in object code form means all
140 | the source code needed to generate, install, and (for an executable
141 | work) run the object code and to modify the work, including scripts to
142 | control those activities. However, it does not include the work's
143 | System Libraries, or general-purpose tools or generally available free
144 | programs which are used unmodified in performing those activities but
145 | which are not part of the work. For example, Corresponding Source
146 | includes interface definition files associated with source files for
147 | the work, and the source code for shared libraries and dynamically
148 | linked subprograms that the work is specifically designed to require,
149 | such as by intimate data communication or control flow between those
150 | subprograms and other parts of the work.
151 |
152 | The Corresponding Source need not include anything that users
153 | can regenerate automatically from other parts of the Corresponding
154 | Source.
155 |
156 | The Corresponding Source for a work in source code form is that
157 | same work.
158 |
159 | 2. Basic Permissions.
160 |
161 | All rights granted under this License are granted for the term of
162 | copyright on the Program, and are irrevocable provided the stated
163 | conditions are met. This License explicitly affirms your unlimited
164 | permission to run the unmodified Program. The output from running a
165 | covered work is covered by this License only if the output, given its
166 | content, constitutes a covered work. This License acknowledges your
167 | rights of fair use or other equivalent, as provided by copyright law.
168 |
169 | You may make, run and propagate covered works that you do not
170 | convey, without conditions so long as your license otherwise remains
171 | in force. You may convey covered works to others for the sole purpose
172 | of having them make modifications exclusively for you, or provide you
173 | with facilities for running those works, provided that you comply with
174 | the terms of this License in conveying all material for which you do
175 | not control copyright. Those thus making or running the covered works
176 | for you must do so exclusively on your behalf, under your direction
177 | and control, on terms that prohibit them from making any copies of
178 | your copyrighted material outside their relationship with you.
179 |
180 | Conveying under any other circumstances is permitted solely under
181 | the conditions stated below. Sublicensing is not allowed; section 10
182 | makes it unnecessary.
183 |
184 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
185 |
186 | No covered work shall be deemed part of an effective technological
187 | measure under any applicable law fulfilling obligations under article
188 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
189 | similar laws prohibiting or restricting circumvention of such
190 | measures.
191 |
192 | When you convey a covered work, you waive any legal power to forbid
193 | circumvention of technological measures to the extent such circumvention
194 | is effected by exercising rights under this License with respect to
195 | the covered work, and you disclaim any intention to limit operation or
196 | modification of the work as a means of enforcing, against the work's
197 | users, your or third parties' legal rights to forbid circumvention of
198 | technological measures.
199 |
200 | 4. Conveying Verbatim Copies.
201 |
202 | You may convey verbatim copies of the Program's source code as you
203 | receive it, in any medium, provided that you conspicuously and
204 | appropriately publish on each copy an appropriate copyright notice;
205 | keep intact all notices stating that this License and any
206 | non-permissive terms added in accord with section 7 apply to the code;
207 | keep intact all notices of the absence of any warranty; and give all
208 | recipients a copy of this License along with the Program.
209 |
210 | You may charge any price or no price for each copy that you convey,
211 | and you may offer support or warranty protection for a fee.
212 |
213 | 5. Conveying Modified Source Versions.
214 |
215 | You may convey a work based on the Program, or the modifications to
216 | produce it from the Program, in the form of source code under the
217 | terms of section 4, provided that you also meet all of these conditions:
218 |
219 | a) The work must carry prominent notices stating that you modified
220 | it, and giving a relevant date.
221 |
222 | b) The work must carry prominent notices stating that it is
223 | released under this License and any conditions added under section
224 | 7. This requirement modifies the requirement in section 4 to
225 | "keep intact all notices".
226 |
227 | c) You must license the entire work, as a whole, under this
228 | License to anyone who comes into possession of a copy. This
229 | License will therefore apply, along with any applicable section 7
230 | additional terms, to the whole of the work, and all its parts,
231 | regardless of how they are packaged. This License gives no
232 | permission to license the work in any other way, but it does not
233 | invalidate such permission if you have separately received it.
234 |
235 | d) If the work has interactive user interfaces, each must display
236 | Appropriate Legal Notices; however, if the Program has interactive
237 | interfaces that do not display Appropriate Legal Notices, your
238 | work need not make them do so.
239 |
240 | A compilation of a covered work with other separate and independent
241 | works, which are not by their nature extensions of the covered work,
242 | and which are not combined with it such as to form a larger program,
243 | in or on a volume of a storage or distribution medium, is called an
244 | "aggregate" if the compilation and its resulting copyright are not
245 | used to limit the access or legal rights of the compilation's users
246 | beyond what the individual works permit. Inclusion of a covered work
247 | in an aggregate does not cause this License to apply to the other
248 | parts of the aggregate.
249 |
250 | 6. Conveying Non-Source Forms.
251 |
252 | You may convey a covered work in object code form under the terms
253 | of sections 4 and 5, provided that you also convey the
254 | machine-readable Corresponding Source under the terms of this License,
255 | in one of these ways:
256 |
257 | a) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by the
259 | Corresponding Source fixed on a durable physical medium
260 | customarily used for software interchange.
261 |
262 | b) Convey the object code in, or embodied in, a physical product
263 | (including a physical distribution medium), accompanied by a
264 | written offer, valid for at least three years and valid for as
265 | long as you offer spare parts or customer support for that product
266 | model, to give anyone who possesses the object code either (1) a
267 | copy of the Corresponding Source for all the software in the
268 | product that is covered by this License, on a durable physical
269 | medium customarily used for software interchange, for a price no
270 | more than your reasonable cost of physically performing this
271 | conveying of source, or (2) access to copy the
272 | Corresponding Source from a network server at no charge.
273 |
274 | c) Convey individual copies of the object code with a copy of the
275 | written offer to provide the Corresponding Source. This
276 | alternative is allowed only occasionally and noncommercially, and
277 | only if you received the object code with such an offer, in accord
278 | with subsection 6b.
279 |
280 | d) Convey the object code by offering access from a designated
281 | place (gratis or for a charge), and offer equivalent access to the
282 | Corresponding Source in the same way through the same place at no
283 | further charge. You need not require recipients to copy the
284 | Corresponding Source along with the object code. If the place to
285 | copy the object code is a network server, the Corresponding Source
286 | may be on a different server (operated by you or a third party)
287 | that supports equivalent copying facilities, provided you maintain
288 | clear directions next to the object code saying where to find the
289 | Corresponding Source. Regardless of what server hosts the
290 | Corresponding Source, you remain obligated to ensure that it is
291 | available for as long as needed to satisfy these requirements.
292 |
293 | e) Convey the object code using peer-to-peer transmission, provided
294 | you inform other peers where the object code and Corresponding
295 | Source of the work are being offered to the general public at no
296 | charge under subsection 6d.
297 |
298 | A separable portion of the object code, whose source code is excluded
299 | from the Corresponding Source as a System Library, need not be
300 | included in conveying the object code work.
301 |
302 | A "User Product" is either (1) a "consumer product", which means any
303 | tangible personal property which is normally used for personal, family,
304 | or household purposes, or (2) anything designed or sold for incorporation
305 | into a dwelling. In determining whether a product is a consumer product,
306 | doubtful cases shall be resolved in favor of coverage. For a particular
307 | product received by a particular user, "normally used" refers to a
308 | typical or common use of that class of product, regardless of the status
309 | of the particular user or of the way in which the particular user
310 | actually uses, or expects or is expected to use, the product. A product
311 | is a consumer product regardless of whether the product has substantial
312 | commercial, industrial or non-consumer uses, unless such uses represent
313 | the only significant mode of use of the product.
314 |
315 | "Installation Information" for a User Product means any methods,
316 | procedures, authorization keys, or other information required to install
317 | and execute modified versions of a covered work in that User Product from
318 | a modified version of its Corresponding Source. The information must
319 | suffice to ensure that the continued functioning of the modified object
320 | code is in no case prevented or interfered with solely because
321 | modification has been made.
322 |
323 | If you convey an object code work under this section in, or with, or
324 | specifically for use in, a User Product, and the conveying occurs as
325 | part of a transaction in which the right of possession and use of the
326 | User Product is transferred to the recipient in perpetuity or for a
327 | fixed term (regardless of how the transaction is characterized), the
328 | Corresponding Source conveyed under this section must be accompanied
329 | by the Installation Information. But this requirement does not apply
330 | if neither you nor any third party retains the ability to install
331 | modified object code on the User Product (for example, the work has
332 | been installed in ROM).
333 |
334 | The requirement to provide Installation Information does not include a
335 | requirement to continue to provide support service, warranty, or updates
336 | for a work that has been modified or installed by the recipient, or for
337 | the User Product in which it has been modified or installed. Access to a
338 | network may be denied when the modification itself materially and
339 | adversely affects the operation of the network or violates the rules and
340 | protocols for communication across the network.
341 |
342 | Corresponding Source conveyed, and Installation Information provided,
343 | in accord with this section must be in a format that is publicly
344 | documented (and with an implementation available to the public in
345 | source code form), and must require no special password or key for
346 | unpacking, reading or copying.
347 |
348 | 7. Additional Terms.
349 |
350 | "Additional permissions" are terms that supplement the terms of this
351 | License by making exceptions from one or more of its conditions.
352 | Additional permissions that are applicable to the entire Program shall
353 | be treated as though they were included in this License, to the extent
354 | that they are valid under applicable law. If additional permissions
355 | apply only to part of the Program, that part may be used separately
356 | under those permissions, but the entire Program remains governed by
357 | this License without regard to the additional permissions.
358 |
359 | When you convey a copy of a covered work, you may at your option
360 | remove any additional permissions from that copy, or from any part of
361 | it. (Additional permissions may be written to require their own
362 | removal in certain cases when you modify the work.) You may place
363 | additional permissions on material, added by you to a covered work,
364 | for which you have or can give appropriate copyright permission.
365 |
366 | Notwithstanding any other provision of this License, for material you
367 | add to a covered work, you may (if authorized by the copyright holders of
368 | that material) supplement the terms of this License with terms:
369 |
370 | a) Disclaiming warranty or limiting liability differently from the
371 | terms of sections 15 and 16 of this License; or
372 |
373 | b) Requiring preservation of specified reasonable legal notices or
374 | author attributions in that material or in the Appropriate Legal
375 | Notices displayed by works containing it; or
376 |
377 | c) Prohibiting misrepresentation of the origin of that material, or
378 | requiring that modified versions of such material be marked in
379 | reasonable ways as different from the original version; or
380 |
381 | d) Limiting the use for publicity purposes of names of licensors or
382 | authors of the material; or
383 |
384 | e) Declining to grant rights under trademark law for use of some
385 | trade names, trademarks, or service marks; or
386 |
387 | f) Requiring indemnification of licensors and authors of that
388 | material by anyone who conveys the material (or modified versions of
389 | it) with contractual assumptions of liability to the recipient, for
390 | any liability that these contractual assumptions directly impose on
391 | those licensors and authors.
392 |
393 | All other non-permissive additional terms are considered "further
394 | restrictions" within the meaning of section 10. If the Program as you
395 | received it, or any part of it, contains a notice stating that it is
396 | governed by this License along with a term that is a further
397 | restriction, you may remove that term. If a license document contains
398 | a further restriction but permits relicensing or conveying under this
399 | License, you may add to a covered work material governed by the terms
400 | of that license document, provided that the further restriction does
401 | not survive such relicensing or conveying.
402 |
403 | If you add terms to a covered work in accord with this section, you
404 | must place, in the relevant source files, a statement of the
405 | additional terms that apply to those files, or a notice indicating
406 | where to find the applicable terms.
407 |
408 | Additional terms, permissive or non-permissive, may be stated in the
409 | form of a separately written license, or stated as exceptions;
410 | the above requirements apply either way.
411 |
412 | 8. Termination.
413 |
414 | You may not propagate or modify a covered work except as expressly
415 | provided under this License. Any attempt otherwise to propagate or
416 | modify it is void, and will automatically terminate your rights under
417 | this License (including any patent licenses granted under the third
418 | paragraph of section 11).
419 |
420 | However, if you cease all violation of this License, then your
421 | license from a particular copyright holder is reinstated (a)
422 | provisionally, unless and until the copyright holder explicitly and
423 | finally terminates your license, and (b) permanently, if the copyright
424 | holder fails to notify you of the violation by some reasonable means
425 | prior to 60 days after the cessation.
426 |
427 | Moreover, your license from a particular copyright holder is
428 | reinstated permanently if the copyright holder notifies you of the
429 | violation by some reasonable means, this is the first time you have
430 | received notice of violation of this License (for any work) from that
431 | copyright holder, and you cure the violation prior to 30 days after
432 | your receipt of the notice.
433 |
434 | Termination of your rights under this section does not terminate the
435 | licenses of parties who have received copies or rights from you under
436 | this License. If your rights have been terminated and not permanently
437 | reinstated, you do not qualify to receive new licenses for the same
438 | material under section 10.
439 |
440 | 9. Acceptance Not Required for Having Copies.
441 |
442 | You are not required to accept this License in order to receive or
443 | run a copy of the Program. Ancillary propagation of a covered work
444 | occurring solely as a consequence of using peer-to-peer transmission
445 | to receive a copy likewise does not require acceptance. However,
446 | nothing other than this License grants you permission to propagate or
447 | modify any covered work. These actions infringe copyright if you do
448 | not accept this License. Therefore, by modifying or propagating a
449 | covered work, you indicate your acceptance of this License to do so.
450 |
451 | 10. Automatic Licensing of Downstream Recipients.
452 |
453 | Each time you convey a covered work, the recipient automatically
454 | receives a license from the original licensors, to run, modify and
455 | propagate that work, subject to this License. You are not responsible
456 | for enforcing compliance by third parties with this License.
457 |
458 | An "entity transaction" is a transaction transferring control of an
459 | organization, or substantially all assets of one, or subdividing an
460 | organization, or merging organizations. If propagation of a covered
461 | work results from an entity transaction, each party to that
462 | transaction who receives a copy of the work also receives whatever
463 | licenses to the work the party's predecessor in interest had or could
464 | give under the previous paragraph, plus a right to possession of the
465 | Corresponding Source of the work from the predecessor in interest, if
466 | the predecessor has it or can get it with reasonable efforts.
467 |
468 | You may not impose any further restrictions on the exercise of the
469 | rights granted or affirmed under this License. For example, you may
470 | not impose a license fee, royalty, or other charge for exercise of
471 | rights granted under this License, and you may not initiate litigation
472 | (including a cross-claim or counterclaim in a lawsuit) alleging that
473 | any patent claim is infringed by making, using, selling, offering for
474 | sale, or importing the Program or any portion of it.
475 |
476 | 11. Patents.
477 |
478 | A "contributor" is a copyright holder who authorizes use under this
479 | License of the Program or a work on which the Program is based. The
480 | work thus licensed is called the contributor's "contributor version".
481 |
482 | A contributor's "essential patent claims" are all patent claims
483 | owned or controlled by the contributor, whether already acquired or
484 | hereafter acquired, that would be infringed by some manner, permitted
485 | by this License, of making, using, or selling its contributor version,
486 | but do not include claims that would be infringed only as a
487 | consequence of further modification of the contributor version. For
488 | purposes of this definition, "control" includes the right to grant
489 | patent sublicenses in a manner consistent with the requirements of
490 | this License.
491 |
492 | Each contributor grants you a non-exclusive, worldwide, royalty-free
493 | patent license under the contributor's essential patent claims, to
494 | make, use, sell, offer for sale, import and otherwise run, modify and
495 | propagate the contents of its contributor version.
496 |
497 | In the following three paragraphs, a "patent license" is any express
498 | agreement or commitment, however denominated, not to enforce a patent
499 | (such as an express permission to practice a patent or covenant not to
500 | sue for patent infringement). To "grant" such a patent license to a
501 | party means to make such an agreement or commitment not to enforce a
502 | patent against the party.
503 |
504 | If you convey a covered work, knowingly relying on a patent license,
505 | and the Corresponding Source of the work is not available for anyone
506 | to copy, free of charge and under the terms of this License, through a
507 | publicly available network server or other readily accessible means,
508 | then you must either (1) cause the Corresponding Source to be so
509 | available, or (2) arrange to deprive yourself of the benefit of the
510 | patent license for this particular work, or (3) arrange, in a manner
511 | consistent with the requirements of this License, to extend the patent
512 | license to downstream recipients. "Knowingly relying" means you have
513 | actual knowledge that, but for the patent license, your conveying the
514 | covered work in a country, or your recipient's use of the covered work
515 | in a country, would infringe one or more identifiable patents in that
516 | country that you have reason to believe are valid.
517 |
518 | If, pursuant to or in connection with a single transaction or
519 | arrangement, you convey, or propagate by procuring conveyance of, a
520 | covered work, and grant a patent license to some of the parties
521 | receiving the covered work authorizing them to use, propagate, modify
522 | or convey a specific copy of the covered work, then the patent license
523 | you grant is automatically extended to all recipients of the covered
524 | work and works based on it.
525 |
526 | A patent license is "discriminatory" if it does not include within
527 | the scope of its coverage, prohibits the exercise of, or is
528 | conditioned on the non-exercise of one or more of the rights that are
529 | specifically granted under this License. You may not convey a covered
530 | work if you are a party to an arrangement with a third party that is
531 | in the business of distributing software, under which you make payment
532 | to the third party based on the extent of your activity of conveying
533 | the work, and under which the third party grants, to any of the
534 | parties who would receive the covered work from you, a discriminatory
535 | patent license (a) in connection with copies of the covered work
536 | conveyed by you (or copies made from those copies), or (b) primarily
537 | for and in connection with specific products or compilations that
538 | contain the covered work, unless you entered into that arrangement,
539 | or that patent license was granted, prior to 28 March 2007.
540 |
541 | Nothing in this License shall be construed as excluding or limiting
542 | any implied license or other defenses to infringement that may
543 | otherwise be available to you under applicable patent law.
544 |
545 | 12. No Surrender of Others' Freedom.
546 |
547 | If conditions are imposed on you (whether by court order, agreement or
548 | otherwise) that contradict the conditions of this License, they do not
549 | excuse you from the conditions of this License. If you cannot convey a
550 | covered work so as to satisfy simultaneously your obligations under this
551 | License and any other pertinent obligations, then as a consequence you may
552 | not convey it at all. For example, if you agree to terms that obligate you
553 | to collect a royalty for further conveying from those to whom you convey
554 | the Program, the only way you could satisfy both those terms and this
555 | License would be to refrain entirely from conveying the Program.
556 |
557 | 13. Use with the GNU Affero General Public License.
558 |
559 | Notwithstanding any other provision of this License, you have
560 | permission to link or combine any covered work with a work licensed
561 | under version 3 of the GNU Affero General Public License into a single
562 | combined work, and to convey the resulting work. The terms of this
563 | License will continue to apply to the part which is the covered work,
564 | but the special requirements of the GNU Affero General Public License,
565 | section 13, concerning interaction through a network will apply to the
566 | combination as such.
567 |
568 | 14. Revised Versions of this License.
569 |
570 | The Free Software Foundation may publish revised and/or new versions of
571 | the GNU General Public License from time to time. Such new versions will
572 | be similar in spirit to the present version, but may differ in detail to
573 | address new problems or concerns.
574 |
575 | Each version is given a distinguishing version number. If the
576 | Program specifies that a certain numbered version of the GNU General
577 | Public License "or any later version" applies to it, you have the
578 | option of following the terms and conditions either of that numbered
579 | version or of any later version published by the Free Software
580 | Foundation. If the Program does not specify a version number of the
581 | GNU General Public License, you may choose any version ever published
582 | by the Free Software Foundation.
583 |
584 | If the Program specifies that a proxy can decide which future
585 | versions of the GNU General Public License can be used, that proxy's
586 | public statement of acceptance of a version permanently authorizes you
587 | to choose that version for the Program.
588 |
589 | Later license versions may give you additional or different
590 | permissions. However, no additional obligations are imposed on any
591 | author or copyright holder as a result of your choosing to follow a
592 | later version.
593 |
594 | 15. Disclaimer of Warranty.
595 |
596 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
597 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
598 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
599 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
600 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
601 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
602 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
603 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
604 |
605 | 16. Limitation of Liability.
606 |
607 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
608 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
609 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
610 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
611 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
612 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
613 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
614 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
615 | SUCH DAMAGES.
616 |
617 | 17. Interpretation of Sections 15 and 16.
618 |
619 | If the disclaimer of warranty and limitation of liability provided
620 | above cannot be given local legal effect according to their terms,
621 | reviewing courts shall apply local law that most closely approximates
622 | an absolute waiver of all civil liability in connection with the
623 | Program, unless a warranty or assumption of liability accompanies a
624 | copy of the Program in return for a fee.
625 |
626 | END OF TERMS AND CONDITIONS
627 |
628 | How to Apply These Terms to Your New Programs
629 |
630 | If you develop a new program, and you want it to be of the greatest
631 | possible use to the public, the best way to achieve this is to make it
632 | free software which everyone can redistribute and change under these terms.
633 |
634 | To do so, attach the following notices to the program. It is safest
635 | to attach them to the start of each source file to most effectively
636 | state the exclusion of warranty; and each file should have at least
637 | the "copyright" line and a pointer to where the full notice is found.
638 |
639 |
640 | Copyright (C)
641 |
642 | This program is free software: you can redistribute it and/or modify
643 | it under the terms of the GNU General Public License as published by
644 | the Free Software Foundation, either version 3 of the License, or
645 | (at your option) any later version.
646 |
647 | This program is distributed in the hope that it will be useful,
648 | but WITHOUT ANY WARRANTY; without even the implied warranty of
649 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
650 | GNU General Public License for more details.
651 |
652 | You should have received a copy of the GNU General Public License
653 | along with this program. If not, see .
654 |
655 | Also add information on how to contact you by electronic and paper mail.
656 |
657 | If the program does terminal interaction, make it output a short
658 | notice like this when it starts in an interactive mode:
659 |
660 | Copyright (C)
661 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
662 | This is free software, and you are welcome to redistribute it
663 | under certain conditions; type `show c' for details.
664 |
665 | The hypothetical commands `show w' and `show c' should show the appropriate
666 | parts of the General Public License. Of course, your program's commands
667 | might be different; for a GUI interface, you would use an "about box".
668 |
669 | You should also get your employer (if you work as a programmer) or school,
670 | if any, to sign a "copyright disclaimer" for the program, if necessary.
671 | For more information on this, and how to apply and follow the GNU GPL, see
672 | .
673 |
674 | The GNU General Public License does not permit incorporating your program
675 | into proprietary programs. If your program is a subroutine library, you
676 | may consider it more useful to permit linking proprietary applications with
677 | the library. If this is what you want to do, use the GNU Lesser General
678 | Public License instead of this License. But first, please read
679 |
680 | Project-URL: Homepage, https://gxli.github.io/Constrained-Diffusion-Decomposition/
681 | Classifier: Programming Language :: Python :: 3
682 | Classifier: Operating System :: OS Independent
683 | Requires-Python: >=3.9
684 | Description-Content-Type: text/markdown
685 | License-File: LICENSE
686 | Requires-Dist: astropy>=5.0
687 | Requires-Dist: numpy>=1.20
688 | Requires-Dist: scipy>=1.7
689 | Dynamic: license-file
690 |
691 |
692 |
693 | # Constrained diffusion decomposition: A new PDE-based image decomposition method
694 |
695 |
696 | # General Design
697 | A natural image often contains components of different scales.
698 |
699 | This project decomposition to numpy.ndarray data, decomposing it into scale components, or scales, 1, 2, 4, 8, 16, ... pixels, enabling multi-scale analysis.
700 |
701 | The code is based on
702 | Li 2022, Multi-Scale Decomposition of Astronomical Maps -- Constrained Diffusion Method .
703 |
704 |
705 | Assuuming an input of I(x, y), the decomposition is achieved by solving the equation
706 |
707 | ```math
708 | \frac{\partial I_t }{\partial t} ={\rm sgn}(I_t) \mathcal{H}({- \rm sgn}(I_t) \nabla^2 I_t) \nabla^2 I_t ;,
709 | ```
710 | where t is related to the scale l by t = l**2.
711 |
712 |
713 |
714 |
715 | # Installation
716 |
717 | 1. Use git clone
718 | ```bash
719 | git clone https://github.com/gxli/Constrained-Diffusion-Decomposition.git
720 | cd constrained_diffusion
721 | pip install .
722 | ```
723 |
724 | 2. Use pip
725 |
726 | ```bash
727 | pip install -i https://test.pypi.org/simple/ constrained-diffusion==1.0.0
728 | ```
729 |
730 | # Usage:
731 |
732 | ### Input:
733 |
734 | numpy nd array, of shape e.g. (nx, ny, nz)
735 |
736 | ### Output:
737 |
738 | result: numpy nd array, of shape (m, nx, ny, nz). The mth commponent contain structures of sizes 2$^(m-1)$ to 2$^m$ pixels. residual: numpy nd array, of shape (nx, ny, nz) the input data will be recovered as input = sum_i result[i] + residual
739 |
740 |
741 |
742 | ```python
743 | import constrained_diffusion as cdd
744 |
745 | result, residual = cdd.constrained_diffusion_decomposition(data)
746 | ```
747 |
748 |
749 |
750 |
751 | # Example
752 |
753 | ```python
754 | import matplotlib.pyplot as plt
755 | from matplotlib import cm
756 | import numpy as np
757 | from astropy.io import fits
758 | from constrained_diffusion import constrained_diffusion_decomposition
759 |
760 | def multivariate_gaussian(pos, mu, Sigma):
761 | """Return the multivariate Gaussian distribution on array pos.
762 |
763 | pos is an array constructed by packing the meshed arrays of variables
764 | x_1, x_2, x_3, ..., x_k into its _last_ dimension.
765 |
766 | """
767 |
768 | n = mu.shape[0]
769 | Sigma_det = np.linalg.det(Sigma)
770 | Sigma_inv = np.linalg.inv(Sigma)
771 | N = np.sqrt((2*np.pi)**n * Sigma_det)
772 |
773 | fac = np.einsum('...k,kl,...l->...', pos-mu, Sigma_inv, pos-mu)
774 |
775 | return np.exp(-fac / 2) / N
776 | ```
777 |
778 |
779 | ```python
780 | # Preparing sample input
781 | N_x = 300
782 | N_y = 200
783 | X = np.linspace(0, 300, N_x)
784 | Y = np.linspace(0, 200, N_y)
785 | X, Y = np.meshgrid(X, Y)
786 |
787 | mu = np.array([150., 100.])
788 | Sigma = np.array([[200, 0], [0, 200]])
789 |
790 | pos = np.empty(X.shape + (2,))
791 | pos[:, :, 0] = X
792 | pos[:, :, 1] = Y
793 |
794 |
795 | Z1 = multivariate_gaussian(pos, mu, Sigma) * 100
796 | Z3 = multivariate_gaussian(pos, mu - 10 , Sigma * 0.03) * 3
797 |
798 | Z = Z1 + Z3
799 |
800 | plt.figure()
801 | plt.imshow(Z)
802 | plt.colorbar()
803 | plt.show()
804 | ```
805 |
806 |
807 |
808 |
809 |
810 |
811 |
812 |
813 | ```python
814 | # performing decomposition
815 | result, residual = constrained_diffusion_decomposition(Z)
816 | ```
817 |
818 | ntot 6
819 | i = 0
820 | kernel_size 0.31622776601683794
821 | i = 1
822 | kernel_size 0.34641016151377546
823 | i = 2
824 | kernel_size 0.6928203230275509
825 | i = 3
826 | kernel_size 1.3856406460551018
827 | i = 4
828 | kernel_size 2.7712812921102037
829 | i = 5
830 | kernel_size 5.542562584220407
831 |
832 |
833 |
834 | ```python
835 | # visualizing results
836 | from pylab import *
837 | for i in result:
838 | figure()
839 | imshow(i)
840 | colorbar()
841 | ```
842 |
843 |
844 |
845 |
846 |
847 |
848 |
849 |
850 |
851 |
852 |
853 |
854 |
855 |
856 |
857 |
858 |
859 |
860 |
861 |
862 |
863 |
864 |
865 |
866 | ## License
867 | See the [LICENSE](LICENSE) file for details.
868 |
869 |
--------------------------------------------------------------------------------
/src/constrained_diffusion.egg-info/SOURCES.txt:
--------------------------------------------------------------------------------
1 | LICENSE
2 | README.md
3 | pyproject.toml
4 | src/__init__.py
5 | src/constrained_diffusion.py
6 | src/constrained_diffusion.egg-info/PKG-INFO
7 | src/constrained_diffusion.egg-info/SOURCES.txt
8 | src/constrained_diffusion.egg-info/dependency_links.txt
9 | src/constrained_diffusion.egg-info/requires.txt
10 | src/constrained_diffusion.egg-info/top_level.txt
11 | src/tests/__init__.py
12 | src/tests/test_constrained_diffusion_decomposition.py
--------------------------------------------------------------------------------
/src/constrained_diffusion.egg-info/dependency_links.txt:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/constrained_diffusion.egg-info/requires.txt:
--------------------------------------------------------------------------------
1 | astropy>=5.0
2 | numpy>=1.20
3 | scipy>=1.7
4 |
--------------------------------------------------------------------------------
/src/constrained_diffusion.egg-info/top_level.txt:
--------------------------------------------------------------------------------
1 | __init__
2 | constrained_diffusion
3 | tests
4 |
--------------------------------------------------------------------------------
/src/constrained_diffusion.py:
--------------------------------------------------------------------------------
1 | from scipy import ndimage
2 | import numpy as np
3 | from math import log
4 |
5 | def constrained_diffusion_decomposition(data,
6 | e_rel=3e-2,
7 | max_n=None,
8 | sm_mode='reflect'):
9 | """
10 | Perform constrained diffusion decomposition on n-dimensional data.
11 |
12 | Args:
13 | data: n-dimensional array
14 | e_rel: Relative error (smaller e_rel increases accuracy but computational cost)
15 | max_n: Maximum number of channels (if None, calculated automatically)
16 | sm_mode: Mode for array boundary extension in convolution ('reflect', 'constant',
17 | 'nearest', 'mirror', 'wrap'). Default is 'reflect'.
18 |
19 | Returns:
20 | tuple: (results, residual)
21 | - results: n+1 dimensional array where results[i] contains structures of
22 | sizes between 2**i and 2**(i+1) pixels
23 | - residual: Structures too large to be contained in results
24 | """
25 | if data.size == 0:
26 | raise ValueError("Input data array is empty")
27 |
28 | ntot = int(log(min(data.shape)) / log(2) - 1)
29 | if max_n is not None:
30 | ntot = min(ntot, max_n)
31 | print("total number of scales", ntot)
32 |
33 | result = []
34 | diff_image = data.copy() * 0
35 |
36 | for i in range(ntot):
37 | # print("number of scale", i+1)
38 | channel_image = data.copy() * 0
39 | scale_end = float(pow(2, i + 1))
40 | scale_beginning = float(pow(2, i))
41 | t_end = scale_end**2 / 2
42 | t_beginning = scale_beginning**2 / 2
43 |
44 | if i == 0:
45 | delta_t_max = t_beginning * 0.1
46 | else:
47 | delta_t_max = t_beginning * e_rel
48 |
49 | niter = int((t_end - t_beginning) / delta_t_max + 0.5)
50 | delta_t = (t_end - t_beginning) / niter
51 | kernel_size = np.sqrt(2 * delta_t)
52 |
53 | print("current channel", i, "current scale", 2**i)
54 |
55 | for kk in range(niter):
56 | smooth_image = ndimage.gaussian_filter(data, kernel_size, mode=sm_mode)
57 | sm_image_1 = np.minimum(data, smooth_image)
58 | sm_image_2 = np.maximum(data, smooth_image)
59 |
60 | diff_image_1 = data - sm_image_1
61 | diff_image_2 = data - sm_image_2
62 |
63 | diff_image = diff_image * 0
64 |
65 | positions_1 = np.where(np.logical_and(diff_image_1 > 0, data > 0))
66 | positions_2 = np.where(np.logical_and(diff_image_2 < 0, data < 0))
67 |
68 | diff_image[positions_1] = diff_image_1[positions_1]
69 | diff_image[positions_2] = diff_image_2[positions_2]
70 |
71 | channel_image = channel_image + diff_image
72 | data = data - diff_image
73 |
74 | result.append(channel_image)
75 |
76 | residual = data
77 | return result, residual
78 |
--------------------------------------------------------------------------------
/src/tests/__init__.py:
--------------------------------------------------------------------------------
1 | # Package initialization for tests
2 |
--------------------------------------------------------------------------------
/src/tests/test_constrained_diffusion_decomposition.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | import numpy as np
3 | from src.constrained_diffusion_decomposition import constrained_diffusion_decomposition
4 |
5 | def test_constrained_diffusion_decomposition():
6 | # Create a small 2D test array
7 | data = np.ones((16, 16))
8 | result, residual = constrained_diffusion_decomposition(data, e_rel=3e-2, max_n=2)
9 |
10 | # Check that result is a list of arrays
11 | assert isinstance(result, list)
12 | assert len(result) <= 2 # max_n=2
13 | assert all(isinstance(r, np.ndarray) for r in result)
14 |
15 | # Check residual is an array
16 | assert isinstance(residual, np.ndarray)
17 | assert residual.shape == data.shape
18 |
19 | THOUGH# Check that the sum of results and residual approximates the input
20 | reconstructed = np.sum(result, axis=0) + residual
21 | np.testing.assert_allclose(reconstructed, data, rtol=1e-5)
22 |
23 | def test_invalid_input():
24 | with pytest.raises(ValueError):
25 | constrained_diffusion_decomposition(np.array([])) # Empty array
26 |
--------------------------------------------------------------------------------