nucleic / kiwi Goto Github PK
View Code? Open in Web Editor NEWEfficient C++ implementation of the Cassowary constraint solving algorithm
Home Page: https://kiwisolver.readthedocs.io/en/latest/
License: Other
Efficient C++ implementation of the Cassowary constraint solving algorithm
Home Page: https://kiwisolver.readthedocs.io/en/latest/
License: Other
The TravisCI build fails when trying to install kiwisolver with the following error:
Searching for kiwisolver
Reading https://pypi.python.org/simple/kiwisolver/
Best match: kiwisolver 0.1.2
Downloading https://pypi.python.org/packages/source/k/kiwisolver/kiwisolver-0.1.2.zip#md5=33ebf7f5b90d8ff05f31850d6127ddde
Processing kiwisolver-0.1.2.zip
Writing /tmp/easy_install-CN0qs5/kiwisolver-0.1.2/setup.cfg
Running kiwisolver-0.1.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-CN0qs5/kiwisolver-0.1.2/egg-dist-tmp-CnHX9L
warning: no previously-included files found matching 'build.py'
error: Setup script exited with error: SandboxViolation: os.open('/tmp/tmpWHRYWb/ZyaJNy', 131266, 384) {}
The package setup script has attempted to modify files on your system
that are not within the EasyInstall build area, and has been aborted.
This package cannot be safely installed by EasyInstall, and may not
support alternate installation locations even if you run its setup
script by hand. Please inform the package's author and the EasyInstall
maintainers to find out if a fix or workaround is available.
The command "python setup.py develop" failed and exited with 1 during .
Your build has been stopped.
Any ideas why it's trying to access /tmp/ or how to fix?
cassowary-js example tested with kiwi yields:
Profit: 800
Ale: 12
Beer: 28
Corn: 480
Hops: 160
Malt: 1190 <- ???
another cassowary implementations including python and C# produce:
Profit: 800
Ale: 12
Beer: 28
Corn: 480
Hops: 160
Malt: 980 <- OK
any idea what happened here?
I've tried:
cd py
python setup.py install
and
python py/setup.py install
with no luck. Am I missing something?
I can hack the source and add a callback function to Variable
easily, but I want to here your opinion on this, is there a more proper way to do this.
I saw a Context
in Variable
, but it's not used. I wonder what's the purpose of Context
.
Your readme states a performance and memory advantage (which is exciting) - can you share a benchmark?
I've built kiwisolver wheels for Python 3.7:
https://ci.appveyor.com/project/matthew-brett/kiwisolver-wheels-b9c03/build/1.0.1
https://travis-ci.org/matthew-brett/kiwisolver-wheels/builds/400306143
We need these for matplotlib.
Can one of you upload these to PyPI? Or do you want to give me permission to do that?
Add "Programming Language :: Python :: 3" to PyPI metadata...
... and get a green badge on the Python3 wall of superpowers
Hi Nucleic Team!
I'm building a system for an embedded linux_armv7l
platform. It makes use of scikit-image, which has kiwi as a dependency.
Is there anyway you could find it in your heart to build a wheel for this platform/architecture? I'm struggling greatly to manually build a wheel as the platform does not come equipped with a toolchain (and installing one is off the table).
Thanks for reading, and I hope to hear from someone soon! ๐
Python 3 support has been in the repository for a while thanks to @jwiggins, but there hasn't been a release which includes this. It would be helpful if we could have such a release for downstream projects (particularly Enable and Chaco).
This is mostly an optimization issue, but in essence you sometimes know when say 10 variables will be edited at once, and there is no need to solve in between each.
An option to set AutoSolve = true/false would be preferable (like the original implementation), with a dedicated ManualSolve()-method.
Thanks for the package.
@tacaswell pointed me here, to ask if I could help with building wheels, so we can use kiwi for Matplotlib.
I had a quick shot, but there is a problem I would like to ask your advice on:
I don't think it's possible to test an installed kiwisolver
. At least, when I try:
pip install .
mkdir tmp
cd tmp
py.test --pyargs kiwisolver
I get:
=============================================================== test session starts ===============================================================
platform darwin -- Python 3.5.1, pytest-3.4.0, py-1.5.2, pluggy-0.6.0
rootdir: /Users/mb312/dev_trees/kiwisolver-wheels/kiwi, inifile:
collecting 0 items
========================================================== no tests ran in 0.00 seconds ===========================================================
ERROR: not found: /Users/mb312/.virtualenvs/test3/lib/python3.5/site-packages/kiwisolver.cpython-35m-darwin.so
(no name '/Users/mb312/.virtualenvs/test3/lib/python3.5/site-packages/kiwisolver.cpython-35m-darwin.so' in any of [])
This is a killer for wheels, because we obviously want to make sure that the installed wheel is functioning correctly, before shipping. Do you have any suggestions?
hi,
thanks for great library, I am trying to use it for my gui layout and I'm stuck with simple problem: the position and size of my widgets are kiwi Variables, i don't know how many of them (widgets) there will be, but to calculate the proper layout i need a constraint that deals with them all, for example i want to say that the sum of the widths of all widgets should be equal to the size of the parent widget, how can i do that?
i want' to write sth like that
solver.addConstraint( width0 + width1 + width2 + (...) == parentWidth);
cheers
I have around 200 variables and 2000 constraints, this works ok in release (takes around 0.2s to add everything), but times in debug are ridiculous: around 7s. After profiling a bit, it looks like all the time is taken in STL/Loki stuff:
Would be nice to workaround it somehow, maybe using custom memory efficient containers? Or maybe add ability to prepare solver state in offline and just load it as-is in online without doing much work.
Previous wheels were discussed #48, but not sure if the process was automated? I'd help, but it looks like @matthew-brett has it set up and I've not made wheels before...
This break pip installs for mac folks trying to use matplotlib: matplotlib/matplotlib#14031
Hello, what is the proper way to animate the constraint? With iOS/MacOS auto layout you would normally animate the constant of an already added constraint, but I can't see a proper way to do it with kiwi.
So the two operations that would make a lot of constraints easier to model (some of which are impossible without) are modulo (a % b
) and modulus (absolute value, or |a|
). I know the absolute value one might be tricky API-wise since there's no operator for it, though a == b.abs()
would be acceptable I would think.
Is this something the solver could actually solve? The operations are a bit much for me to comprehend without understanding cassowary at its core I feel like, or else I'd either 1) know the answer, or 2) submit a PR.
Hello,
I am using kiwi on a project to move temporal element with flexible time intervals between them code here (https://github.com/OSSIA/i-score/tree/dev).
When manipulating, I often get a crash right after kiwi throw an InternalSolverError.
outuput
terminate called after throwing an instance of 'kiwi::InternalSolverError'
what(): Dual optimize failed.
done debugging.
0 raise 0x7ffff546b5f8
1 abort 0x7ffff546ca7a
2 __gnu_cxx::__verbose_terminate_handler /usr/lib/libstdc++.so.6 95 0x7ffff5d7fb3d
3 __cxxabiv1::__terminate /usr/lib/libstdc++.so.6 47 0x7ffff5d7d996
4 __cxa_call_terminate /usr/lib/libstdc++.so.6 54 0x7ffff5d7c989
5 __cxxabiv1::__gxx_personality_v0 /usr/lib/libstdc++.so.6 676 0x7ffff5d7d2e5
6 _Unwind_RaiseException_Phase2 /usr/lib/libgcc_s.so.1 62 0x7ffff57ebed3
7 _Unwind_Resume /usr/lib/libgcc_s.so.1 230 0x7ffff57ec3f7
8 kiwi::impl::SolverImpl::dualOptimize solverimpl.h 605 0x7fffdb3af380
9 kiwi::impl::SolverImpl::DualOptimizeGuard::~DualOptimizeGuard solverimpl.h 58 0x7fffdb3acf7d
10 kiwi::impl::SolverImpl::suggestValue solverimpl.h 284 0x7fffdb3adf82
11 kiwi::Solver::suggestValue solver.h 120 0x7fffdb3afcdb
12 CSPDisplacementPolicy::computeDisplacement CSPDisplacementPolicy.cpp 61 0x7fffdb3dee32
13 Scenario::Command::MoveEvent<CSPDisplacementPolicy>::update MoveEvent.hpp 106 0x7fffdb3dc588
14 Scenario::Command::MoveEvent<CSPDisplacementPolicy>::MoveEvent(Path<ScenarioModel>&&, id_base_t<EventModel, boost::optional<int>> const&, TimeValue_T<double> const&, ExpandMode) MoveEvent.hpp 82 0x7fffdb3dc348
15 MoveEventCSPFactory::make(Path<ScenarioModel>&&, id_base_t<EventModel, boost::optional<int>> const&, TimeValue_T<double> const&, ExpandMode) MoveEventCSPFactory.cpp 11 0x7fffdb3dc07c
16 MoveEventMeta::MoveEventMeta(Path<ScenarioModel>&&, id_base_t<EventModel, boost::optional<int>> const&, TimeValue_T<double> const&, ExpandMode) MoveEventMeta.cpp 11 0x7fffdd215ac3
17 std::make_unique<MoveEventMeta, Path<ScenarioModel>, id_base_t<EventModel, boost::optional<int>>&, TimeValue_T<double>&, ExpandMode const&>(Path<ScenarioModel>&&, id_base_t<EventModel, boost::optional<int>>&, TimeValue_T<double>&, ExpandMode const&) unique_ptr.h 765 0x7fffdd2b51fe
18 SingleOngoingCommandDispatcher<MoveEventMeta>::submitCommand<Path<ScenarioModel>, id_base_t<EventModel, boost::optional<int>>&, TimeValue_T<double>&, ExpandMode const&>(Path<ScenarioModel>&&, id_base_t<EventModel, boost::optional<int>>&, TimeValue_T<double>&, ExpandMode const&) SingleOngoingCommandDispatcher.hpp 30 0x7fffdd2b49a7
19 MoveEventState::MoveEventState(ScenarioStateMachine const&, Path<ScenarioModel> const&, iscore::CommandStack&, iscore::ObjectLocker&, QState *)::{lambda()#1}::operator()() const MoveStates.cpp 124 0x7fffdd2b1fef
... <plus>
I am confused, do you think is is comming from my side?
regards,
Simon.
ps: sorry if bad english
The license information is currently very well hidden and not exposed to PyPI and GitHub.
On large LPs I have seen the kiwi solver return values that don't satisfy the constraints even though the problem is feasible. We then remain in such an inconsistent state after further changes of the constraints. Reseting the solver seems to solve the issue.
OK, more a question than an issue... I don't think anything is buggy per-se, but would appreciate some advice.
In matplotlib we do the layout using kiwi, and it works quite well.
However, I am trying to add a constraint to set the aspect-ratio of an axes: (i.e. c = axlb.width == aspect * axlb.height | strength
), and suddenly the solver cannot handle this for many axes. For example 10x10 works fine w/o this extra constraint; but 5x5 won't converge with this constraint; 4x4 does converge, and the constraints work as expected, so I think I did them properly. By "won't converge" I mean it either just sits and spins until I kill the process, or it returns with and "unbounded" solution error.
I think what is happening is that the problem was independent in x and y before. i.e. the width calculations never needed to know about the height calculations, though I never consciously separated them. So I think the solver is solving something like 2*N problem.
However, when I introduce the constraint above, suddenly the widths and heights depend on each other, and I think the problem effectively blossoms to an N-squared problem.
The fact of the matter is that the overall layout doesn't particularly care about this new constraint - its an inner "box" that has one of its two dimensions constrained by the parent box size, and the other one by the aspect ratio. The parent box size doesn't change due to this inner box - the only reason I need the inner box is to line up the top of a colorbar with it.
So, have I just run up against a limitation of kiwi? Or is there something I should be doing to make this more robust? We could just say "you can't do that w/ a 5x5 array of axes" but that is hard to enforce.
This library use non-existent STL like std::auto_ptr
and std::binary_function
Are there plans to fix this?
Hi,
I am getting the error when I'm executing the command python3 legacy/train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/ssd_mobilenet_v1_pets.config
.
So, I have tried to install kiwisolver by following command pip3 install kiwisolver
. Even though the error not getting resolved. So, I went checked into the kiwisolver installed directory. Only one directory is available in the name "kiwisolver-1.1.0.dist-info". No kiwisolver libraries has been installed. How to install kiwisolver properly?
I am working on ubuntu 16.04.
Thanks.
As far as I know, the default implementation of Cassowary allows for "weighting" constraints of equal strength.
In short: If two constraints of equal strength existed and both can't be satisfied at once, the one with greater weight would be prioritized.
Why has this been opted out?
I'm just wondering why there is no git tag for version 0.1.3, even though on PyPI kiwisolver 0.1.3 is available.
Hi,
is there any Documentation/Guide/Reference/HowTo etc. how to use the kiwi python bindings?
Thanks!
I hope you guys will join us on overconstrained.slack.com. Request an invite by sending a mail to [email protected] or let me know on this thread.
There we can discuss all things cassowary and friends. Peeps from The Grid, Rhea and Auto Layout for iOS is there.
Hi,
when we packaged kiwisolver with conda we discovered that the package has a dependency to setuptools
.
Is this dependency really required for kiwisolver to run? I cannot see any use of the package anywhere in the source code.
I want to optimize the JS solver (especially array usage) and before I need to ensure my tests cover 100% of all code path.
Can you give a simple constraints example where _addWithArtificialVariable is beeing used.
from kiwisolver import Solver, Variable
s = Solver()
w = Variable('w')
s.addConstraint((w==1) | 1001)
s.addConstraint((w==2) | 1002)
s.addConstraint((w==3) | 1003)
s.addConstraint((w==4) | 1004)
s.updateVariables()
s.dump()
print('value of w:', w.value())
Output:
Objective
---------
4008 + 2002 * e3 + 2004 * e5 + 2002 * e6 + 4 * e7 + 2008 * e8
Tableau
-------
v1 | 3 + 1 * e6 + -1 * e7
e2 | 2 + 1 * e3 + 1 * e6 + -1 * e7
e4 | 1 + 1 * e5 + 1 * e6 + -1 * e7
e9 | 1 + -1 * e6 + 1 * e7 + 1 * e8
Infeasible
----------
Variables
---------
w = v1
Edit Variables
--------------
Constraints
-----------
1 * w + -4 == 0 | strength = 1004
1 * w + -3 == 0 | strength = 1003
1 * w + -2 == 0 | strength = 1002
1 * w + -1 == 0 | strength = 1001
('value of w:', 3.0)
The value of w should be 4.0.
I was trying to import matplotlib (which uses kiwisolver) and it failed with ImportError: DLL load failed
and it turned out it was kiwisolver which actually failed to import.
The problem was solved by installing Microsoft Visual C++ redistributable 2015. Some dependencies (maybe fore precompiled binaries) must have been missing on the fresh/clean install of Windows 10.
See also:
https://stackoverflow.com/a/38350913/4993453
matplotlib/matplotlib#14303
from kiwisolver import *
x1 = Variable('x1')
w1 = Variable('w1')
x2 = Variable('x2')
w2 = Variable('w2')
w = Variable('w')
cns = [
w >= 0,
x1 >= 0,
x2 >= 0,
w1 >= 0,
w2 >= 0,
x1 == 0.000,
w1 == 0.000,
x1 + w1 == x2,
x2 + w2 == w,
]
solver = Solver()
for cn in cns:
solver.addConstraint(cn)
solver.addEditVariable(w, strength.medium)
for value in (20,):
solver.suggestValue(w, value)
solver.updateVariables()
print 'x1', x1.value()
print 'w1', x1.value()
print
print 'x2', x2.value()
print 'w2', w2.value()
print
print 'w', w.value()
results are incorrect:
x1 20.0
w1 20.0
x2 20.0
w2 0.0
w 20.0
change x1 and w1:
x1 == 0.001,
w1 == 0.001,
results are correct:
x1 0.001
w1 0.001
x2 0.002
w2 19.998
w 20.0
Hi,
This library depends on distribute
, which works fine for python 2.7, but throws errors for python 3.6:
Collecting distribute
Using cached distribute-0.7.3.zip
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
....
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'
Quick internet searches just say "too bad, you are using the wrong version of python". Does kiwi really need distribute
?
Hi there,
I have written a program that imports kiwisolver through one of the other modules that it uses, and am trying to run it on Linux Mint 18.0. I have installed the latest version of kiwisolver from source i.e. by running python3 setup.py install. Even with kiwisolver installed, I get the following error:
Traceback (most recent call last):
File "/home/justin/Methodology_Rotation1/Quantum_Neuron_Sim/Redfield_Simulation/redfield_test.py", line 5, in
import matplotlib.pyplot as plt
File "/usr/local/lib/python3.5/dist-packages/matplotlib/pyplot.py", line 31, in
import matplotlib.colorbar
File "/usr/local/lib/python3.5/dist-packages/matplotlib/colorbar.py", line 38, in
import matplotlib.gridspec as gridspec
File "/usr/local/lib/python3.5/dist-packages/matplotlib/gridspec.py", line 29, in
import matplotlib._layoutbox as layoutbox
File "/usr/local/lib/python3.5/dist-packages/matplotlib/_layoutbox.py", line 23, in
import kiwisolver as kiwi
ImportError: No module named 'kiwisolver'
Please let me know what changes I should make to setup.py in order to ensure that kiwisolver installs correctly.
Thank you very much for your help.
We are using kiwi solver in Matplotlib for our constrained layout system. It usually works great, though we can ocasionally be hit by #15
Equally mysterious, is that very occasionally one of our complicated tests fails to find a good solution, doesn't give an error. I think we are OK with that outcome (optimization routines do not always find an optimal solution), but we were wondering if it is possible to make the outcome more deterministic? Is there is a random starting point in the optimization routine, and maybe its possible to set a seed to a single value so that "random" point is the same for each test?
Of course the fact that we get an un-optimal response sometimes possibly means the constraints have not been set up properly. But its hard to know how to test for that and see where the logic is incorrect. If we suggest values that are from a working solution will that allow it to optimize better?
Thanks a lot for any suggestions.
See matplotlib/matplotlib#12683 and matplotlib/matplotlib#12433
Since variable names are not used besides in the dump
function.
It seems that there is a name conflict with kiwi on pypi would it be possible to resolve this?
Jupyter redirects stdout and Solver.dump
writes to the real stdout... Would be more convenient if it simply returned a string, which would be displayed inline.
Hi, I encountered an issue regarding kiwisolver while trying to install the matplot package. Here is the error I am getting:
Building wheels for collected packages: kiwisolver
Building wheel for kiwisolver (setup.py) ... error
ERROR: Complete output from command /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 -u -c 'import setuptools, tokenize;__file__='"'"'/private/var/folders/y0/dvvbdzp11651gmh8z1xqh8mr0000gp/T/pip-install-n8lt67v6/kiwisolver/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/y0/dvvbdzp11651gmh8z1xqh8mr0000gp/T/pip-wheel-ilzti1fg --python-tag cp36:
ERROR: running bdist_wheel
running build
running build_ext
building 'kiwisolver' extension
creating build
creating build/temp.macosx-10.6-intel-3.6
creating build/temp.macosx-10.6-intel-3.6/py
gcc -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch i386 -arch x86_64 -g -I. -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c py/kiwisolver.cpp -o build/temp.macosx-10.6-intel-3.6/py/kiwisolver.o
warning: include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
In file included from py/kiwisolver.cpp:9:
In file included from ./kiwi/kiwi.h:9:
./kiwi/constraint.h:9:10: fatal error: 'map' file not found
#include <map>
^~~~~
1 warning and 1 error generated.
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for kiwisolver
Running setup.py clean for kiwisolver
Failed to build kiwisolver
Installing collected packages: kiwisolver, cycler, matplotlib
SolverImpl::addConstraint can fail in this code:
if( subject.type() == Symbol::Invalid )
{
if( !addWithArtificialVariable( *rowptr ) )
throw UnsatisfiableConstraint( constraint );
if addWithArtificialVariable returns false and will throw an exception. That is fine except for the fact that addWithArtificialVariable adds a row which is not deleted on failure.
The only way I could find to specify the objective function for the LP was to have all the constraint strengths be equal to zero except one, which is made so that the corresponding slack variable is what I want to minimize (up to a constant).
Is there a more elegant way to do this?
I came across this library yesterday, and I'm very impressed how much smaller and faster it is compared to the original implementation! One of the things I noticed is that there are no stay constraints. I always found them a bit of a nuisance, and if it is possible to remove them I'd like to do this as well for my own C++ Cassowary lib, Rhea.
How did you redesign stay constraints? Are they implicit for all variables now?
In dynamic environment, when constraints added and removed frequently, solver's variables map grows in size. It is because variable never removed from map even if every constraint it is used in are removed. Here is the code:
from kiwisolver import *
solver = Solver()
for i in range(10):
v = Variable("var%d"%i)
c = v == 100;
solver.addConstraint(c)
solver.removeConstraint(c)
solver.dump()
I expected no variables, but got:
Variables
---------
var0 = v1
var3 = v7
var7 = v15
var2 = v5
var9 = v19
var6 = v13
var8 = v17
var5 = v11
var1 = v3
var4 = v9
One option would be to pass -stdlib=libc++ as an option to the compiler through setuptools. It is probably the easiest way and should a minimal unwanted effect. If anybody has an opinon on this I would be interested to hear it.
The following fails when using python 2.7 (works fine w/ python 3.6).
from __future__ import unicode_literals
import kiwisolver as kiwi
Variable = kiwi.Variable
solver = kiwi.Solver()
top = Variable('boo')
with:
python testkiwi27.py
Traceback (most recent call last):
File "testkiwi27.py", line 7, in <module>
top = Variable('boo')
TypeError: __new__() argument 1 must be string, not unicode
If I remove the __future__
it works fine, but the project I'm working with uses the future, so I can't really remove it (matplotlib).
I can cast all kiwi string arbuments to String
, but maybe its a better solution for kiwi to recognize Unicode or do the cast itself?
Other string arguments fail as well (i.e. the strength arguments).
Thanks!
Can't find a C++ example, and parsing the Python binding code is a bit difficult -
Are there some available?
In this setup, there is initially one variable and two constraint. One Constraint (A) is an inequality, the other constraint (B) is an equality used to set a value on the variable. B can break A or not.
priority is a strength created like this : kiwi.Strength.create(0, 1, 0, priority).
A: variable >= 100 (priority 501)
B: variable = 90 (500)
After solving, the result is variable = 100 and is the expected result.
Now, if I add another equality constraint C with a very low priority variable = 50 (10)
the variable value after solving is 90. It means that adding this constraint helps constraint B to break constraint A even if constraint B priority < A priority && C priority < A&B priority.
With the C constraint, the A priority needed to break constraint B is equal to (B + C).
A: variable >= 100 (501)
B: variable = 90 (500)
C: variable = 10 (10)
=> variable == 90 (Not expected)
A: variable >= 100 (511)
B: variable = 90 (500)
C: variable = 10 (10)
=> variable == 100 (Expected)
I also tried to suggestValue(variable, 90) instead of using constraint B and got the same results.
It seems that a third constraint affects the priority at which a constraint beats another , even if this third constraint priority is lower than the two other constraints fighting.
Is this a bug or the regular behavior ?
Test here: https://runkit.com/cacaodev/kiwi-bug (Hit the green button to run the test).
Format of exponent in output string appears to be different from other platforms on Windows Python 2.7 and 3.4:
================================== FAILURES ===================================
__________________________ test_constraint_creation ___________________________
def test_constraint_creation():
"""Test constraints creation and methods.
"""
v = Variable('foo')
c = Constraint(v + 1, '==')
assert c.strength() == strength.required and c.op() == '=='
e = c.expression()
t = e.terms()
assert (e.constant() == 1 and
len(t) == 1 and t[0].variable() is v and t[0].coefficient() == 1)
> assert str(c) == '1 * foo + 1 == 0 | strength = 1.001e+09'
E AssertionError: assert '1 * foo + 1 ... = 1.001e+009' == '1 * foo + 1 =...h = 1.001e+09'
E - 1 * foo + 1 == 0 | strength = 1.001e+009
E ? -
E + 1 * foo + 1 == 0 | strength = 1.001e+09
..\kiwi\py\tests\test_constraint.py:25: AssertionError
Maybe worth a platform check in the test?
Would you consider switching to MIT license? I love MIT for its simplicity.
Just let you know that Sciter Engine is using Kiwi for some flow calculations.
This style:
section {
flow: grid(1 2,
3 3);
with this markup
<section>
<div>1</div>
<div>2</div>
<div>3 (second row, spans two columns)</div>
</section>
invokes kiwi constraint solver.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.