ganessa


Nameganessa JSON
Version 2.4.6 PyPI version JSON
download
home_pageNone
SummaryPython interface to Piccolo/Ganessa_SIM and Picalor simulation kernel
upload_time2024-11-04 10:22:18
maintainerNone
docs_urlNone
authorDr. Pierre Antoine Jarrige
requires_python<4,>=3.5
licensecommercial
keywords piccolo picalor ganessa
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            Piccolo5/Piccolo6/Picalor6 and Ganessa_SIM API python calling interface

What is it?
-----------
A python package enabling users to call a set of Picwin32.dll or Ganessa_SIM.dll API functions and subroutines within python scripts. Initially provided for python 2.7 32 bits only. 1.9.x versions served as python 3.5 / 3.6 pre-release.

Starting with version 2.0.0, the wheel package is provided for 32 bits version for python 2.7 / 3.5 / 3.6 / 3.7 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.6 / 3.7 (Ganessa_SIM is available as 32 and 64 bits).

Starting with version 2.1.0, the wheel package is provided for 32 bits version for python 2.7 / 3.7 / 3.8 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.7 / 3.8 (Ganessa_SIM is available as 32 and 64 bits).

Starting with version 2.1.8, the wheel package is provided for 32 bits version for python 2.7 / 3.7 / 3.8 / 3.9 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.7 / 3.8 / 3.9 (Ganessa_SIM is available as 32 and 64 bits).

Version 2.1.9 is the last version that supported python 2.7.
Version 2.2.4 is the last version for which a wheel is provided for python 3.7.

Starting with version 2.2.5, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 (Ganessa_SIM is available as 32 and 64 bits).

Starting with version 2.3.3, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 / 3.11 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 / 3.11 (Ganessa_SIM is available as 32 and 64 bits).

Starting with version 2.3.10, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 (Ganessa_SIM is available as 32 and 64 bits).

Starting with version 2.4.2, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 / 3.13 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 / 3.13 (Ganessa_SIM is available as 32 and 64 bits).

Installation
------------
*Windows only* :: 

    pip install ganessa

Obsolete Requirements (32 bits)
-------------------------------
  #) python 2.7, 3.5, 3.6, 3.7
  #) obsolete python requirements: numpy 1.11 or above (python 2.7) / numpy 1.13.1 or above (python 3.5 - 3.6) / numpy 1.15.1 (python 3.7)
  #) Piccolo or Picalor kernel library (picwin32.dll), starting from version 5 (141203) for python 2.7
  #) valid Piccolo or Picalor or Ganessa_SIM license

Requirements (32 bits)
----------------------
  #) python 3.8 - 3.13
  #) numpy 1.15.1 (python 3.8) / numpy 1.19.4 (python 3.9) / numpy 1.21.3 (python 3.10) / numpy 1.23.3 (python 3.11+)
  #) numpy < 2.0 if python < 3.12 or ganessa < 2.4.4
  #) Piccolo6 or Picalor6 kernel library (picwin32.dll), or recent Ganessa_SIM.dll.
     Note that a recent (2020 or newer) version of Piccolo kernel is required for use with python 3.12
  #) valid Piccolo or Picalor or Ganessa_SIM license (for commercial releases)

Requirements (64 bits)
----------------------
  #) python 3.8 - 3.13
  #) numpy 1.15.1 (python 3.8) / numpy 1.19.4 (python 3.9) / numpy 1.21.3 (python 3.10) / numpy 1.23.3 (python 3.11+)
  #) numpy < 2.0 if python < 3.12 or ganessa < 2.4.4
  #) recent Ganessa_SIM_x64.dll (64 bit dll)
  #) valid Ganessa_SIM license (for commercial releases)


This tool expects Picwin32.dll to be in the PATH or in one of the following folders::

                 %localappdata%/Programs/Safege/Piccolo_ or
                 %localappdata%/Programs/Suez/Piccolo_ or
                 %localappdata%/Programs/Gfi Progiciels/Piccolo6_ or
                 %localappdata%/Programs/Inetum/Piccolo6_ or
 [[E: or D:] or C:] / [
                 'Program Files (x86)/Safege/Piccolo_' or
                 'Program Files (x86)/Suez/Piccolo_' or
                 'Program Files (x86)/Gfi Progiciels/Piccolo6_'  or
                 'Program Files (x86)/Inetum/Piccolo6_'  or
                 'Program Files (x86)/Gfi Progiciels/Picalor6_' or
                 'Program Files/Adelior/Piccolo5_'
                ]
              + ['fr' or 'uk' or 'esp' or 'eng'] + ['' or '_ck']

Or one of Ganessa_SIM.dll or Ganessa_TH.dll or Ganessa_SIM_x64.dll in::

            '%localappdata%/Programs/Safege/Ganessa_ or
            '%localappdata%/Programs/Suez/Ganessa_ or
 [[E: or D:] or C:] / [
                'Program Files (x86)/Safege/Ganessa_' or 
                'Program Files (x86)/Suez/Ganessa_' or
                'Program Files/Safege/Ganessa_' (Ganessa_SIM_x64 only) or 
                'Program Files/Suez/Ganessa_' (Ganessa_SIM_x64 only)
               ]
              + ['fr' or 'uk' or 'esp' or 'eng']

With custom installations, PICCOLO_DIR or GANESSA_DIR environment variables can be set to define the path. 

Content
-------

The package provides:
 #) 'sim' package:
     - a few basic functions for reading or loading a model, running hydraulic and WQ simulations.
     - 'getter' functions for individual objects and attributes, time series vectors, attribute vector of all object (attribute maps).
     - iterators over links, nodes, tanks, demands, and tables, or over Piccolo command language selections.
     - a Graph class built from the current model graph, with propagation functions.
     - almost no 'setter' functions, but 'cmd', 'execute' and 'cmdfile' any Piccolo command language instruction(s)/file.
 #) 'th' package: same functions for Picalor except running extended period simulations and time series getters.
 #) 'util' package: conversion and formatting and other miscellaneous functions.
 #) 'OpenFileMMI' provides classes for opening dialog frame for a .dat/.bin/.pic/.inp model file (see en2emu below), folder, and input/output (result) file. It should be imported after 'sim' or 'th'.
 #) 'plot' provides easy multiple simulation vs reference graphs plot settings - requires matplotlib.
 #) 'proj' provides a 'guess_proj' function returning the model CRS as EPSG:xxxx or mnemonic, and 'get_spatial_ref'
 #) 'sort' provides a heapsort based on heapq.
 #) 'midfile' provides minimal mif/mid functions similar to shp/dbf shapefile handler (pyshp package).
 #) 'geojsonfile' provides minimal geojson functions similar to shp/dbf shapefile handler (pyshp package).
 #) 'epanet2' provides limited epanet2.0.12 python API for win32 (thanks to Assela Pathirana - mailto: assela@pathirana.net) similar to EpanetTools-0.4.2; with epanet.getlinknodes and calculation of tank diameter corrected (from 0.9.2 and 1.0.0).
 #) 'epanet22' provides a single threaded, low-level python API for epanet2.2, equivalent/compatible with above epanet2.
 #) 'owa_epanet22' provides an EpanetTools compatibility layer for owa-epanet 2.2.3/2.3.4: it defines EN_XXX constants and single project ENxxx API functions. All owa-epanet API functions are available.
 #) 'en2emu' provides minimal 'sim' compatibility for Epanet models being opened with OpenFileMMI.SelectModel, wrapper functions for running hydraulic and WQ simulations and collecting results as numpy arrays, iterators etc. See the doc.
 #) 'parallel' provides a simple parallel simulations handling framework based on multiprocessing, returning either elementary or reduced results.

Model objects and parameters can be modified using Piccolo command language (see cmd, cmdfile and execute).

Recently introduced functions and classes may not be functional with old versions of Piccolo / Ganessa_SIM kernel.

Documentation
-------------
Documentation is provided as pyGanessa.html in the installation folder, possibly in docs subfolder. It includes package history.

History of the README document
------------------------------
 - Created 2013-07-04
 - Revised 2015-05-03: since 2014-12-04 Picwin32.dll is compatible with this API.
 - Revised 2016-07-07: provided as .rst.
 - Revised 2017-08-08: install using pip; Piccolo/Ganessa dll folder search order.
 - Revised 2017-09-12: split sim into core, core_sim, core_th.
 - Revised 2017-11-13: added sort, midfile, epanet2 modules.
 - Revised 2017-11-30: added parallel.
 - Revised 2018-03-29: minor changes / extension to python 3.5-3.6.
 - Revised 2018-06-08: OpenFileMMI and epanet2 details, added example.
 - Revised 2018-08-16: 64 bits compatibility (Ganessa_SIM and python 3.7 / 3.8 only).
 - Revised 2018-08-27: numpy requirements.
 - Revised 2019-09-13: minor changes.
 - Revised 2019-10-09: extension to python 3.8.
 - Revised 2019-10-15: README rst fix.
 - Revised 2020-02-05: added sim.Graph; README rst fix.
 - Revised 2020-11-20: README rst fix.
 - Revised 2021-04-29: extension to python 3.9.
 - Revised 2021-06-17: python 2.7 compatibility removed since 2.2.0; folder lookup paths.
 - Revised 2021-10-27: python 3.7 removed & python 3.10 added since 2.2.5.
 - Revised 2022-04-21: dll lookup order as E:, D:, C:; example updated.
 - Revised 2022-09-27: python 3.11 added; proj package added.
 - Revised 2023-07-12: added epanet22.
 - Revised 2023-08-10: added owa_epanet22.
 - Revised 2023-10-18: added en2emu.
 - Revised 2023-11-06: added python 3.12.
 - Revised 2024-01-17: updated 64 bits requirements.
 - Revised 2024-03-18: updated .dll search paths.
 - Revised 2024-06-16: added python 3.13; fixed lookup paths.
 - Revised 2024-07-11: numpy 2.0 restriction to ganessa >= 2.4.4 and python >= 3.12

Examples
--------

::


 
 # file: Example_EN.py
 """Example program for ganessa
 requires a Piccolo model 'model.dat' in the current folder
 Example using English command language"""
 
 import os
 import matplotlib.pyplot as plt
 import ganessa.sim as pic
 
 # This code sample runs under python 3.8+
 # but requires ganessa 2.3.0 or higher
 
 if __name__ == "__main__":
     wkfold = os.path.dirname(__file__)
     if not wkfold:
         wkfold = os.getcwd()
         print("Current folder is:", wkfold)
     os.chdir(wkfold)
     # will create work files here
     pic.init(wkfold)
     # loads the model - change the name here...
     pic.cmdfile("model.dat")
     # select small pipe (diameter below 155)
     # using iterator and D getter, by id
     def pipefilter(diameter):
         return 0 < diameter < 155
     pipes = [p for p in pic.Links() if pipefilter(pic.linkattr(p, "D"))]
     # using iterator and D getter, by index (less concise but slightly faster)
     pipes = [
         pic.getid(pic.LINK, k)
         for k in range(1, pic.nbobjects(pic.LINK) + 1)
         if pipefilter(pic.nlinkattr(k, "D"))
     ]
     # Most Piccoloic, using (english) command language selection
     pic.setlang("English")
     # Selectid has been introduced in 2.3.0; it is equivalent to Selected(..., False)
     pipes = list(pic.Selectid("PIPE (D < 155) END"))
     # minimal setter functions for links, nodes, tanks attributes
     pid = pipes[len(pipes) // 2]
     diam = pic.linkattr(pid, "D")
     pic.setlinkattr(pid, "D", diam * 2)
     # language-independant commands: MODIF MULT D 2 BRANCH {pid} END
     KWEND = pic.getkeyword(pic.DICT.END)
     pic.gencmdw(pic.M.MOD, pic.M.MOD.MULT, pic.M.NONE, "D 2")
     pic.gencmd(pic.M.LNK, pic.M.LNK.NONE, pic.M.NONE, pid + " " + KWEND, 1)
     # Use command language to set / modify / delete objects
     pic.execute("MODIF", f"DELETE BRANCH {pid} END")
     pic.execute("MODIF", "MERGE NODE (AB = 1) END", "MERGE NODE (AB = 1) END")
     # or change parameters
     pic.execute("SIMUL", "CRITX 0.05", "MXITER 75")
     # get demand profile TS
     nb = pic.tsdemandlen("DEFAUT", "HAUT")
     print("Profile length for area HAUT:", nb)
     res = pic.tsdemand("DEFAUT", "HAUT")
     # Unlike epanet, first run simulation then browse/ query results
     pic.full_solveH(silent=True, retry=True)
     print("Simulation done.")
     pic.browseH(3600 * 8.5)
     fig = plt.figure(figsize=(16 - 1, 9 - 1))
     # plot 3D elevation and hydraulic head
     ax = fig.add_subplot(projection="3d")
     for a in pic.Links():
         x, y, z, v, nb = pic.linkXYZV(a, "HH")
         if nb > 0:
             ax.plot(x, y, z, "r-")
             ax.plot(x, y, v, "b-")
     plt.title("Hydraulic head at t= 08:30")
     plt.show()
     # print min/max pressure over the EPS
     attr = "P"
     minpax_p = list(pic.getMinMax(pic.NODE, attr))
     for nid, vmin, vmax, vmoy in minpax_p[:10]:
         print(nid, attr + "min:", vmin, attr + "max:", vmax)
     print("\t...")
     for nid, vmin, vmax, vmoy in minpax_p[-10:]:
         print(nid, attr + "min:", vmin, attr + "max:", vmax)
     # get current volume simulation (internal variable steps) and measurement TS
     for tid in pic.Tanks():
         t1, v1, nb1 = pic.tsval(pic.TANK, tid, "CV")
         t2, v2, nb2 = pic.msval(pic.TANK, tid, "CV")
     # get current volume simulation results at measurement sampling
     for tid in pic.Tanks():
         t3, v3, nb3 = pic.tsvalbymts(pic.TANK, tid, "CV")
     # export as Epanet .inp
     pic.exportEpanet("model.inp")
     pic.execute("XXMEM BRANCH : D")
     pic.savemodel("model_xx.dat", extra_data=[("BRANCH (D > 149) END", "XX")])
     # WQ source data optional argument is a specific node - not used here
     print("\nWQ source data (input forcing and TS at nodes):")
     for n, cd, attr, t, c, nb in pic.WQSources():
         print(n, cd, attr, nb, t, c)
     print("Done.")
     # use reset() for switching model, close() to terminate
     pic.close()

 
 
 # file: Example_FR.py
 """Example program for ganessa
 requires a Piccolo model 'model.dat' in the current folder
 Example using French command language"""
 
 import os
 import matplotlib.pyplot as plt
 import ganessa.sim as pic
 
 # This code sample runs under python 3.8+
 # but requires ganessa 2.3.0 or higher
 
 if __name__ == "__main__":
     wkfold = os.path.dirname(__file__)
     if not wkfold:
         wkfold = os.getcwd()
         print("Current folder is:", wkfold)
     os.chdir(wkfold)
     # will create work files here
     pic.init(wkfold)
     # loads the model - change the name here...
     pic.cmdfile("model.dat")
     # select small pipe (diameter below 155)
     # using iterator and D getter, by id
     def pipefilter(diameter):
         return 0 < diameter < 155
     pipes = [p for p in pic.Links() if pipefilter(pic.linkattr(p, "D"))]
     # using iterator and D getter, by index (less concise but slightly faster)
     pipes = [
         pic.getid(pic.LINK, k)
         for k in range(1, pic.nbobjects(pic.LINK) + 1)
         if pipefilter(pic.nlinkattr(k, "D"))
     ]
     # Most Piccoloic, using (french) command language selection
     pic.setlang("French")
     # Selectid has been introduced in 2.3.0; it is equivalent to Selected(..., False)
     pipes = list(pic.Selectid("TUYAU (D < 155) FIN"))
     # minimal setter functions for links, nodes, tanks attributes
     pid = pipes[len(pipes) // 2]
     diam = pic.linkattr(pid, "D")
     pic.setlinkattr(pid, "D", diam * 2)
     # language-independant commands: MODIF MULT D 2 ARC {pid} FIN
     KWEND = pic.getkeyword(pic.DICT.END)
     pic.gencmdw(pic.M.MOD, pic.M.MOD.MULT, pic.M.NONE, "D 2")
     pic.gencmd(pic.M.LNK, pic.M.LNK.NONE, pic.M.NONE, pid + " " + KWEND, 1)
     # Use command language to set / modify / delete objects
     pic.execute("MODIF", f"DETR ARC {pid} FIN")
     pic.execute("MODIF", "FUSION NOEU (AA = 1) FIN", "FUSION NOEU (AA = 1) FIN")
     # or change parameters
     pic.execute("SIMUL", "CRITX 0.05", "MXITER 75")
     # get demand profile TS
     nb = pic.tsdemandlen("DEFAUT", "HAUT")
     print("Profile length for area HAUT:", nb)
     res = pic.tsdemand("DEFAUT", "HAUT")
     # Unlike epanet, first run simulation then browse/ query results
     pic.full_solveH(silent=True, retry=True)
     print("Simulation done.")
     pic.browseH(3600 * 8.5)
     fig = plt.figure(figsize=(16 - 1, 9 - 1))
     # plot 3D elevation and hydraulic head
     ax = fig.add_subplot(projection="3d")
     for a in pic.Links():
         x, y, z, v, nb = pic.linkXYZV(a, "CH")
         if nb > 0:
             ax.plot(x, y, z, "r-")
             ax.plot(x, y, v, "b-")
     plt.title("Plan de charge a t= 08:30")
     plt.show()
     # print min/max pressure over the EPS
     attr = "P"
     minpax_p = list(pic.getMinMax(pic.NODE, attr))
     for nid, vmin, vmax, vmoy in minpax_p[:10]:
         print(nid, attr + "min:", vmin, attr + "max:", vmax)
     print("\t...")
     for nid, vmin, vmax, vmoy in minpax_p[-10:]:
         print(nid, attr + "min:", vmin, attr + "max:", vmax)
     # get current volume simulation (internal variable steps) and measurement TS
     for tid in pic.Tanks():
         t1, v1, nb1 = pic.tsval(pic.TANK, tid, "VC")
         t2, v2, nb2 = pic.msval(pic.TANK, tid, "VC")
     # get current volume simulation results at measurement sampling
     for tid in pic.Tanks():
         t3, v3, nb3 = pic.tsvalbymts(pic.TANK, tid, "VC")
     # export as Epanet .inp
     pic.exportEpanet("model.inp")
     pic.execute("XXMEM ARC : D")
     pic.savemodel("model_xx.dat", extra_data=[("ARC (D > 149) FIN", "XX")])
     # WQ source data optional argument is a specific node - not used here
     print("\nWQ source data (input forcing and TS at nodes):")
     for n, cd, attr, t, c, nb in pic.WQSources():
         print(n, cd, attr, nb, t, c)
     print("Done.")
     # use reset() for switching model, close() to terminate
     pic.close()

 


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ganessa",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4,>=3.5",
    "maintainer_email": null,
    "keywords": "Piccolo Picalor Ganessa",
    "author": "Dr. Pierre Antoine Jarrige",
    "author_email": "ganessa@safege.fr",
    "download_url": null,
    "platform": null,
    "description": "Piccolo5/Piccolo6/Picalor6 and Ganessa_SIM API python calling interface\n\nWhat is it?\n-----------\nA python package enabling users to call a set of Picwin32.dll or Ganessa_SIM.dll API functions and subroutines within python scripts. Initially provided for python 2.7 32 bits only. 1.9.x versions served as python 3.5 / 3.6 pre-release.\n\nStarting with version 2.0.0, the wheel package is provided for 32 bits version for python 2.7 / 3.5 / 3.6 / 3.7 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.6 / 3.7 (Ganessa_SIM is available as 32 and 64 bits).\n\nStarting with version 2.1.0, the wheel package is provided for 32 bits version for python 2.7 / 3.7 / 3.8 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.7 / 3.8 (Ganessa_SIM is available as 32 and 64 bits).\n\nStarting with version 2.1.8, the wheel package is provided for 32 bits version for python 2.7 / 3.7 / 3.8 / 3.9 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.7 / 3.8 / 3.9 (Ganessa_SIM is available as 32 and 64 bits).\n\nVersion 2.1.9 is the last version that supported python 2.7.\nVersion 2.2.4 is the last version for which a wheel is provided for python 3.7.\n\nStarting with version 2.2.5, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 (Ganessa_SIM is available as 32 and 64 bits).\n\nStarting with version 2.3.3, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 / 3.11 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 / 3.11 (Ganessa_SIM is available as 32 and 64 bits).\n\nStarting with version 2.3.10, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 (Ganessa_SIM is available as 32 and 64 bits).\n\nStarting with version 2.4.2, the wheel package is provided for 32 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 / 3.13 (Piccolo kernel is a 32 bits application) and 64 bits version for python 3.8 / 3.9 / 3.10 / 3.11 / 3.12 / 3.13 (Ganessa_SIM is available as 32 and 64 bits).\n\nInstallation\n------------\n*Windows only* :: \n\n    pip install ganessa\n\nObsolete Requirements (32 bits)\n-------------------------------\n  #) python 2.7, 3.5, 3.6, 3.7\n  #) obsolete python requirements: numpy 1.11 or above (python 2.7) / numpy 1.13.1 or above (python 3.5 - 3.6) / numpy 1.15.1 (python 3.7)\n  #) Piccolo or Picalor kernel library (picwin32.dll), starting from version 5 (141203) for python 2.7\n  #) valid Piccolo or Picalor or Ganessa_SIM license\n\nRequirements (32 bits)\n----------------------\n  #) python 3.8 - 3.13\n  #) numpy 1.15.1 (python 3.8) / numpy 1.19.4 (python 3.9) / numpy 1.21.3 (python 3.10) / numpy 1.23.3 (python 3.11+)\n  #) numpy < 2.0 if python < 3.12 or ganessa < 2.4.4\n  #) Piccolo6 or Picalor6 kernel library (picwin32.dll), or recent Ganessa_SIM.dll.\n     Note that a recent (2020 or newer) version of Piccolo kernel is required for use with python 3.12\n  #) valid Piccolo or Picalor or Ganessa_SIM license (for commercial releases)\n\nRequirements (64 bits)\n----------------------\n  #) python 3.8 - 3.13\n  #) numpy 1.15.1 (python 3.8) / numpy 1.19.4 (python 3.9) / numpy 1.21.3 (python 3.10) / numpy 1.23.3 (python 3.11+)\n  #) numpy < 2.0 if python < 3.12 or ganessa < 2.4.4\n  #) recent Ganessa_SIM_x64.dll (64 bit dll)\n  #) valid Ganessa_SIM license (for commercial releases)\n\n\nThis tool expects Picwin32.dll to be in the PATH or in one of the following folders::\n\n                 %localappdata%/Programs/Safege/Piccolo_ or\n                 %localappdata%/Programs/Suez/Piccolo_ or\n                 %localappdata%/Programs/Gfi Progiciels/Piccolo6_ or\n                 %localappdata%/Programs/Inetum/Piccolo6_ or\n [[E: or D:] or C:] / [\n                 'Program Files (x86)/Safege/Piccolo_' or\n                 'Program Files (x86)/Suez/Piccolo_' or\n                 'Program Files (x86)/Gfi Progiciels/Piccolo6_'  or\n                 'Program Files (x86)/Inetum/Piccolo6_'  or\n                 'Program Files (x86)/Gfi Progiciels/Picalor6_' or\n                 'Program Files/Adelior/Piccolo5_'\n                ]\n              + ['fr' or 'uk' or 'esp' or 'eng'] + ['' or '_ck']\n\nOr one of Ganessa_SIM.dll or Ganessa_TH.dll or Ganessa_SIM_x64.dll in::\n\n            '%localappdata%/Programs/Safege/Ganessa_ or\n            '%localappdata%/Programs/Suez/Ganessa_ or\n [[E: or D:] or C:] / [\n                'Program Files (x86)/Safege/Ganessa_' or \n                'Program Files (x86)/Suez/Ganessa_' or\n                'Program Files/Safege/Ganessa_' (Ganessa_SIM_x64 only) or \n                'Program Files/Suez/Ganessa_' (Ganessa_SIM_x64 only)\n               ]\n              + ['fr' or 'uk' or 'esp' or 'eng']\n\nWith custom installations, PICCOLO_DIR or GANESSA_DIR environment variables can be set to define the path. \n\nContent\n-------\n\nThe package provides:\n #) 'sim' package:\n     - a few basic functions for reading or loading a model, running hydraulic and WQ simulations.\n     - 'getter' functions for individual objects and attributes, time series vectors, attribute vector of all object (attribute maps).\n     - iterators over links, nodes, tanks, demands, and tables, or over Piccolo command language selections.\n     - a Graph class built from the current model graph, with propagation functions.\n     - almost no 'setter' functions, but 'cmd', 'execute' and 'cmdfile' any Piccolo command language instruction(s)/file.\n #) 'th' package: same functions for Picalor except running extended period simulations and time series getters.\n #) 'util' package: conversion and formatting and other miscellaneous functions.\n #) 'OpenFileMMI' provides classes for opening dialog frame for a .dat/.bin/.pic/.inp model file (see en2emu below), folder, and input/output (result) file. It should be imported after 'sim' or 'th'.\n #) 'plot' provides easy multiple simulation vs reference graphs plot settings - requires matplotlib.\n #) 'proj' provides a 'guess_proj' function returning the model CRS as EPSG:xxxx or mnemonic, and 'get_spatial_ref'\n #) 'sort' provides a heapsort based on heapq.\n #) 'midfile' provides minimal mif/mid functions similar to shp/dbf shapefile handler (pyshp package).\n #) 'geojsonfile' provides minimal geojson functions similar to shp/dbf shapefile handler (pyshp package).\n #) 'epanet2' provides limited epanet2.0.12 python API for win32 (thanks to Assela Pathirana - mailto: assela@pathirana.net) similar to EpanetTools-0.4.2; with epanet.getlinknodes and calculation of tank diameter corrected (from 0.9.2 and 1.0.0).\n #) 'epanet22' provides a single threaded, low-level python API for epanet2.2, equivalent/compatible with above epanet2.\n #) 'owa_epanet22' provides an EpanetTools compatibility layer for owa-epanet 2.2.3/2.3.4: it defines EN_XXX constants and single project ENxxx API functions. All owa-epanet API functions are available.\n #) 'en2emu' provides minimal 'sim' compatibility for Epanet models being opened with OpenFileMMI.SelectModel, wrapper functions for running hydraulic and WQ simulations and collecting results as numpy arrays, iterators etc. See the doc.\n #) 'parallel' provides a simple parallel simulations handling framework based on multiprocessing, returning either elementary or reduced results.\n\nModel objects and parameters can be modified using Piccolo command language (see cmd, cmdfile and execute).\n\nRecently introduced functions and classes may not be functional with old versions of Piccolo / Ganessa_SIM kernel.\n\nDocumentation\n-------------\nDocumentation is provided as pyGanessa.html in the installation folder, possibly in docs subfolder. It includes package history.\n\nHistory of the README document\n------------------------------\n - Created 2013-07-04\n - Revised 2015-05-03: since 2014-12-04 Picwin32.dll is compatible with this API.\n - Revised 2016-07-07: provided as .rst.\n - Revised 2017-08-08: install using pip; Piccolo/Ganessa dll folder search order.\n - Revised 2017-09-12: split sim into core, core_sim, core_th.\n - Revised 2017-11-13: added sort, midfile, epanet2 modules.\n - Revised 2017-11-30: added parallel.\n - Revised 2018-03-29: minor changes / extension to python 3.5-3.6.\n - Revised 2018-06-08: OpenFileMMI and epanet2 details, added example.\n - Revised 2018-08-16: 64 bits compatibility (Ganessa_SIM and python 3.7 / 3.8 only).\n - Revised 2018-08-27: numpy requirements.\n - Revised 2019-09-13: minor changes.\n - Revised 2019-10-09: extension to python 3.8.\n - Revised 2019-10-15: README rst fix.\n - Revised 2020-02-05: added sim.Graph; README rst fix.\n - Revised 2020-11-20: README rst fix.\n - Revised 2021-04-29: extension to python 3.9.\n - Revised 2021-06-17: python 2.7 compatibility removed since 2.2.0; folder lookup paths.\n - Revised 2021-10-27: python 3.7 removed & python 3.10 added since 2.2.5.\n - Revised 2022-04-21: dll lookup order as E:, D:, C:; example updated.\n - Revised 2022-09-27: python 3.11 added; proj package added.\n - Revised 2023-07-12: added epanet22.\n - Revised 2023-08-10: added owa_epanet22.\n - Revised 2023-10-18: added en2emu.\n - Revised 2023-11-06: added python 3.12.\n - Revised 2024-01-17: updated 64 bits requirements.\n - Revised 2024-03-18: updated .dll search paths.\n - Revised 2024-06-16: added python 3.13; fixed lookup paths.\n - Revised 2024-07-11: numpy 2.0 restriction to ganessa >= 2.4.4 and python >= 3.12\n\nExamples\n--------\n\n::\n\n\n \n # file: Example_EN.py\n \"\"\"Example program for ganessa\n requires a Piccolo model 'model.dat' in the current folder\n Example using English command language\"\"\"\n \n import os\n import matplotlib.pyplot as plt\n import ganessa.sim as pic\n \n # This code sample runs under python 3.8+\n # but requires ganessa 2.3.0 or higher\n \n if __name__ == \"__main__\":\n     wkfold = os.path.dirname(__file__)\n     if not wkfold:\n         wkfold = os.getcwd()\n         print(\"Current folder is:\", wkfold)\n     os.chdir(wkfold)\n     # will create work files here\n     pic.init(wkfold)\n     # loads the model - change the name here...\n     pic.cmdfile(\"model.dat\")\n     # select small pipe (diameter below 155)\n     # using iterator and D getter, by id\n     def pipefilter(diameter):\n         return 0 < diameter < 155\n     pipes = [p for p in pic.Links() if pipefilter(pic.linkattr(p, \"D\"))]\n     # using iterator and D getter, by index (less concise but slightly faster)\n     pipes = [\n         pic.getid(pic.LINK, k)\n         for k in range(1, pic.nbobjects(pic.LINK) + 1)\n         if pipefilter(pic.nlinkattr(k, \"D\"))\n     ]\n     # Most Piccoloic, using (english) command language selection\n     pic.setlang(\"English\")\n     # Selectid has been introduced in 2.3.0; it is equivalent to Selected(..., False)\n     pipes = list(pic.Selectid(\"PIPE (D < 155) END\"))\n     # minimal setter functions for links, nodes, tanks attributes\n     pid = pipes[len(pipes) // 2]\n     diam = pic.linkattr(pid, \"D\")\n     pic.setlinkattr(pid, \"D\", diam * 2)\n     # language-independant commands: MODIF MULT D 2 BRANCH {pid} END\n     KWEND = pic.getkeyword(pic.DICT.END)\n     pic.gencmdw(pic.M.MOD, pic.M.MOD.MULT, pic.M.NONE, \"D 2\")\n     pic.gencmd(pic.M.LNK, pic.M.LNK.NONE, pic.M.NONE, pid + \" \" + KWEND, 1)\n     # Use command language to set / modify / delete objects\n     pic.execute(\"MODIF\", f\"DELETE BRANCH {pid} END\")\n     pic.execute(\"MODIF\", \"MERGE NODE (AB = 1) END\", \"MERGE NODE (AB = 1) END\")\n     # or change parameters\n     pic.execute(\"SIMUL\", \"CRITX 0.05\", \"MXITER 75\")\n     # get demand profile TS\n     nb = pic.tsdemandlen(\"DEFAUT\", \"HAUT\")\n     print(\"Profile length for area HAUT:\", nb)\n     res = pic.tsdemand(\"DEFAUT\", \"HAUT\")\n     # Unlike epanet, first run simulation then browse/ query results\n     pic.full_solveH(silent=True, retry=True)\n     print(\"Simulation done.\")\n     pic.browseH(3600 * 8.5)\n     fig = plt.figure(figsize=(16 - 1, 9 - 1))\n     # plot 3D elevation and hydraulic head\n     ax = fig.add_subplot(projection=\"3d\")\n     for a in pic.Links():\n         x, y, z, v, nb = pic.linkXYZV(a, \"HH\")\n         if nb > 0:\n             ax.plot(x, y, z, \"r-\")\n             ax.plot(x, y, v, \"b-\")\n     plt.title(\"Hydraulic head at t= 08:30\")\n     plt.show()\n     # print min/max pressure over the EPS\n     attr = \"P\"\n     minpax_p = list(pic.getMinMax(pic.NODE, attr))\n     for nid, vmin, vmax, vmoy in minpax_p[:10]:\n         print(nid, attr + \"min:\", vmin, attr + \"max:\", vmax)\n     print(\"\\t...\")\n     for nid, vmin, vmax, vmoy in minpax_p[-10:]:\n         print(nid, attr + \"min:\", vmin, attr + \"max:\", vmax)\n     # get current volume simulation (internal variable steps) and measurement TS\n     for tid in pic.Tanks():\n         t1, v1, nb1 = pic.tsval(pic.TANK, tid, \"CV\")\n         t2, v2, nb2 = pic.msval(pic.TANK, tid, \"CV\")\n     # get current volume simulation results at measurement sampling\n     for tid in pic.Tanks():\n         t3, v3, nb3 = pic.tsvalbymts(pic.TANK, tid, \"CV\")\n     # export as Epanet .inp\n     pic.exportEpanet(\"model.inp\")\n     pic.execute(\"XXMEM BRANCH : D\")\n     pic.savemodel(\"model_xx.dat\", extra_data=[(\"BRANCH (D > 149) END\", \"XX\")])\n     # WQ source data optional argument is a specific node - not used here\n     print(\"\\nWQ source data (input forcing and TS at nodes):\")\n     for n, cd, attr, t, c, nb in pic.WQSources():\n         print(n, cd, attr, nb, t, c)\n     print(\"Done.\")\n     # use reset() for switching model, close() to terminate\n     pic.close()\n\n \n \n # file: Example_FR.py\n \"\"\"Example program for ganessa\n requires a Piccolo model 'model.dat' in the current folder\n Example using French command language\"\"\"\n \n import os\n import matplotlib.pyplot as plt\n import ganessa.sim as pic\n \n # This code sample runs under python 3.8+\n # but requires ganessa 2.3.0 or higher\n \n if __name__ == \"__main__\":\n     wkfold = os.path.dirname(__file__)\n     if not wkfold:\n         wkfold = os.getcwd()\n         print(\"Current folder is:\", wkfold)\n     os.chdir(wkfold)\n     # will create work files here\n     pic.init(wkfold)\n     # loads the model - change the name here...\n     pic.cmdfile(\"model.dat\")\n     # select small pipe (diameter below 155)\n     # using iterator and D getter, by id\n     def pipefilter(diameter):\n         return 0 < diameter < 155\n     pipes = [p for p in pic.Links() if pipefilter(pic.linkattr(p, \"D\"))]\n     # using iterator and D getter, by index (less concise but slightly faster)\n     pipes = [\n         pic.getid(pic.LINK, k)\n         for k in range(1, pic.nbobjects(pic.LINK) + 1)\n         if pipefilter(pic.nlinkattr(k, \"D\"))\n     ]\n     # Most Piccoloic, using (french) command language selection\n     pic.setlang(\"French\")\n     # Selectid has been introduced in 2.3.0; it is equivalent to Selected(..., False)\n     pipes = list(pic.Selectid(\"TUYAU (D < 155) FIN\"))\n     # minimal setter functions for links, nodes, tanks attributes\n     pid = pipes[len(pipes) // 2]\n     diam = pic.linkattr(pid, \"D\")\n     pic.setlinkattr(pid, \"D\", diam * 2)\n     # language-independant commands: MODIF MULT D 2 ARC {pid} FIN\n     KWEND = pic.getkeyword(pic.DICT.END)\n     pic.gencmdw(pic.M.MOD, pic.M.MOD.MULT, pic.M.NONE, \"D 2\")\n     pic.gencmd(pic.M.LNK, pic.M.LNK.NONE, pic.M.NONE, pid + \" \" + KWEND, 1)\n     # Use command language to set / modify / delete objects\n     pic.execute(\"MODIF\", f\"DETR ARC {pid} FIN\")\n     pic.execute(\"MODIF\", \"FUSION NOEU (AA = 1) FIN\", \"FUSION NOEU (AA = 1) FIN\")\n     # or change parameters\n     pic.execute(\"SIMUL\", \"CRITX 0.05\", \"MXITER 75\")\n     # get demand profile TS\n     nb = pic.tsdemandlen(\"DEFAUT\", \"HAUT\")\n     print(\"Profile length for area HAUT:\", nb)\n     res = pic.tsdemand(\"DEFAUT\", \"HAUT\")\n     # Unlike epanet, first run simulation then browse/ query results\n     pic.full_solveH(silent=True, retry=True)\n     print(\"Simulation done.\")\n     pic.browseH(3600 * 8.5)\n     fig = plt.figure(figsize=(16 - 1, 9 - 1))\n     # plot 3D elevation and hydraulic head\n     ax = fig.add_subplot(projection=\"3d\")\n     for a in pic.Links():\n         x, y, z, v, nb = pic.linkXYZV(a, \"CH\")\n         if nb > 0:\n             ax.plot(x, y, z, \"r-\")\n             ax.plot(x, y, v, \"b-\")\n     plt.title(\"Plan de charge a t= 08:30\")\n     plt.show()\n     # print min/max pressure over the EPS\n     attr = \"P\"\n     minpax_p = list(pic.getMinMax(pic.NODE, attr))\n     for nid, vmin, vmax, vmoy in minpax_p[:10]:\n         print(nid, attr + \"min:\", vmin, attr + \"max:\", vmax)\n     print(\"\\t...\")\n     for nid, vmin, vmax, vmoy in minpax_p[-10:]:\n         print(nid, attr + \"min:\", vmin, attr + \"max:\", vmax)\n     # get current volume simulation (internal variable steps) and measurement TS\n     for tid in pic.Tanks():\n         t1, v1, nb1 = pic.tsval(pic.TANK, tid, \"VC\")\n         t2, v2, nb2 = pic.msval(pic.TANK, tid, \"VC\")\n     # get current volume simulation results at measurement sampling\n     for tid in pic.Tanks():\n         t3, v3, nb3 = pic.tsvalbymts(pic.TANK, tid, \"VC\")\n     # export as Epanet .inp\n     pic.exportEpanet(\"model.inp\")\n     pic.execute(\"XXMEM ARC : D\")\n     pic.savemodel(\"model_xx.dat\", extra_data=[(\"ARC (D > 149) FIN\", \"XX\")])\n     # WQ source data optional argument is a specific node - not used here\n     print(\"\\nWQ source data (input forcing and TS at nodes):\")\n     for n, cd, attr, t, c, nb in pic.WQSources():\n         print(n, cd, attr, nb, t, c)\n     print(\"Done.\")\n     # use reset() for switching model, close() to terminate\n     pic.close()\n\n \n\n",
    "bugtrack_url": null,
    "license": "commercial",
    "summary": "Python interface to Piccolo/Ganessa_SIM and Picalor simulation kernel",
    "version": "2.4.6",
    "project_urls": null,
    "split_keywords": [
        "piccolo",
        "picalor",
        "ganessa"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3ec2345346613f958f7d21db3d2babbbb2db676c08fa22222a8d365890e81baf",
                "md5": "3b8932482a9ec020e97a8bf78c83eb20",
                "sha256": "18af71054e92dcf87941162664db285277b82ae5ec02699e42e79f58a36089dd"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp310-cp310-win32.whl",
            "has_sig": false,
            "md5_digest": "3b8932482a9ec020e97a8bf78c83eb20",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": "<4,>=3.5",
            "size": 3853135,
            "upload_time": "2024-11-04T10:22:18",
            "upload_time_iso_8601": "2024-11-04T10:22:18.391072Z",
            "url": "https://files.pythonhosted.org/packages/3e/c2/345346613f958f7d21db3d2babbbb2db676c08fa22222a8d365890e81baf/ganessa-2.4.6-cp310-cp310-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "977a56248e915f387a25d0d174c7e34b1990421d5d4854ca52cf1de056777cf4",
                "md5": "c27a43fee860cdd61f03b707662b4a8a",
                "sha256": "a8adfb97a66d2cda3a6e013043598442481781ae64752ac58fecf2313b07265c"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c27a43fee860cdd61f03b707662b4a8a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": "<4,>=3.5",
            "size": 1384900,
            "upload_time": "2024-11-04T10:22:22",
            "upload_time_iso_8601": "2024-11-04T10:22:22.250459Z",
            "url": "https://files.pythonhosted.org/packages/97/7a/56248e915f387a25d0d174c7e34b1990421d5d4854ca52cf1de056777cf4/ganessa-2.4.6-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c8bfeefc2dd89fdeed58198edc05c484b88c1eaafef890100fb5071d44e74b25",
                "md5": "028e20fef5cd85d770bd88d3c4dcf335",
                "sha256": "ce38adbbb7e06c01e375351a89f356f0761de6b7506a9e64604de7164f03017b"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp311-cp311-win32.whl",
            "has_sig": false,
            "md5_digest": "028e20fef5cd85d770bd88d3c4dcf335",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<4,>=3.5",
            "size": 3798025,
            "upload_time": "2024-11-04T10:22:27",
            "upload_time_iso_8601": "2024-11-04T10:22:27.292972Z",
            "url": "https://files.pythonhosted.org/packages/c8/bf/eefc2dd89fdeed58198edc05c484b88c1eaafef890100fb5071d44e74b25/ganessa-2.4.6-cp311-cp311-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "88c24425b4d15e599e34900fe5a51e79ce097c915558937897d2bbcfd813e8c3",
                "md5": "d673c04de19e9ac57a32c22ceea7e550",
                "sha256": "ae6ef9b3c67a257b34792617c4d645d95cf608ffb499291ea27ab640ea2f32a3"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d673c04de19e9ac57a32c22ceea7e550",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<4,>=3.5",
            "size": 1395249,
            "upload_time": "2024-11-04T10:22:30",
            "upload_time_iso_8601": "2024-11-04T10:22:30.747630Z",
            "url": "https://files.pythonhosted.org/packages/88/c2/4425b4d15e599e34900fe5a51e79ce097c915558937897d2bbcfd813e8c3/ganessa-2.4.6-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "927d95b613cd8b582602164f786708bcbe74a286344bd50a23637f44e51b1807",
                "md5": "dc67b34b4b8c28abca268cf80d412a68",
                "sha256": "7818cd789f1c8faa6b0ed9de6e9ca8ad77a8c2eb7268319460a4b2a38d36ebcb"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp312-cp312-win32.whl",
            "has_sig": false,
            "md5_digest": "dc67b34b4b8c28abca268cf80d412a68",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": "<4,>=3.5",
            "size": 2464582,
            "upload_time": "2024-11-04T10:22:34",
            "upload_time_iso_8601": "2024-11-04T10:22:34.906396Z",
            "url": "https://files.pythonhosted.org/packages/92/7d/95b613cd8b582602164f786708bcbe74a286344bd50a23637f44e51b1807/ganessa-2.4.6-cp312-cp312-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "16985351168986e30e25ed4785703df2c0b012c403fd2243a6bd35d9e9e5ba80",
                "md5": "51fb5b0d3a447fec5027bb682a70c92d",
                "sha256": "0bca6efd5ee24912bb725e061f8f9dad4fb9e91427455300476660abb735643d"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "51fb5b0d3a447fec5027bb682a70c92d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": "<4,>=3.5",
            "size": 1484440,
            "upload_time": "2024-11-04T10:22:38",
            "upload_time_iso_8601": "2024-11-04T10:22:38.639694Z",
            "url": "https://files.pythonhosted.org/packages/16/98/5351168986e30e25ed4785703df2c0b012c403fd2243a6bd35d9e9e5ba80/ganessa-2.4.6-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f75f0abe624a9a8c41d0434bb21a49ac2616107375c65bdc0d8e5f2bf03f72e4",
                "md5": "7e69867f3e1e928b4f1d227361a6eae5",
                "sha256": "84fe55848b2bda6041d59c6c1e65b4fb685ea617c905a20f3c43fe76fae0b5e8"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp313-cp313-win32.whl",
            "has_sig": false,
            "md5_digest": "7e69867f3e1e928b4f1d227361a6eae5",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": "<4,>=3.5",
            "size": 2712462,
            "upload_time": "2024-11-04T10:22:42",
            "upload_time_iso_8601": "2024-11-04T10:22:42.808884Z",
            "url": "https://files.pythonhosted.org/packages/f7/5f/0abe624a9a8c41d0434bb21a49ac2616107375c65bdc0d8e5f2bf03f72e4/ganessa-2.4.6-cp313-cp313-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "22c02fe9a990f07b0cc8d8d4edfc7ad115e4da3e23b29330a7f2b4184745ef8c",
                "md5": "d3405440313331a73a4174c1ed84eb46",
                "sha256": "cc629d1ff1a6a949635b6346de96fd0d2e4d0f20ea259f002da87909fd5418bc"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d3405440313331a73a4174c1ed84eb46",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": "<4,>=3.5",
            "size": 1536653,
            "upload_time": "2024-11-04T10:22:46",
            "upload_time_iso_8601": "2024-11-04T10:22:46.387540Z",
            "url": "https://files.pythonhosted.org/packages/22/c0/2fe9a990f07b0cc8d8d4edfc7ad115e4da3e23b29330a7f2b4184745ef8c/ganessa-2.4.6-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "44a1ee472bba15a989569c3bbbae457953235b1a99745d8b37503c0a0d020c89",
                "md5": "e14a3a9ac9b80d6c4989f028a1567e39",
                "sha256": "7111186deb5156ab02d6becd0ee0a77ec33290ef81dd896ecb752962d4e5af42"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp38-cp38-win32.whl",
            "has_sig": false,
            "md5_digest": "e14a3a9ac9b80d6c4989f028a1567e39",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": "<4,>=3.5",
            "size": 4367528,
            "upload_time": "2024-11-04T10:22:51",
            "upload_time_iso_8601": "2024-11-04T10:22:51.621945Z",
            "url": "https://files.pythonhosted.org/packages/44/a1/ee472bba15a989569c3bbbae457953235b1a99745d8b37503c0a0d020c89/ganessa-2.4.6-cp38-cp38-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "14ad6382353601aed2532516f18cc8f1876faaca580ca44b2b6fa456aa09187c",
                "md5": "91689cbef1db99da525f9b1ca8ae1e81",
                "sha256": "16fe4b65719a01089546e25462df06e05f4183507d46c31113e0ea7dc5ee5959"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "91689cbef1db99da525f9b1ca8ae1e81",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": "<4,>=3.5",
            "size": 1436042,
            "upload_time": "2024-11-04T10:22:55",
            "upload_time_iso_8601": "2024-11-04T10:22:55.187393Z",
            "url": "https://files.pythonhosted.org/packages/14/ad/6382353601aed2532516f18cc8f1876faaca580ca44b2b6fa456aa09187c/ganessa-2.4.6-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "abfaab806730ca090d413527b2566d8c255f77b22dc08e44a2b34ef8fecf7e98",
                "md5": "7e245a980058dde77f4eda695541a77c",
                "sha256": "9a59b3cceb92489aab5ab688dd5612ffbad8f1617bb40a4c44abab11f279268c"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp39-cp39-win32.whl",
            "has_sig": false,
            "md5_digest": "7e245a980058dde77f4eda695541a77c",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": "<4,>=3.5",
            "size": 3850751,
            "upload_time": "2024-11-04T10:23:00",
            "upload_time_iso_8601": "2024-11-04T10:23:00.353477Z",
            "url": "https://files.pythonhosted.org/packages/ab/fa/ab806730ca090d413527b2566d8c255f77b22dc08e44a2b34ef8fecf7e98/ganessa-2.4.6-cp39-cp39-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f1b845ab4f1cf8d928581815888afdd6a0e4865d18f329042db8c57706c7b7ac",
                "md5": "76b42de072eaa9fe065f871bb0b9965f",
                "sha256": "971b407607a5f0ea158a12072f49b67652ff2add7f071f02ff92872f7e23d752"
            },
            "downloads": -1,
            "filename": "ganessa-2.4.6-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "76b42de072eaa9fe065f871bb0b9965f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": "<4,>=3.5",
            "size": 1438337,
            "upload_time": "2024-11-04T10:23:04",
            "upload_time_iso_8601": "2024-11-04T10:23:04.009847Z",
            "url": "https://files.pythonhosted.org/packages/f1/b8/45ab4f1cf8d928581815888afdd6a0e4865d18f329042db8c57706c7b7ac/ganessa-2.4.6-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-04 10:22:18",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "ganessa"
}
        
Elapsed time: 0.37145s