Repository: uber-research/atari-model-zoo Branch: master Commit: 18dc816c3fb9 Files: 108 Total size: 28.3 MB Directory structure: gitextract_j3665a4o/ ├── .gitignore ├── LICENSE ├── NOTICE ├── README.md ├── atari_zoo/ │ ├── __init__.py │ ├── activation_movie.py │ ├── atari_wrappers.py │ ├── config.py │ ├── dopamine_preprocessing.py │ ├── game_lists/ │ │ ├── a2c_game_list │ │ ├── apex_game_list │ │ └── dopamine_game_list │ ├── log.py │ ├── model_maker.py │ ├── rollout.py │ ├── scores.py │ ├── synthetic_inputs.py │ ├── top_patches.py │ ├── translate.py │ └── utils.py ├── colab/ │ └── AtariZooColabDemo.ipynb ├── dimensionality_reduction/ │ ├── README.md │ ├── process.py │ ├── process_helper.py │ ├── ram_reduce.json │ ├── representation_reduce.json │ ├── visualize.py │ ├── visualize_helper.py │ ├── viz_ram_2d.json │ └── viz_representation_2d.json ├── docs/ │ ├── RGraph/ │ │ └── libraries/ │ │ ├── RGraph.bar.js │ │ ├── RGraph.bipolar.js │ │ ├── RGraph.common.annotate.js │ │ ├── RGraph.common.context.js │ │ ├── RGraph.common.core.js │ │ ├── RGraph.common.csv.js │ │ ├── RGraph.common.deprecated.js │ │ ├── RGraph.common.dynamic.js │ │ ├── RGraph.common.effects.js │ │ ├── RGraph.common.key.js │ │ ├── RGraph.common.resizing.js │ │ ├── RGraph.common.sheets.js │ │ ├── RGraph.common.tooltips.js │ │ ├── RGraph.common.zoom.js │ │ ├── RGraph.cornergauge.js │ │ ├── RGraph.drawing.background.js │ │ ├── RGraph.drawing.circle.js │ │ ├── RGraph.drawing.image.js │ │ ├── RGraph.drawing.marker1.js │ │ ├── RGraph.drawing.marker2.js │ │ ├── RGraph.drawing.marker3.js │ │ ├── RGraph.drawing.poly.js │ │ ├── RGraph.drawing.rect.js │ │ ├── RGraph.drawing.text.js │ │ ├── RGraph.drawing.xaxis.js │ │ ├── RGraph.drawing.yaxis.js │ │ ├── RGraph.fuel.js │ │ ├── RGraph.funnel.js │ │ ├── RGraph.gantt.js │ │ ├── RGraph.gauge.js │ │ ├── RGraph.hbar.js │ │ ├── RGraph.hprogress.js │ │ ├── RGraph.line.js │ │ ├── RGraph.meter.js │ │ ├── RGraph.modaldialog.js │ │ ├── RGraph.odo.js │ │ ├── RGraph.pie.js │ │ ├── RGraph.radar.js │ │ ├── RGraph.rose.js │ │ ├── RGraph.rscatter.js │ │ ├── RGraph.scatter.js │ │ ├── RGraph.semicircularprogress.js │ │ ├── RGraph.svg.bar.js │ │ ├── RGraph.svg.bipolar.js │ │ ├── RGraph.svg.common.ajax.js │ │ ├── RGraph.svg.common.core.js │ │ ├── RGraph.svg.common.csv.js │ │ ├── RGraph.svg.common.fx.js │ │ ├── RGraph.svg.common.key.js │ │ ├── RGraph.svg.common.sheets.js │ │ ├── RGraph.svg.common.tooltips.js │ │ ├── RGraph.svg.funnel.js │ │ ├── RGraph.svg.gauge.js │ │ ├── RGraph.svg.hbar.js │ │ ├── RGraph.svg.line.js │ │ ├── RGraph.svg.pie.js │ │ ├── RGraph.svg.radar.js │ │ ├── RGraph.svg.rose.js │ │ ├── RGraph.svg.scatter.js │ │ ├── RGraph.svg.semicircularprogress.js │ │ ├── RGraph.svg.waterfall.js │ │ ├── RGraph.thermometer.js │ │ ├── RGraph.vprogress.js │ │ └── RGraph.waterfall.js │ ├── css/ │ │ ├── bootstrap-theme.css │ │ └── bootstrap.css │ ├── js/ │ │ ├── bootstrap.js │ │ └── npm.js │ ├── video.html │ └── video2.html ├── examples/ │ ├── classify_state.py │ └── demo.py ├── notebooks/ │ ├── Basic visualization.ipynb │ ├── Filter Analysis.ipynb │ ├── Training log visualization.ipynb │ └── Walkthrough.ipynb ├── requirements.txt └── setup.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.swp __pycache__ .ipynb_checkpoints data ================================================ FILE: LICENSE ================================================ Copyright (c) 2018 Uber Technologies, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: NOTICE ================================================ Atari Model Zoo includes derived work from Dopamine (https://github.com/google/dopamine) under the Apache License 2.0: Copyright 2018 The Dopamine Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. The derived work can be found in the files: atari_zoo/dopamine_preprocessing.py ================================================ FILE: README.md ================================================ # Atari Zoo The aim of this project is to disseminate deep reinforcement learning agents trained by a variety of algorithms, and to enable easy analysis, comparision, and visualization of them. The hope is to reduce friction for further research into understanding reinforcement learning agents. This project makes use of the excellent [Lucid](https://github.com/tensorflow/lucid) neural network visualization library, and integrates with the [Dopamine](https://github.com/google/dopamine) [model release](https://github.com/google/dopamine/tree/master/docs#downloads). A paper introducing this work was published at IJCAI 2019: [An Atari Model Zoo for Analyzing, Visualizing, and Comparing Deep Reinforcement Learning Agents](https://arxiv.org/abs/1812.07069). ## About This software package is accompanied by a binary release of (1) frozen models trained on Atari games by a variety of deep reinforcement learning methods, and (2) cached gameplay experience of those agents in their training environments, which is hosted online. ## Installation and Setup Dependencies: * [tensorflow](https://github.com/tensorflow/tensorflow) (with version >0.8 <2.0; *we are not currently supporting TF 2.x*) * [lucid](https://github.com/tensorflow/lucid) (version * [matplotlib](https://matplotlib.org/) for some visualiztions * [moviepy](https://zulko.github.io/moviepy/) (optional for making movies) * [gym](https://github.com/openai/gym) (installed with support for Atari; optional for generating new rollouts) * [opencv-python](https://pypi.org/project/opencv-python/) (optional for generating new rollouts) * [tensorflow-onnx](https://github.com/onnx/tensorflow-onnx) (optional for exporting to [ONNX](https://onnx.ai/) format) To install, run ```setup.py install``` after installing dependencies. ## Examples ```python import atari_zoo from atari_zoo import MakeAtariModel from pylab import * algo = "a2c" env = "ZaxxonNoFrameskip-v4" run_id = 1 tag = "final" m = MakeAtariModel(algo,env,run_id,tag)() # get observations, frames, and ram state from a representative rollout obs = m.get_observations() frames = m.get_frames() ram = m.get_ram() # visualize first layer of convolutional weights session = atari_zoo.utils.get_session() m.load_graphdef() m.import_graph() conv_weights = m.get_weights(session,0) atari_zoo.utils.visualize_conv_w(conv_weights) show() ``` From the command line you can run: ```python -m atari_zoo.activation_movie --algo rainbow --environment PongNoFrameskip-v4 --run_id 1 --output ./pong_rainbow1_activation.mp4``` ## Notebooks Example jupyter notebooks live in the notebook directory that give further examples of how this library can be used. A [starter colab notebook](https://colab.research.google.com/github/uber-research/atari-model-zoo/blob/master/colab/AtariZooColabDemo.ipynb) enables you to check out the library without downloading and installing it. ## Web tools * A tool for viewing videos of trained agents is available [here](https://uber-research.github.io/atari-model-zoo/video.html); note that it is possible to link to specific videos, e.g. [https://uber-research.github.io/atari-model-zoo/video.html?algo=apex&game=Seaquest&tag=final&run=2](https://uber-research.github.io/atari-model-zoo/video.html?algo=apex&game=Seaquest&tag=final&run=2). * A tool for viewing videos of trained agents alongside their neural activations is available [here](https://uber-research.github.io/atari-model-zoo/video2.html). ## Source code for training algorithms that produced zoo models We trained four algorithms ourselves: * [A2C](https://arxiv.org/abs/1602.01783) - we used the [baselines package from OpenAI](https://github.com/openai/baselines) * [GA](https://arxiv.org/abs/1712.06567) - we used the [fast GPU implementation version released by Uber](https://github.com/uber-research/deep-neuroevolution) * [ES](https://arxiv.org/abs/1703.03864) - we used the [fast GPU version released by Uber](https://github.com/uber-research/deep-neuroevolution) * [Ape-X](https://arxiv.org/abs/1803.00933) - we used the [replication released by Uber](https://github.com/uber-research/ape-x) * [IMPALA](https://arxiv.org/abs/1802.01561) - we used the [released code from DeepMind](https://github.com/deepmind/scalable_agent) We took trained final models from two algorithms (DQN and Rainbow) from the [Dopamine model release](https://ai.googleblog.com/2018/08/introducing-new-framework-for-flexible.html): * [DQN](https://arxiv.org/abs/1312.5602) - [implementation here](https://github.com/google/dopamine) * [Rainbow](https://arxiv.org/abs/1710.02298) - [implementation here](https://github.com/google/dopamine) ## Citation To cite this work in publications, please use the following BibTex entry: ``` @inproceedings{ title = {An Atari Model Zoo for Analyzing, Visualizing, and Comparing Deep Reinforcement Learning Agents}, author = {Felipe Such, Vashish Madhavan, Rosanne Liu, Rui Wang, Pablo Castro, Yulun Li, Jiale Zhi, Ludwig Schubert, Marc G. Bellemare, Jeff Clune, Joel Lehman}, booktitle = {Proceedings of IJCAI 2019}, year = {2019}, } ``` ## Contact Information For questions, comments, and suggestions, email [joel.lehman@uber.com](mailto:mailto:joel.lehman@uber.com). ================================================ FILE: atari_zoo/__init__.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. run_cnt = {'apex':3,'ga':3,'es':3,'a2c':3,'rainbow':5,'dqn':5,'impala':3} analysis_subset_games = ['AmidarNoFrameskip-v4', 'AssaultNoFrameskip-v4', 'AsterixNoFrameskip-v4', 'AsteroidsNoFrameskip-v4', 'AtlantisNoFrameskip-v4','EnduroNoFrameskip-v4', 'FrostbiteNoFrameskip-v4', 'GravitarNoFrameskip-v4', 'KangarooNoFrameskip-v4',"SeaquestNoFrameskip-v4",'SkiingNoFrameskip-v4','VentureNoFrameskip-v4','ZaxxonNoFrameskip-v4'] game_list = ['AlienNoFrameskip-v4', 'AmidarNoFrameskip-v4', 'AssaultNoFrameskip-v4', 'AsterixNoFrameskip-v4', 'AsteroidsNoFrameskip-v4', 'AtlantisNoFrameskip-v4', 'BankHeistNoFrameskip-v4', 'BattleZoneNoFrameskip-v4', 'BeamRiderNoFrameskip-v4', 'BerzerkNoFrameskip-v4', 'BowlingNoFrameskip-v4', 'BoxingNoFrameskip-v4', 'BreakoutNoFrameskip-v4', 'CentipedeNoFrameskip-v4', 'ChopperCommandNoFrameskip-v4', 'CrazyClimberNoFrameskip-v4', 'DemonAttackNoFrameskip-v4', 'DoubleDunkNoFrameskip-v4', 'EnduroNoFrameskip-v4', 'FishingDerbyNoFrameskip-v4', 'FreewayNoFrameskip-v4', 'FrostbiteNoFrameskip-v4', 'GopherNoFrameskip-v4', 'GravitarNoFrameskip-v4', 'HeroNoFrameskip-v4', 'IceHockeyNoFrameskip-v4', 'JamesbondNoFrameskip-v4', 'KangarooNoFrameskip-v4', 'KrullNoFrameskip-v4', 'KungFuMasterNoFrameskip-v4', 'MontezumaRevengeNoFrameskip-v4', 'MsPacmanNoFrameskip-v4', 'NameThisGameNoFrameskip-v4', 'PhoenixNoFrameskip-v4', 'PitfallNoFrameskip-v4', 'PongNoFrameskip-v4', 'PrivateEyeNoFrameskip-v4', 'QbertNoFrameskip-v4', 'RiverraidNoFrameskip-v4', 'RoadRunnerNoFrameskip-v4', 'RobotankNoFrameskip-v4', 'SeaquestNoFrameskip-v4', 'SkiingNoFrameskip-v4', 'SolarisNoFrameskip-v4', 'SpaceInvadersNoFrameskip-v4', 'StarGunnerNoFrameskip-v4', 'TennisNoFrameskip-v4', 'TimePilotNoFrameskip-v4', 'TutankhamNoFrameskip-v4', 'UpNDownNoFrameskip-v4', 'VentureNoFrameskip-v4', 'VideoPinballNoFrameskip-v4', 'WizardOfWorNoFrameskip-v4', 'YarsRevengeNoFrameskip-v4', 'ZaxxonNoFrameskip-v4'] game_action_counts = {'DemonAttackNoFrameskip-v4': 6, 'BowlingNoFrameskip-v4': 6, 'QbertNoFrameskip-v4': 6, 'GopherNoFrameskip-v4': 8, 'PongNoFrameskip-v4': 6, 'BattleZoneNoFrameskip-v4': 18, 'VideoPinballNoFrameskip-v4': 9, 'FrostbiteNoFrameskip-v4': 18, 'BeamRiderNoFrameskip-v4': 9, 'YarsRevengeNoFrameskip-v4': 18, 'RoadRunnerNoFrameskip-v4': 18, 'JamesbondNoFrameskip-v4': 18, 'GravitarNoFrameskip-v4': 18, 'IceHockeyNoFrameskip-v4': 18, 'FishingDerbyNoFrameskip-v4': 18, 'BerzerkNoFrameskip-v4': 18, 'CrazyClimberNoFrameskip-v4': 9, 'ChopperCommandNoFrameskip-v4': 18, 'WizardOfWorNoFrameskip-v4': 10, 'ZaxxonNoFrameskip-v4': 18, 'AlienNoFrameskip-v4': 18, 'PitfallNoFrameskip-v4': 18, 'KrullNoFrameskip-v4': 18, 'KangarooNoFrameskip-v4': 18, 'BankHeistNoFrameskip-v4': 18, 'SpaceInvadersNoFrameskip-v4': 6, 'RobotankNoFrameskip-v4': 18, 'AmidarNoFrameskip-v4': 10, 'EnduroNoFrameskip-v4': 9, 'AsterixNoFrameskip-v4': 9, 'MontezumaRevengeNoFrameskip-v4': 18, 'VentureNoFrameskip-v4': 18, 'DoubleDunkNoFrameskip-v4': 18, 'KungFuMasterNoFrameskip-v4': 14, 'TimePilotNoFrameskip-v4': 10, 'CentipedeNoFrameskip-v4': 18, 'BreakoutNoFrameskip-v4': 4, 'SeaquestNoFrameskip-v4': 18, 'PhoenixNoFrameskip-v4': 8, 'FreewayNoFrameskip-v4': 3, 'AtlantisNoFrameskip-v4': 4, 'PrivateEyeNoFrameskip-v4': 18, 'NameThisGameNoFrameskip-v4': 6, 'TutankhamNoFrameskip-v4': 8, 'TennisNoFrameskip-v4': 18, 'AssaultNoFrameskip-v4': 7, 'SolarisNoFrameskip-v4': 18, 'StarGunnerNoFrameskip-v4': 18, 'AsteroidsNoFrameskip-v4': 14, 'SkiingNoFrameskip-v4': 3, 'HeroNoFrameskip-v4': 18, 'BoxingNoFrameskip-v4': 18, 'MsPacmanNoFrameskip-v4': 9, 'UpNDownNoFrameskip-v4': 6, 'RiverraidNoFrameskip-v4': 18} game_action_meanings = {'AsteroidsNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE'], 'SkiingNoFrameskip-v4': ['NOOP', 'RIGHT', 'LEFT'], 'AtlantisNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHTFIRE', 'LEFTFIRE'], 'BoxingNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'IceHockeyNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'DoubleDunkNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'StarGunnerNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'RoadRunnerNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'TutankhamNoFrameskip-v4': ['NOOP', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE'], 'MontezumaRevengeNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'AsterixNoFrameskip-v4': ['NOOP', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT'], 'BowlingNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'DOWN', 'UPFIRE', 'DOWNFIRE'], 'PongNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'RIGHTFIRE', 'LEFTFIRE'], 'GravitarNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'KungFuMasterNoFrameskip-v4': ['NOOP', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'DOWNRIGHT', 'DOWNLEFT', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'AssaultNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'RIGHTFIRE', 'LEFTFIRE'], 'SeaquestNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'PhoenixNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'DOWN', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE'], 'RiverraidNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'UpNDownNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'DOWN', 'UPFIRE', 'DOWNFIRE'], 'FreewayNoFrameskip-v4': ['NOOP', 'UP', 'DOWN'], 'WizardOfWorNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE'], 'EnduroNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'DOWN', 'DOWNRIGHT', 'DOWNLEFT', 'RIGHTFIRE', 'LEFTFIRE'], 'PrivateEyeNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'BattleZoneNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'BankHeistNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'VentureNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'TimePilotNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE'], 'ZaxxonNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'CentipedeNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'PitfallNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'BerzerkNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'BreakoutNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHT', 'LEFT'], 'NameThisGameNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'RIGHTFIRE', 'LEFTFIRE'], 'CrazyClimberNoFrameskip-v4': ['NOOP', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT'], 'JamesbondNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'TennisNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'ChopperCommandNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'AlienNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'AmidarNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE'], 'QbertNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN'], 'MsPacmanNoFrameskip-v4': ['NOOP', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT'], 'FrostbiteNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'DemonAttackNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'RIGHTFIRE', 'LEFTFIRE'], 'KangarooNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'VideoPinballNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE'], 'RobotankNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'SolarisNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'HeroNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'FishingDerbyNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'GopherNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE'], 'BeamRiderNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'UPRIGHT', 'UPLEFT', 'RIGHTFIRE', 'LEFTFIRE'], 'SpaceInvadersNoFrameskip-v4': ['NOOP', 'FIRE', 'RIGHT', 'LEFT', 'RIGHTFIRE', 'LEFTFIRE'], 'KrullNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE'], 'YarsRevengeNoFrameskip-v4': ['NOOP', 'FIRE', 'UP', 'RIGHT', 'LEFT', 'DOWN', 'UPRIGHT', 'UPLEFT', 'DOWNRIGHT', 'DOWNLEFT', 'UPFIRE', 'RIGHTFIRE', 'LEFTFIRE', 'DOWNFIRE', 'UPRIGHTFIRE', 'UPLEFTFIRE', 'DOWNRIGHTFIRE', 'DOWNLEFTFIRE']} from atari_zoo.model_maker import MakeAtariModel ================================================ FILE: atari_zoo/activation_movie.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import numpy as np import moviepy.editor as mpy from moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriter import gym from lucid.optvis.render import import_model from atari_zoo import MakeAtariModel from atari_zoo.utils import get_session from atari_zoo.utils import conv_activations_to_canvas from atari_zoo.utils import fc_activations_to_canvas from atari_zoo.utils import get_activation_scaling import tensorflow as tf def gather_activations(m,obs,activations_tensor,session,X_t,batch_size=200,add_observations=True): #gather activations over entire trajectory obs_idx = 0 length = obs.shape[0] collected_reps = [] while obs_idx < length: rep = session.run(activations_tensor,{X_t:obs[obs_idx:obs_idx+batch_size]}) collected_reps.append(rep) obs_idx += batch_size #collate representations compiled_rep = {} for layer in range(len(rep)): collected = np.vstack([r[layer] for r in collected_reps]) #print(collected.shape) layer_name = m.layers[layer]['name'] compiled_rep[layer_name] = collected return compiled_rep def activations_to_frames(m,activations): obs_idx = 0 frames = [] length = activations.shape[0] if len(activations.shape)==4: scaling = get_activation_scaling(m,activations) for obs_idx in range(length): if len(activations.shape)==4: frame = conv_activations_to_canvas(m,activations,padding=1,idx=obs_idx,scaling=scaling) elif len(activations.shape)==2: frame = fc_activations_to_canvas(m,activations,padding=1,idx=obs_idx) frames.append(frame) return frames def make_clips_from_activations(m,_frames,obs,activations_tensor,session,X_t,fps=60): clip_dict = {} activations = gather_activations(m,obs,activations_tensor=activations_tensor, session=session,X_t=X_t,batch_size=1) for layer_idx in range(len(m.layers)): layer_name = m.layers[layer_idx]['name'] print(layer_name) frames = activations_to_frames(m,activations[layer_name]) clip = mpy.ImageSequenceClip([frame*255 for frame in frames], fps=60) clip_dict[layer_name] = clip #create observation movie n_obs = m.native_activation_representation(obs) frames = activations_to_frames(m,n_obs) clip = mpy.ImageSequenceClip([frame*255 for frame in frames], fps=fps) clip_dict['observations'] = clip #create raw rollout movie clip = mpy.ImageSequenceClip([frame for frame in _frames], fps=60) clip_dict['frames'] = clip return clip_dict def side_by_side_clips(clip1,clip2): #calculate size of background canvas total_size_x = clip1.size[0] + clip2.size[0] total_size_y = max(clip1.size[1],clip2.size[1]) #create background canvas bg_clip = mpy.ColorClip(size=(total_size_x,total_size_y), color=(255,255,255)) duration = clip2.duration #align clips on canvas clip1=clip1.set_position(pos=(0,"center")) clip2=clip2.set_position(pos=((total_size_x-clip2.size[0],"center"))) clip_list = [bg_clip,clip1,clip2] #composite together cc = mpy.CompositeVideoClip(clip_list,(total_size_x,total_size_y)).subclip(0,duration) return cc def _MakeActivationVideoOneLayer(m,clip_dict,layer_no): labels = ["conv1","conv2","conv3","fc","output"] scales = [1.5,2.0,2.0,0.5,1.5] #get game frames clip1 = clip_dict['frames'] #get activations from one layer layer_name = m.layers[layer_no]['name'] clip2 = clip_dict[layer_name] clip2_scale = scales[layer_no] clip2 = clip2.resize(clip2_scale) return side_by_side_clips(clip1,clip2) def _MakeActivationVideo(m,clip_dict): composite_size = (550,1000) clip_list = [] clip_list.append(mpy.ColorClip(size=composite_size, color=(255,255,255))) labels = ["obs","conv1","conv2","conv3","fc","output"] scales = [1.0, 1.5,2.0,2.0,0.5,1.5] x_pos = 350 y_pos = 25 padding = 50 label_fontsize = 20 layers = m.layers.copy() layers.insert(0,{'name':'observations'}) for layer_idx in range(len(labels)): layer_name = layers[layer_idx]['name'] #get clip and resize it clip = clip_dict[layer_name] clip = clip.resize(scales[layer_idx]) #calculate where to place it _x_pos = x_pos - 0.5 * clip.size[0] _y_pos = y_pos clip = clip.set_position((_x_pos,_y_pos)) txtClip = mpy.TextClip(labels[layer_idx],color='black', fontsize=label_fontsize) txtPos = (x_pos - 0.5 * txtClip.size[0],y_pos - txtClip.size[1]) clip_list.append(txtClip.set_position(txtPos)) #offset coordinates y_pos += clip.size[1] y_pos += padding clip_list.append(clip) duration = clip.duration clip_list.append(clip_dict['frames'].set_position((50,580))) #clip_list.append(clip_dict['observations'].set_position((0,50))) cc = mpy.CompositeVideoClip(clip_list,composite_size).subclip(0,duration) #cc.ipython_display() return cc """ Take a model and create a dictionary of MoviePy clips for all the activations of the NN given a cached evaluation. """ def MakeClipDict(m): tf.reset_default_graph() m.load_graphdef() m.import_graph() obs = m.get_observations() frames = m.get_frames() #get a tf session session = get_session() #create a placeholder input to the network X_t = tf.placeholder(tf.float32, [None] + m.image_shape) #now get access to a dictionary that grabs output layers from the model T = import_model(m,X_t,X_t) activations = [T(layer['name']) for layer in m.layers] clip_dict = make_clips_from_activations(m,frames,obs,activations,session=session,X_t=X_t,fps=60) return clip_dict """ Take a model and a layer number (0=conv1,1=conv2,2=conv3) and generate a side-by-side video of agent and activations on that layer. """ def MakeActivationVideoOneLayer(m,layer_no,out_file=None): clip_dict = MakeClipDict(m) clip = _MakeActivationVideoOneLayer(m,clip_dict,layer_no) if out_file!=None: clip.write_videofile(out_file) return clip """ Take a model m and generate a side-by-side video of agent and activations """ def MakeActivationVideo(m,video_fn=None): clip_dict = MakeClipDict(m) clip = _MakeActivationVideo(m,clip_dict) if video_fn!=None: clip.write_videofile(video_fn) return clip def main(): """ Generates an activation movie for a rollout with a particular model """ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--algo', help='choose from [es, a2c, dqn]', type=str,default="ga") parser.add_argument('--environment', type=str,default="SeaquestNoFrameskip-v4") parser.add_argument('--run_id',type=int,default=1) parser.add_argument('--output', type=str, default="output.mp4") args = parser.parse_args() m = MakeAtariModel(args.algo,args.environment,args.run_id)() cc = MakeActivationVideo(m) cc.write_videofile(args.output) if __name__=="__main__": main() ================================================ FILE: atari_zoo/atari_wrappers.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy as np from collections import deque from PIL import Image import gym from gym import spaces import tensorflow as tf from pdb import set_trace as bb class NoopResetEnv(gym.Wrapper): def __init__(self, env, noop_max=30): """Sample initial states by taking random number of no-ops on reset. No-op is assumed to be action 0. """ gym.Wrapper.__init__(self, env) self.noop_max = noop_max self.override_num_noops = None assert env.unwrapped.get_action_meanings()[0] == 'NOOP' def reset(self): """ Do no-op action for a number of steps in [1, noop_max].""" self.env.reset() if self.override_num_noops is not None: noops = self.override_num_noops else: noops = self.unwrapped.np_random.randint(1, self.noop_max + 1) #pylint: disable=E1101 assert noops > 0 obs = None for _ in range(noops): obs, _, done, _ = self.env.step(0) if done: obs = self.env.reset() return obs class FireResetEnv(gym.Wrapper): def __init__(self, env): """Take action on reset for environments that are fixed until firing.""" gym.Wrapper.__init__(self, env) assert env.unwrapped.get_action_meanings()[1] == 'FIRE' assert len(env.unwrapped.get_action_meanings()) >= 3 def reset(self): self.env.reset() obs, _, done, _ = self.env.step(1) if done: self.env.reset() obs, _, done, _ = self.env.step(2) if done: self.env.reset() return obs class EpisodicLifeEnv(gym.Wrapper): def __init__(self, env): """Make end-of-life == end-of-episode, but only reset on true game over. Done by DeepMind for the DQN and co. since it helps value estimation. """ gym.Wrapper.__init__(self, env) self.lives = 0 self.was_real_done = True def step(self, action): obs, reward, done, info = self.env.step(action) self.was_real_done = done # check current lives, make loss of life terminal, # then update lives to handle bonus lives lives = self.env.unwrapped.ale.lives() if lives < self.lives and lives > 0: # for Qbert somtimes we stay in lives == 0 condtion for a few frames # so its important to keep lives > 0, so that we only reset once # the environment advertises done. done = True self.lives = lives return obs, reward, done, info def reset(self): """Reset only when lives are exhausted. This way all states are still reachable even though lives are episodic, and the learner need not know about any of this behind-the-scenes. """ if self.was_real_done: obs = self.env.reset() else: # no-op step to advance from terminal/lost life state obs, _, _, _ = self.env.step(0) self.lives = self.env.unwrapped.ale.lives() return obs class MaxAndSkipEnv(gym.Wrapper): def __init__(self, env, skip=4): """Return only every `skip`-th frame""" gym.Wrapper.__init__(self, env) # most recent raw observations (for max pooling across time steps) self._obs_buffer = deque(maxlen=2) self._skip = skip self.viewer = None def step(self, action): """Repeat action, sum reward, and max over last observations.""" total_reward = 0.0 done = None for _ in range(self._skip): obs, reward, done, info = self.env.step(action) self._obs_buffer.append(obs) total_reward += reward if done: break max_frame = np.max(np.stack(self._obs_buffer), axis=0) return max_frame, total_reward, done, info def reset(self): """Clear past frame buffer and init. to first obs. from inner env.""" self._obs_buffer.clear() obs = self.env.reset() self._obs_buffer.append(obs) return obs def _render(self, mode='human', close=False): if close: return if mode == 'human': from gym.envs.classic_control import rendering if self.viewer is None: self.viewer = rendering.SimpleImageViewer() self.viewer.imshow(np.max(np.stack(self._obs_buffer), axis=0)) return np.max(np.stack(self._obs_buffer), axis=0) else: return np.max(np.stack(self._obs_buffer), axis=0) # class ClipRewardEnv(gym.RewardWrapper): # def _reward(self, reward): # """Bin reward to {+1, 0, -1} by its sign.""" # return np.sign(reward) class WarpFrameTF(gym.ObservationWrapper): def __init__(self, env, show_warped=False,warp_size=(84,84)): """Warp frames to 84x84 as done in the Nature paper and later work.""" gym.ObservationWrapper.__init__(self, env) self.res = 84 self.observation_space = spaces.Box(low=0, high=255, shape=(self.res, self.res, 1)) self.viewer = None self.show_warped = show_warped self.inp_shape = [None]+list(env.observation_space.shape[:2])+[1,] self.x_t = tf.placeholder(tf.float32, self.inp_shape,name='warp_ph') self.warp_size = warp_size self.transform_op = self.transform(self.x_t) def transform(self,obs): obs = tf.image.resize_bilinear(obs, self.warp_size, align_corners=True) obs = tf.reshape(obs, self.warp_size + (1,)) return obs def observation(self, obs): frame = np.dot(obs.astype('float32'), np.array([0.299, 0.587, 0.114], 'float32')) frame = frame[np.newaxis,:] frame = frame[...,np.newaxis] return self.transform_op.eval({self.x_t:frame}) def _render(self, mode='human', close=False): if close: return if mode == 'human' and self.show_warped: from gym.envs.classic_control import rendering if self.viewer is None: self.viewer = rendering.SimpleImageViewer() img = self.observation(self.env._render('rgb_array', close)) * np.ones([1, 1, 3], dtype=np.uint8) self.viewer.imshow(img) return img else: return self.env._render(mode, close) class WarpFrame(gym.ObservationWrapper): def __init__(self, env, show_warped=False): """Warp frames to 84x84 as done in the Nature paper and later work.""" gym.ObservationWrapper.__init__(self, env) self.res = 84 self.observation_space = spaces.Box(low=0, high=255, shape=(self.res, self.res, 1)) self.viewer = None self.show_warped = show_warped def observation(self, obs): frame = np.dot(obs.astype('float32'), np.array([0.299, 0.587, 0.114], 'float32')) frame = np.array(Image.fromarray(frame).resize((self.res, self.res), resample=Image.BILINEAR), dtype=np.uint8) return frame.reshape((self.res, self.res, 1)) def _render(self, mode='human', close=False): if close: return if mode == 'human' and self.show_warped: from gym.envs.classic_control import rendering if self.viewer is None: self.viewer = rendering.SimpleImageViewer() img = self.observation(self.env._render('rgb_array', close)) * np.ones([1, 1, 3], dtype=np.uint8) self.viewer.imshow(img) return img else: return self.env._render(mode, close) class FrameStack(gym.Wrapper): def __init__(self, env, k): """Buffer observations and stack across channels (last axis).""" gym.Wrapper.__init__(self, env) self.k = k self.frames = deque([], maxlen=k) shp = env.observation_space.shape assert shp[2] == 1 # can only stack 1-channel frames self.observation_space = spaces.Box(low=0, high=255, shape=(shp[0], shp[1], k)) def reset(self): """Clear buffer and re-fill by duplicating the first observation.""" ob = self.env.reset() for _ in range(self.k): self.frames.append(ob) return self.observation() def step(self, action): ob, reward, done, info = self.env.step(action) self.frames.append(ob) return self.observation(), reward, done, info def observation(self): assert len(self.frames) == self.k return np.concatenate(self.frames, axis=2) class ScaledFloatFrame(gym.ObservationWrapper): def __init__(self,env,scale=(1/255.0)): gym.ObservationWrapper.__init__(self, env) self.scale = scale def observation(self, obs): # careful! This undoes the memory optimization, use # with smaller replay buffers only. return np.array(obs).astype(np.float32) * self.scale class DiscretizeActions(gym.Wrapper): def __init__(self, env): """Buffer observations and stack across channels (last axis).""" gym.Wrapper.__init__(self, env) self.temp_action = env.action_space self.action_space = spaces.Discrete(5 ** int(np.prod(env.action_space.shape))) def step(self, action): cont_action = self.temp_action.low.copy() for i in range(cont_action.size): cont_action[i] += (self.temp_action.high[i] - self.temp_action.low[i]) * float(int(action) % 5) / 4.0 action = int(action / 5) return self.env.step(cont_action) # def wrap_deepmind(env, episode_life=True, clip_rewards=True): def wrap_deepmind(env, episode_life=False, skip=4, stack_frames=4, noop_max=30, noops=None, show_warped=False,preproc='tf'): """Configure environment for DeepMind-style Atari. Note: this does not include frame stacking!""" import gym.envs.atari if isinstance(env.unwrapped, gym.envs.atari.AtariEnv): if episode_life: env = EpisodicLifeEnv(env) env = NoopResetEnv(env, noop_max=noop_max) if noops: env.override_num_noops = noops if skip > 1: assert 'NoFrameskip' in env.spec.id # required for DeepMind-style skip env = MaxAndSkipEnv(env, skip=4) if 'FIRE' in env.unwrapped.get_action_meanings(): env = FireResetEnv(env) if preproc=='np': env = WarpFrame(env, show_warped=show_warped) elif preproc=='tf': env = WarpFrameTF(env, show_warped=show_warped) #elif preproc=='dopamine': # env = DopamineAtariPreprocessing(env) # if clip_rewards: # env = ClipRewardEnv(env) if stack_frames > 1: env = FrameStack(env, stack_frames) env = ScaledFloatFrame(env) return env ================================================ FILE: atari_zoo/config.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. def dopamine_url_formatter(base_url,agent,game,run,tag=None): game_proc = game.split("NoFrameskip")[0] return "gs://download-dopamine-rl/lucid/{agent}/{game}/{run}/graph_def.pb".format(agent=agent,game=game_proc,run=run) #remote lookup table datadir_remote_dict = {'apex':"https://dgqeqexrlnkvd.cloudfront.net/zoo/apex", 'es':"https://dgqeqexrlnkvd.cloudfront.net/zoo/es", 'ga':"https://dgqeqexrlnkvd.cloudfront.net/zoo/ga", 'a2c':"https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c", 'rainbow':"https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow", 'dqn':"https://dgqeqexrlnkvd.cloudfront.net/zoo/dqn", 'impala':"https://dgqeqexrlnkvd.cloudfront.net/zoo/impala"} url_formatter_dict = {('rainbow','remote'):dopamine_url_formatter,('dqn','remote'):dopamine_url_formatter} #local lookup table datadir_local_dict = {'apex':"/space/rlzoo/apex", 'es':"/space/rlzoo/es", 'ga':"/space/rlzoo/ga", 'a2c':'/space/rlzoo/a2c', 'rainbow':'/space/rlzoo/rainbow', 'dqn':'/space/rlzoo/dqn', 'impala':'/space/rlzoo/impala' } debug = True ================================================ FILE: atari_zoo/dopamine_preprocessing.py ================================================ # Modifications Copyright (c) 2018 Uber Technologies, Inc. # Copyright 2018 The Dopamine Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """A class implementing minimal Atari 2600 preprocessing. This includes: . Emitting a terminal signal when losing a life (optional). . Frame skipping and color pooling. . Resizing the image before it is provided to the agent. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from gym.spaces.box import Box import numpy as np import cv2 #@gin.configurable class AtariPreprocessing(object): """A class implementing image preprocessing for Atari 2600 agents. Specifically, this provides the following subset from the JAIR paper (Bellemare et al., 2013) and Nature DQN paper (Mnih et al., 2015): * Frame skipping (defaults to 4). * Terminal signal when a life is lost (off by default). * Grayscale and max-pooling of the last two frames. * Downsample the screen to a square image (defaults to 84x84). More generally, this class follows the preprocessing guidelines set down in Machado et al. (2018), "Revisiting the Arcade Learning Environment: Evaluation Protocols and Open Problems for General Agents". """ def __init__(self, environment, frame_skip=4, terminal_on_life_loss=False, screen_size=84): """Constructor for an Atari 2600 preprocessor. Args: environment: Gym environment whose observations are preprocessed. frame_skip: int, the frequency at which the agent experiences the game. terminal_on_life_loss: bool, If True, the step() method returns is_terminal=True whenever a life is lost. See Mnih et al. 2015. screen_size: int, size of a resized Atari 2600 frame. Raises: ValueError: if frame_skip or screen_size are not strictly positive. """ if frame_skip <= 0: raise ValueError('Frame skip should be strictly positive, got {}'. format(frame_skip)) if screen_size <= 0: raise ValueError('Target screen size should be strictly positive, got {}'. format(screen_size)) self.environment = environment self.unwrapped = environment self.terminal_on_life_loss = terminal_on_life_loss self.frame_skip = frame_skip self.screen_size = screen_size obs_dims = self.environment.observation_space # Stores temporary observations used for pooling over two successive # frames. self.screen_buffer = [ np.empty((obs_dims.shape[0], obs_dims.shape[1]), dtype=np.uint8), np.empty((obs_dims.shape[0], obs_dims.shape[1]), dtype=np.uint8) ] self.game_over = False self.lives = 0 # Will need to be set by reset(). @property def observation_space(self): # Return the observation space adjusted to match the shape of the processed # observations. return Box(low=0, high=255, shape=(self.screen_size, self.screen_size, 1), dtype=np.uint8) @property def action_space(self): return self.environment.action_space @property def reward_range(self): return self.environment.reward_range @property def metadata(self): return self.environment.metadata def reset(self): """Resets the environment. Returns: observation: numpy array, the initial observation emitted by the environment. """ self.environment.reset() self.lives = self.environment.ale.lives() self._fetch_grayscale_observation(self.screen_buffer[0]) self.screen_buffer[1].fill(0) return self._pool_and_resize() def render(self, mode): """Renders the current screen, before preprocessing. This calls the Gym API's render() method. Args: mode: Mode argument for the environment's render() method. Valid values (str) are: 'rgb_array': returns the raw ALE image. 'human': renders to display via the Gym renderer. Returns: if mode='rgb_array': numpy array, the most recent screen. if mode='human': bool, whether the rendering was successful. """ return self.environment.render(mode) def step(self, action): """Applies the given action in the environment. Remarks: * If a terminal state (from life loss or episode end) is reached, this may execute fewer than self.frame_skip steps in the environment. * Furthermore, in this case the returned observation may not contain valid image data and should be ignored. Args: action: The action to be executed. Returns: observation: numpy array, the observation following the action. reward: float, the reward following the action. is_terminal: bool, whether the environment has reached a terminal state. This is true when a life is lost and terminal_on_life_loss, or when the episode is over. info: Gym API's info data structure. """ accumulated_reward = 0. for time_step in range(self.frame_skip): # We bypass the Gym observation altogether and directly fetch the # grayscale image from the ALE. This is a little faster. _, reward, game_over, info = self.environment.step(action) accumulated_reward += reward if self.terminal_on_life_loss: new_lives = self.environment.ale.lives() is_terminal = game_over or new_lives < self.lives self.lives = new_lives else: is_terminal = game_over if is_terminal: break # We max-pool over the last two frames, in grayscale. elif time_step >= self.frame_skip - 2: t = time_step - (self.frame_skip - 2) self._fetch_grayscale_observation(self.screen_buffer[t]) # Pool the last two observations. observation = self._pool_and_resize() self.game_over = game_over return observation, accumulated_reward, is_terminal, info def _fetch_grayscale_observation(self, output): """Returns the current observation in grayscale. The returned observation is stored in 'output'. Args: output: numpy array, screen buffer to hold the returned observation. Returns: observation: numpy array, the current observation in grayscale. """ self.environment.ale.getScreenGrayscale(output) return output def _pool_and_resize(self): """Transforms two frames into a Nature DQN observation. For efficiency, the transformation is done in-place in self.screen_buffer. Returns: transformed_screen: numpy array, pooled, resized screen. """ # Pool if there are enough screens to do so. if self.frame_skip > 1: np.maximum(self.screen_buffer[0], self.screen_buffer[1], out=self.screen_buffer[0]) transformed_image = cv2.resize(self.screen_buffer[0], (self.screen_size, self.screen_size), interpolation=cv2.INTER_AREA) int_image = np.asarray(transformed_image, dtype=np.uint8) return np.expand_dims(int_image, axis=2) ================================================ FILE: atari_zoo/game_lists/a2c_game_list ================================================ AirRaidNoFrameskip-v4 AlienNoFrameskip-v4 AmidarNoFrameskip-v4 AssaultNoFrameskip-v4 AsterixNoFrameskip-v4 AsteroidsNoFrameskip-v4 AtlantisNoFrameskip-v4 BankHeistNoFrameskip-v4 BattleZoneNoFrameskip-v4 BeamRiderNoFrameskip-v4 BerzerkNoFrameskip-v4 BowlingNoFrameskip-v4 BoxingNoFrameskip-v4 BreakoutNoFrameskip-v4 CarnivalNoFrameskip-v4 CentipedeNoFrameskip-v4 ChopperCommandNoFrameskip-v4 CrazyClimberNoFrameskip-v4 DemonAttackNoFrameskip-v4 DoubleDunkNoFrameskip-v4 ElevatorActionNoFrameskip-v4 EnduroNoFrameskip-v4 FishingDerbyNoFrameskip-v4 FreewayNoFrameskip-v4 FrostbiteNoFrameskip-v4 GopherNoFrameskip-v4 GravitarNoFrameskip-v4 HeroNoFrameskip-v4 IceHockeyNoFrameskip-v4 JamesbondNoFrameskip-v4 JourneyEscapeNoFrameskip-v4 KangarooNoFrameskip-v4 KrullNoFrameskip-v4 KungFuMasterNoFrameskip-v4 MontezumaRevengeNoFrameskip-v4 MsPacmanNoFrameskip-v4 NameThisGameNoFrameskip-v4 PhoenixNoFrameskip-v4 PitfallNoFrameskip-v4 PongNoFrameskip-v4 PooyanNoFrameskip-v4 PrivateEyeNoFrameskip-v4 QbertNoFrameskip-v4 RiverraidNoFrameskip-v4 RoadRunnerNoFrameskip-v4 RobotankNoFrameskip-v4 SeaquestNoFrameskip-v4 SkiingNoFrameskip-v4 SolarisNoFrameskip-v4 SpaceInvadersNoFrameskip-v4 StarGunnerNoFrameskip-v4 TennisNoFrameskip-v4 TimePilotNoFrameskip-v4 TutankhamNoFrameskip-v4 UpNDownNoFrameskip-v4 VentureNoFrameskip-v4 VideoPinballNoFrameskip-v4 WizardOfWorNoFrameskip-v4 YarsRevengeNoFrameskip-v4 ZaxxonNoFrameskip-v4 ================================================ FILE: atari_zoo/game_lists/apex_game_list ================================================ alien amidar assault asterix asteroids atlantis bank_heist battle_zone beam_rider berzerk bowling boxing breakout centipede chopper_command crazy_climber demon_attack double_dunk enduro fishing_derby freeway frostbite gopher gravitar hero ice_hockey jamesbond kangaroo krull kung_fu_master montezuma_revenge ms_pacman name_this_game phoenix pitfall pong private_eye qbert riverraid road_runner robotank seaquest skiing solaris space_invaders star_gunner tennis time_pilot tutankham up_n_down venture video_pinball wizard_of_wor yars_revenge zaxxon ================================================ FILE: atari_zoo/game_lists/dopamine_game_list ================================================ AirRaid Alien Amidar Assault Asterix Asteroids Atlantis BankHeist BattleZone BeamRider Berzerk Bowling Boxing Breakout Carnival Centipede ChopperCommand CrazyClimber DemonAttack DoubleDunk ElevatorAction Enduro FishingDerby Freeway Frostbite Gopher Gravitar Hero IceHockey Jamesbond JourneyEscape Kangaroo Krull KungFuMaster MontezumaRevenge MsPacman NameThisGame Phoenix Pitfall Pong Pooyan PrivateEye Qbert Riverraid RoadRunner Robotank Seaquest Skiing Solaris SpaceInvaders StarGunner Tennis TimePilot Tutankham UpNDown Venture VideoPinball WizardOfWor YarsRevenge Zaxxon ================================================ FILE: atari_zoo/log.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy as np import pandas as pd import json import atari_zoo from atari_zoo.utils import load_json_from_url #TODO: Potentially refactor into class structure """ Helper function to parse checkpoint log to expose available 'tagged' checkpoints and their information """ def parse_checkpoint_info(json_data): ckt_points = {} for entry in json_data: tag = entry['criteria'] if entry['best_checkpoint']!=None: ckt_points[tag]=entry['best_checkpoint'] return ckt_points """ Load checkpoint json file from path, where path can be either a local address or a web address """ def load_checkpoint_info(path): fname = path+".json" if(fname.find('http')!=-1): return load_json_from_url(fname) else: return json.load(open(fname)) """ Helper function to transform json log format to pandas data frames for plotting """ def get_dataframe_from_training_log(_data=None,_file=None,algo='default',run=1): if(not _data): log = json.load(_file) else: log = _data assert len(log)>0 column_names = log[0].keys() data_dict = {} for column in column_names: data_dict[column] = [] for entry in log: for key in column_names: data_dict[key].append(entry[key]) data_dict['algo'] = [algo] * len(log) data_dict['run'] = [run] * len(log) df = pd.DataFrame(data_dict) if 'initial' in column_names: df = df[df['initial']==0] df = df.sort_values(by=['time']) """ clean-up stage: some Ape-X runs were restarted from checkpoints due to a network outage. which creates a big timedelta that needs to be cleaned up: i.e. """ clean=False threshold = 60*60*3 #assume >3 hour gap means restart while not clean: clean=True time_diffs = np.diff(df['time']) if np.max(time_diffs)>threshold: clean=False idx = np.argmax(time_diffs) amt = np.max(time_diffs) #TODO: use loc instead (don't operate on copy) #df['time'][idx+1:]-=amt df.loc[idx+1:,('time')]-=amt return df """ Helper function to gather logs for runs of a particular algo/game combo """ def gather_logs_across_runs(algo,game,runs,local=False): results = [] for run in runs: k= atari_zoo.MakeAtariModel(algo,game,run,local=local)() log = k.get_log() results.append(get_dataframe_from_training_log(_data=log,algo=algo,run=run)) df = pd.concat(results) return df """ Helper function to gather logs across algorithms for a particular game """ def gather_logs_across_algos(algos,game,local=False): results = [] for algo in algos: results.append(gather_logs_across_runs(algo,game,range(1,atari_zoo.run_cnt[algo]+1),local=local)) df = pd.concat(results) return df if __name__=='__main__': import seaborn as sns from pylab import * algo = "apex" game = "AmidarNoFrameskip-v4" """ apex_df = gather_logs_across_runs("apex",game,range(1,6),local=True) ga_df = gather_logs_across_runs("ga",game,range(1,6),local=True) a2c_df = gather_logs_across_runs("a2c",game,range(1,4),local=True) es_df = gather_logs_across_runs("es",game,range(1,4),local=True) df = pd.concat((apex_df,ga_df,a2c_df,es_df)) """ df = gather_logs_across_algos(['apex','ga','a2c','es'],game,local=True) sns.lineplot(x="time", y="score", style="run", hue='algo', data=df) show() ================================================ FILE: atari_zoo/model_maker.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Contains wrapper classes over Lucid that enable loading frozen graphs # into the Lucid framework import json import lucid from lucid.modelzoo.vision_base import Model from lucid.misc.io.loading import load from lucid.misc.io.reading import read, local_cache_path import tensorflow as tf import numpy as np from pdb import set_trace as bb import atari_zoo.config from atari_zoo.config import datadir_local_dict,datadir_remote_dict,url_formatter_dict from atari_zoo import game_action_counts from atari_zoo.utils import * import atari_zoo.log """ Basic RL model class that extends Lucid's Model class Implements extra methods: get_observations (Loads precomputed observations if they exist) get_frames (Loads precomputed RGB frames if they exist) get_ram (loads precomputed 128-integer RAM snapshots if they exist) ram_state_to_bits (change 128-integer RAM into 1024-bit RAM) Implements additional class variables: channel_order: "NHWC" or "NCHW" preprocess_style: 'tf' for tensorflow preprocessing, 'np' for numpy, 'dopamine' for dopamine-style """ class RL_model(Model): channel_order = "NHWC" #typical channel order dataset = 'RL' valid_run_range = (1,3) #if the model exposes other interesting layers #e.g. A2C exposes a value and a policy head additional_layers = {} #minutae -- whether atari preprocessing is done in #tensorflow or numpy; only difference is in implmentation #details of bilinear filtering downsampling; but of course #RL agents overfit to it! # #tf = tensorflow; np = numpy preprocess_style = 'tf' image_shape = [84, 84, 4] input_scale = 1.0 image_value_range = (0, 1) input_name = 'X_t' ph_type = 'float32' """ overwrite input creating function to handle different datatypes; Dopamine models want uint8 placeholders """ def create_input(self, t_input=None, forget_xy_shape=True): if t_input == None and self.ph_type=='uint8': t_input = tf.placeholder(tf.uint8,self.image_shape) #return super().create_input(t_input,forget_xy_shape) return super(RL_model,self).create_input(t_input,forget_xy_shape) #TODO integrate these file loads with Lucid's cache mechanism def get_log(self): fname = self.log_path+"_log.json" if(fname.find('http')!=-1): return load_json_from_url(fname) else: return json.load(open(fname)) def get_checkpoint_info(self): return atari_zoo.log.load_checkpoint_info(self.log_path) def get_observations(self): fname = self.data_path return load(fname)['observations'] def get_frames(self): fname = self.data_path return load(fname)['frames'] def get_ram(self): fname = self.data_path return load(fname)['ram'] def get_scores(self): fname = self.data_path return load(fname)['score'] def get_representation(self): fname = self.data_path return load(fname)['representation'] def get_episode_rewards(self): fname = self.data_path return load(fname)['ep_rewards'] #TODO make more efficent def ram_state_to_bits(self,state): binary = ['{0:08b}'.format(k) for k in state] binary = ''.join(binary) return binary #what processing must be done to extract the #right distribution of actions from the output #of the network def get_action(self,model): raise NotImplementedError #transform weight tensor to be of canonical style def preprocess_weight(self,x): #default is identity return x #grab weights from model given current session def get_weights(self,session,layer_no): weights_name = self.weights[layer_no]['name'] weights = session.graph.get_tensor_by_name("import/%s:0" % weights_name) weights = self.preprocess_weight(weights) return session.run(weights) #transform activations into canonical tensor def canonical_activation_representation(self,act): if self.channel_order=='NHWC': return act else: #print("Current:",act.shape) return np.transpose(act,axes=[0,2,3,1]) #transform activations into canonical tensor def native_activation_representation(self,act): if self.channel_order=='NHWC': return act else: return np.transpose(act,axes=[0,3,1,2]) #OpenAI's evolution strategy algorithm class RL_ES(RL_model): weights = [ {'name':'es/layer1/conv1/w'}, {'name':'es/layer2/conv2/w'}, {'name':'es/layer3/conv3/w'}, ] layers = [ {'type': 'conv', 'name': 'es/layer1/Relu', 'size': 32}, {'type': 'conv', 'name': 'es/layer2/Relu', 'size': 64}, {'type': 'conv', 'name': 'es/layer3/Relu', 'size': 64}, {'type': 'dense', 'name': 'es/layer4/Relu', 'size': 512}, {'type': 'dense', 'name': 'es/layer5/out/out', 'size':18} ] def preprocess_weight(self,x): return x[0] def get_action(self,model): policy = model(self.layers[-1]['name']) action_sample = tf.argmax(policy, axis=-1) return action_sample #Uber's Deep GA class RL_GA(RL_model): layers = [ {'type': 'conv', 'name': 'ga/conv1/relu', 'size': 32}, {'type': 'conv', 'name': 'ga/conv2/relu', 'size': 64}, {'type': 'conv', 'name': 'ga/conv3/relu', 'size': 64}, {'type': 'dense', 'name': 'ga/fc/relu', 'size': 512}, {'type': 'dense', 'name': 'ga/out/signal', 'size':18} ] weights = [ {'name':'ga/conv1/w'}, {'name':'ga/conv2/w'}, {'name':'ga/conv3/w'}, ] def get_action(self,model): policy = model(self.layers[-1]['name']) action_sample = tf.argmax(policy, axis=-1) return action_sample def preprocess_weight(self,x): return x[0] #Ape-X (recent high-performing DQN variant) class RL_Apex(RL_model): channel_order = "NCHW" #note: action_value/Relu also worth considering... layers = [ {'type': 'conv', 'name': 'deepq/q_func/convnet/Conv/Relu', 'size': 32}, {'type': 'conv', 'name': 'deepq/q_func/convnet/Conv_1/Relu', 'size': 64}, {'type': 'conv', 'name': 'deepq/q_func/convnet/Conv_2/Relu', 'size': 64}, {'type': 'dense', 'name': 'deepq/q_func/state_value/Relu', 'size': 512}, {'type': 'dense', 'name': 'deepq/q_func/q_values', 'size':18} ] weights = [ {'name':'deepq/q_func/convnet/Conv/weights'}, {'name':'deepq/q_func/convnet/Conv_1/weights'}, {'name':'deepq/q_func/convnet/Conv_2/weights'} ] def get_action(self,model): policy = model(self.layers[-1]['name']) #"a2c/policy/BiasAdd") action_sample = tf.argmax(policy, axis=-1) return action_sample #DQN from dopamine model dump class RL_DQN_dopamine(RL_model): #ph_type = 'uint8' input_scale = 255.0 preprocess_style = 'dopamine' image_value_range = (0, 255) input_name = 'Online/Cast' valid_run_range = (1,3) weights = [ {'name':'Online/Conv/weights'}, {'name':'Online/Conv_1/weights'}, {'name':'Online/Conv_2/weights'} ] layers = [ {'type': 'conv', 'name': 'Online/Conv/Relu', 'size': 32}, {'type': 'conv', 'name': 'Online/Conv_1/Relu', 'size': 64}, {'type': 'conv', 'name': 'Online/Conv_2/Relu', 'size': 64}, {'type': 'dense', 'name': 'Online/fully_connected/Relu', 'size': 512}, {'type': 'dense', 'name': 'Online/fully_connected_1/BiasAdd', 'size':18} ] def get_action(self,model): policy = model(self.layers[-1]['name']) action_sample = tf.argmax(policy, axis=1) return action_sample def get_log(self): raise NotImplementedError #Integration with Dopamine log formatting not yet complete." def get_checkpoint_info(self): raise NotImplementedError #,"Dopamine models include only the final checkpoint." #Rainbow (slightly older high-performing DQN variant) class RL_Rainbow_dopamine(RL_model): #ph_type = 'uint8' valid_run_range = (1,5) preprocess_style = 'dopamine' input_scale = 255.0 image_value_range = (0, 255) #input_name = 'state_ph' input_name = 'Online/Cast' weights = [ {'name':'Online/Conv/weights'}, {'name':'Online/Conv_1/weights'}, {'name':'Online/Conv_2/weights'} ] layers = [ {'type': 'conv', 'name': 'Online/Conv/Relu', 'size': 32}, {'type': 'conv', 'name': 'Online/Conv_1/Relu', 'size': 64}, {'type': 'conv', 'name': 'Online/Conv_2/Relu', 'size': 64}, {'type': 'dense', 'name': 'Online/fully_connected/Relu', 'size': 512}, #{'type': 'dense', 'name': 'Online/fully_connected_1/BiasAdd', 'size':18} {'type': 'dense', 'name': 'Online/Sum', 'size':18} ] additional_layers={'c51':{'type':'dense','name': 'Online/fully_connected_1/BiasAdd', 'size':18*51}} def get_action(self,model): policy = model(self.layers[-1]['name']) action_sample = tf.argmax(policy, axis=1) return action_sample def get_log(self): raise NotImplementedError #"Integration with Dopamine log formatting not yet complete." def get_checkpoint_info(self): raise NotImplementedError #"Dopamine models include only the final checkpoint." #A2C -- policy gradient algorithm class RL_A2C(RL_model): weights = [ {'name':'a2c/conv1/weights'}, {'name':'a2c/conv2/weights'}, {'name':'a2c/conv3/weights'} ] layers = [ {'type': 'conv', 'name': 'a2c/conv1/Relu', 'size': 32}, {'type': 'conv', 'name': 'a2c/conv2/Relu', 'size': 64}, {'type': 'conv', 'name': 'a2c/conv3/Relu', 'size': 64}, {'type': 'dense', 'name': 'a2c/fc/Relu', 'size': 512}, #TODO: enable accesing a2c's value head as well! #{'type': 'dense', 'name': 'a2c/value/BiasAdd', 'size':18}, {'type': 'dense', 'name': 'a2c/policy/BiasAdd', 'size':18} ] def get_action(self,model): policy = model(self.layers[-1]['name']) rand_u = tf.random_uniform(tf.shape(policy)) action_sample = tf.argmax(policy - tf.log(-tf.log(rand_u)), axis=-1) return action_sample class RL_IMPALA(RL_model): input_name = 'agent_1/agent/unroll/batch_apply/truediv' preprocess_style = 'np' weights = [ {'name':'agent/batch_apply/convnet/conv_2d/w'}, {'name':'agent/batch_apply/convnet/conv_2d_1/w'}, {'name':'agent/batch_apply/convnet/conv_2d_2/w'}, ] layers = [ {'type': 'conv', 'name': 'agent_1/agent/unroll/batch_apply/convnet/Relu', 'size': 32}, {'type': 'conv', 'name': 'agent_1/agent/unroll/batch_apply/convnet/Relu_1', 'size': 64}, {'type': 'conv', 'name': 'agent_1/agent/unroll/batch_apply/convnet/Relu_2', 'size': 64}, {'type': 'dense', 'name': 'agent_1/agent/unroll/batch_apply/Relu', 'size': 512}, {'type': 'dense', 'name': 'agent_1/agent/unroll/batch_apply_1/policy_logits/add', 'size': 18}, ] def get_action(self,model): policy_logits = model(self.layers[-1]['name']) new_action = tf.multinomial(policy_logits, num_samples=1, output_dtype=tf.int32) new_action = tf.squeeze(new_action, 1, name='new_action') return new_action ### Instantiate concrete models using python magic class_map = {'ga':RL_GA,'es':RL_ES,'apex':RL_Apex,'a2c':RL_A2C,'dqn':RL_DQN_dopamine,'rainbow':RL_Rainbow_dopamine, 'impala':RL_IMPALA} #helper utility to make new python model classes def _MakeAtariModel(model_class,name,environment,model_path,run_id,algorithm,log_path,data_path): #find number of actions in this particular game num_actions = game_action_counts[environment] #change last layer size to reflect available actions #layers = model_class.layers.copy() layers = list(model_class.layers) #python2.7 compatibility layers[-1]['size']=num_actions #create inherited class with correct properties (hack?) return type('Atari'+name,(model_class,),{'model_path':model_path,'environment':environment,'layers':layers,'run_id':run_id,'algorithm':algorithm,'log_path':log_path,'data_path':data_path}) """ Helper function to get paths to model, rollout data, and log for a particular algo/env/run combo """ def GetFilePathsForModel(algo,environment,run_no,tag='final',local=False): #if loading off of local disk (rare; only for development) if local: data_root = datadir_local_dict[algo] if tag==None: model_path = "%s/%s/model%d.pb" % (data_root,environment,run_no) data_path = "%s/%s/model%d_rollout.npz" % (data_root,environment,run_no) else: model_path = "%s/%s/model%d_%s.pb" % (data_root,environment,run_no,tag) data_path = "%s/%s/model%d_%s_rollout.npz" % (data_root,environment,run_no,tag) log_path = "%s/checkpoints/%s_%d" % (data_root,environment,run_no) #otherwise if loading off the canonical remote server (most common) else: data_root = datadir_remote_dict[algo] if tag==None: model_path = "%s/%s/model%d.pb" % (data_root,environment,run_no) data_path = "%s/%s/model%d_rollout.npz" % (data_root,environment,run_no) else: model_path = "%s/%s/model%d_%s.pb" % (data_root,environment,run_no,tag) data_path = "%s/%s/model%d_%s_rollout.npz" % (data_root,environment,run_no,tag) if (algo,'remote') in url_formatter_dict: model_path = url_formatter_dict[(algo,'remote')](data_root,algo,environment,run_no) log_path = "%s/checkpoints/%s_%d" % (data_root,environment,run_no) return model_path,data_path,log_path """ Function to query for available checkpoints for a model """ def GetAvailableTaggedCheckpoints(algo,environment,run_no,local=False): _,_,log_path = GetFilePathsForModel(algo,environment,run_no,local=local) json_data = atari_zoo.log.load_checkpoint_info(log_path) chkpoint_info = atari_zoo.log.parse_checkpoint_info(json_data) return chkpoint_info """ Function to load model from the model zoo algo: Algorithm (ga,es,apex,a2c,dqn,rainbow) environment: Atari gym environment (e.g. SeaquestNoFrameskip-v4) run_no: which run of the algorithm tag: which tag to search for (e.g. 1HR, human, 1B, final) local: boolean, whether to get the model from a local archive or from the remote server """ def MakeAtariModel(algo,environment,run_no,tag='final',local=False): model_path,data_path,log_path = GetFilePathsForModel(algo,environment,run_no,tag,local) if atari_zoo.config.debug: print('Model path:',model_path) print('Data path:',data_path) print('Log path:',log_path) name = "%s_%s_%d_%s" % (algo,environment,run_no,tag) model_class = class_map[algo] valid_run_range = model_class.valid_run_range if run_no < valid_run_range[0] or run_no > valid_run_range[1]: raise ValueError("Requested run %d out of range (%d,%d)"%(run_no,valid_run_range[0],valid_run_range[1])) return _MakeAtariModel(class_map[algo],name,environment,model_path,run_no,algo,log_path,data_path) if __name__=='__main__': #easy! Zaxxon_A2C = MakeAtariModel('rainbow','SeaquestNoFrameskip-v4',2,tag="final",local=False) model = Zaxxon_A2C() model.load_graphdef() model.import_graph() print("Done") ================================================ FILE: atari_zoo/rollout.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from pdb import set_trace as bb import argparse #from utils import * #from models import * #from ga_vis import create_ga_model import pickle import lucid from lucid.modelzoo.vision_base import Model from lucid.misc.io import show import lucid.optvis.objectives as objectives import lucid.optvis.param as param import lucid.optvis.transform as transform import lucid.optvis.render as render import tensorflow as tf from atari_zoo import MakeAtariModel from lucid.optvis.render import import_model import gym import atari_zoo.atari_wrappers as atari_wrappers import numpy as np import random from atari_zoo.dopamine_preprocessing import AtariPreprocessing as DopamineAtariPreprocessing from atari_zoo.atari_wrappers import FireResetEnv, NoopResetEnv, MaxAndSkipEnv,WarpFrameTF,FrameStack,ScaledFloatFrame class dotdict(dict): """dot.notation access to dictionary attributes""" __getattr__ = dict.get __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ def generate_rollout(model,args=None,action_noise=0.0,parameter_noise=0.0,observation_noise=0.0,test_eps=1,max_frames=2500,min_frames=2500,output='',sticky_action_prob=0.0,render=False,cpu=False,streamline=False,verbose=False): if args==None: arg_dict = {'parameter_noise':parameter_noise, 'observation_noise':observation_noise, 'test_eps':test_eps, 'max_frames':max_frames, 'min_frames':min_frames, 'output':output, 'sticky_action_prob':sticky_action_prob, 'render':render, 'streamline':streamline, 'action_noise':action_noise, 'verbose':verbose } args = dotdict(arg_dict) #from machado sticky_action_prob = args.sticky_action_prob m = model preprocessing = m.preprocess_style m.load_graphdef() #modify graphdef with gaussian noise if args.parameter_noise > 0.0: perturb_count = 0 layer_names = [z['name'] for z in m.weights] #search for known-named nodes for node in m.graph_def.node: if node.name in layer_names: #black magic tensor = node.attr.get('value').tensor array = np.frombuffer(tensor.tensor_content,np.float32).copy() array += np.random.normal(0,args.parameter_noise,array.shape) tensor.tensor_content = array.tobytes() perturb_count+=1 #print(perturb_count) #[n.name for n in m.graph_def.node if n.name.find("conv")!=-1] #bb() #should hit 3 conv layers assert perturb_count == 3 dev_cnt = 1 if args.cpu: dev_cnt = 0 #for rollouts maybe don't use GPU? config = tf.ConfigProto( device_count = {'GPU': dev_cnt} ) config.gpu_options.allow_growth=True with tf.Graph().as_default() as graph, tf.Session(config=config) as sess: if preprocessing == 'dopamine': #dopamine-style preprocessing env = gym.make(m.environment) if hasattr(env,'unwrapped'): env = env.unwrapped env = DopamineAtariPreprocessing(env) env = FrameStack(env, 4) env = ScaledFloatFrame(env,scale=1.0/255.0) elif preprocessing == 'np': #use numpy preprocessing env = gym.make(m.environment) env = atari_wrappers.wrap_deepmind(env, episode_life=False,preproc='np') else: #use tensorflow preprocessing env = gym.make(m.environment) env = atari_wrappers.wrap_deepmind(env, episode_life=False,preproc='tf') nA = env.action_space.n X_t = tf.placeholder(tf.float32, [None] + list(env.observation_space.shape)) T = import_model(m,X_t,X_t) action_sample = m.get_action(T) #get intermediate level representations activations = [T(layer['name']) for layer in m.layers] high_level_rep = activations[-2] #not output layer, but layer before sample_observations = [] sample_frames = [] sample_ram = [] sample_representation = [] sample_score = [] obs = env.reset() ep_count = 0 rewards = []; ep_rew = 0. frame_count = 0 prev_action = None # Evaluate policy over test_eps episodes while ep_count < args.test_eps or frame_count<=args.min_frames: if args.render: env.render() #potentially add observation noise if args.observation_noise>0.0: obs += np.random.normal(0,args.observation_noise,obs.shape) train_dict = {X_t:obs[None]} if streamline: results = sess.run([action_sample], feed_dict=train_dict) #grab action act = results[0] else: results = sess.run([action_sample,high_level_rep], feed_dict=train_dict) #grab action act = results[0] #get high-level representation representation = results[1][0] if not streamline: frame = env.render(mode='rgb_array') sample_frames.append(np.array(frame,dtype=np.uint8)) sample_ram.append(env.unwrapped._get_ram()) sample_representation.append(representation) sample_observations.append(np.array(obs)) sample_score.append(ep_rew) if args.action_noise >=0: if random.random() < args.action_noise: act = random.randint(0,nA-1) if prev_action != None and random.random() < sticky_action_prob: act = prev_action prev_action = act obs, rew, done, info = env.step(np.squeeze(act)) ep_rew += rew frame_count+=1 if frame_count >= args.max_frames: done=True if done: obs = env.reset() ep_count += 1 rewards.append(ep_rew) ep_rew = 0. if args.verbose: print("Avg. Episode Reward: ", np.mean(rewards)) print("rewards:",rewards) print("frames:",frame_count) results = {'observations':sample_observations,'frames':sample_frames,'ram':sample_ram,'representation':sample_representation,'score':sample_score,'ep_rewards':rewards} if args.output!='': np.savez_compressed(args.output + "_rollout",**results) return results #TODO wrap this as a function call, so you can do multiple rollouts def main(): """ Rolls out a model in the atari emulator -- can render it to screen, and also can save out image and observation sequences. """ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--test_eps', help='number of test episodes', default=1, type=int) parser.add_argument('--algo', help='choose from [es, a2c, dqn]', type=str) parser.add_argument('--environment', type=str) parser.add_argument('--run_id',type=int, default=1) parser.add_argument('--render', action='store_true') parser.add_argument('--output', type=str, default="") parser.add_argument('--max_frames', type=int, default=1e8) parser.add_argument('--min_frames', type=int, default=0) parser.add_argument('--observation_noise', type=float, default=0.0) parser.add_argument('--parameter_noise', type=float, default=0.0) parser.add_argument('--tag', type=str, default=None) parser.add_argument('--cpu', action='store_true') parser.add_argument('--streamline', action='store_true') parser.add_argument('--local', action='store_true') parser.add_argument('--sticky_action_prob', type=float,default=0.0) parser.add_argument('--action_noise', type=float,default=0.0) parser.add_argument('--verbose', action="store_true") #from machado sticky_action_prob = 0.0 args = parser.parse_args() m = MakeAtariModel(args.algo,args.environment,args.run_id,tag=args.tag,local=args.local)() results = generate_rollout(model=m,args=args) exit() if __name__=="__main__": #generate_rollout(blah="blah2") main() ================================================ FILE: atari_zoo/scores.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from atari_zoo.translate import translate_game_name def get_random_agent_scores(game): global random_play_scores translated_name = translate_game_name(game,'canonical','apex') return random_play_scores[translated_name] def get_human_scores(game): global human_scores translated_name = translate_game_name(game,'canonical','apex') return human_scores[translated_name] human_scores = { "alien": 6875, "amidar": 1676, "assault": 1496, "asterix": 8503, "asteroids": 13157, "atlantis": 29028, "bank_heist": 734.4, "battle_zone": 37800, "beam_rider": 5775, "bowling": 154.8, "boxing": 4.3, "breakout": 31.8, "centipede": 11963, "chopper_command": 9882, "crazy_climber": 35411, "demon_attack": 3401, "double_dunk": -15.5, "enduro": 309.6, "fishing_derby": 5.5, "freeway": 29.6, "frostbite": 4335, "gopher": 2321, "gravitar": 2672, "hero": 25763, "ice_hockey": 0.9, "jamesbond": 406.7, "kangaroo": 3035, "krull": 2395, "kung_fu_master": 22736, "montezuma_revenge": 4367, "ms_pacman": 15693, "name_this_game": 4076, "pong": 9.3, "private_eye": 69571, "qbert": 13455, "riverraid": 13513, "road_runner": 7845, "robotank": 11.9, "seaquest": 20182, "space_invaders": 1652, "star_gunner": 10250, "tennis": -8.9, "time_pilot": 5925, "tutankham": 167.6, "up_n_down": 9082, "venture": 1188, "video_pinball": 17298, "wizard_of_wor": 4757, "zaxxon": 9173, } random_play_scores = { "alien": 227.8, "amidar": 5.8, "assault": 222.4, "asterix": 210, "asteroids": 719.1, "atlantis": 12850, "bank_heist": 14.2, "battle_zone": 2360, "beam_rider": 363.9, "bowling": 23.1, "boxing": 0.1, "breakout": 1.7, "centipede": 2091, "chopper_command": 811, "crazy_climber": 10781, "demon_attack": 152.1, "double_dunk": -18.6, "enduro": 0, "fishing_derby": -91.7, "freeway": 0, "frostbite": 65.2, "gopher": 257.6, "gravitar": 173, "hero": 1027, "ice_hockey": -11.2, "jamesbond": 29, "kangaroo": 52, "krull": 1598, "kung_fu_master": 258.5, "montezuma_revenge": 0, "ms_pacman": 307.3, "name_this_game": 2292, "pong": -20.7, "private_eye": 24.9, "qbert": 163.9, "riverraid": 1339, "road_runner": 11.5, "robotank": 2.2, "seaquest": 68.4, "space_invaders": 148, "skiing":-16679.9, "star_gunner": 664, "tennis": -23.8, "time_pilot": 3568, "tutankham": 11.4, "up_n_down": 533.4, "venture": 0, "video_pinball": 16257, "wizard_of_wor": 563.5, "zaxxon": 32.5, } ================================================ FILE: atari_zoo/synthetic_inputs.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import tensorflow as tf import lucid import atari_zoo from atari_zoo import MakeAtariModel from lucid.misc.io import show import lucid.optvis.objectives as objectives import lucid.optvis.param as param import lucid.optvis.transform as transform import lucid.optvis.render as render from lucid.optvis.param.color import to_valid_rgb from lucid.optvis.param.spatial import naive, fft_image import pylab from lucid.optvis.objectives import wrap_objective, Objective import matplotlib import numpy as np from lucid.misc.io import load, save, show from lucid.misc.io.showing import images #call to create raw image def image(shape, add_noise=False): if add_noise: raw_frames = lucid.optvis.param.spatial.naive(shape, sd=0.5) else: raw_frames = lucid.optvis.param.spatial.naive(shape) processed_frames = tf.nn.sigmoid(raw_frames) return processed_frames #if you want to only optimize current frame and leave past 3 frames to be zero def only_current_frame(shape): shape_1 = shape[:-1]+[1,] shape_2 = shape[:] shape_2[-1] -= 1 print(shape_1,shape_2) current_frame = lucid.optvis.param.spatial.naive(shape_1) zero_frames = tf.zeros(shape_2) processed_current = tf.nn.sigmoid(current_frame) processed_frames = tf.concat([zero_frames,processed_current],-1) return processed_frames #create lucid objective functions that work with different channel orderings ( @wrap_objective def channel(layer, n_channel, ordering="NHWC"): """Tensor-order aware version of channel lucid objective""" if ordering=='NCHW': return lambda T: tf.reduce_mean(tf.transpose(T(layer),perm=[0,2,3,1])[...,n_channel]) else: return lambda T: tf.reduce_mean(T(layer)[..., n_channel]) #an L2 penalty only for a specific channel of the input image @wrap_objective def L2c(layer="input", constant=0, epsilon=1e-6, batch=None,channel=0): """L2 norm of layer. Generally used as penalty.""" if batch is None: return lambda T: tf.sqrt(epsilon + tf.reduce_sum((T(layer)[...,channel] - constant) ** 2)) else: return lambda T: tf.sqrt(epsilon + tf.reduce_sum((T(layer)[batch,...,channel] - constant) ** 2)) @wrap_objective def direction_cossim(layer, vec, ordering="NHWC"): """Visualize a direction (cossine similarity)""" def inner(T): if ordering=='NCHW': _layer = T(layer) else: _layer = tf.transpose(T(layer),perm=[0,2,3,1]) act_mags = tf.sqrt(tf.reduce_sum(_layer**2, -1, keepdims=True)) vec_mag = tf.sqrt(tf.reduce_sum(vec**2)) mags = act_mags * vec_mag return tf.reduce_mean(_layer * vec.reshape([1, 1, 1, -1]) / mags) return inner @wrap_objective def direction_neuroncossim(layer, vec, ordering="NHWC"): """Visualize a direction (cossine similarity)""" def inner(T): if ordering=='NCHW': _layer = T(layer) else: _layer = tf.transpose(T(layer),perm=[0,2,3,1]) act_mags = tf.sqrt(tf.reduce_sum(_layer[:,5:6,5:6,:]**2, -1, keepdims=True)) vec_mag = tf.sqrt(tf.reduce_sum(vec**2)) mags = act_mags * vec_mag return tf.reduce_mean(_layer[:,5:6,5:6,:] * vec.reshape([1, 1, 1, -1]) / mags) return inner def make_regularization(L1=0.0,L2=0.0,TV=0.0): return -L1*objectives.L2()-L2*objectives.L2()-TV*objectives.total_variation() def visualize_neuron(algo='apex',env='SeaquestNoFrameskip-v4',run_id=1,tag="final",param_f=lambda: image([1,84,84,4]),do_render=False, transforms=[transform.jitter(3),],layer_no=0,neuron=0,regularization=0,**params): tf.reset_default_graph() m = MakeAtariModel(algo,env,run_id,tag,local=False)() m.load_graphdef() if(m.layers[layer_no]['type']=='dense'): obj = objectives.channel(m.layers[layer_no]['name'],neuron) else: obj = channel(m.layers[layer_no]['name'],neuron,ordering=m.channel_order) out = optimize_input(obj+regularization,m,param_f,transforms,do_render=do_render,**params) return out #differentiable image parameterizations from tensorflow.contrib import slim import numpy as np #CPPN setup def composite_activation(x): x = tf.atan(x) # Coefficients computed by: # def rms(x): # return np.sqrt((x*x).mean()) # a = np.arctan(np.random.normal(0.0, 1.0, 10**6)) # print(rms(a), rms(a*a)) return tf.concat([x/0.67, (x*x)/0.6], -1) def composite_activation_unbiased(x): x = tf.atan(x) # Coefficients computed by: # a = np.arctan(np.random.normal(0.0, 1.0, 10**6)) # aa = a*a # print(a.std(), aa.mean(), aa.std()) return tf.concat([x/0.67, (x*x-0.45)/0.396], -1) def relu_normalized(x): x = tf.nn.relu(x) # Coefficients computed by: # a = np.random.normal(0.0, 1.0, 10**6) # a = np.maximum(a, 0.0) # print(a.mean(), a.std()) return (x-0.40)/0.58 def image_cppn( size, num_output_channels=1, num_hidden_channels=24, num_layers=8, activation_fn=composite_activation, normalize=False): r = 3.0**0.5 # std(coord_range) == 1.0 coord_range = tf.linspace(-r, r, size) y, x = tf.meshgrid(coord_range, coord_range, indexing='ij') net = tf.expand_dims(tf.stack([x, y], -1), 0) # add batch dimension with slim.arg_scope([slim.conv2d], kernel_size=1, activation_fn=None): for i in range(num_layers): in_n = int(net.shape[-1]) net = slim.conv2d( net, num_hidden_channels, # this is untruncated version of tf.variance_scaling_initializer weights_initializer=tf.random_normal_initializer(0.0, np.sqrt(1.0/in_n)), ) if normalize: net = slim.instance_norm(net) net = activation_fn(net) rgb = slim.conv2d(net, num_output_channels, activation_fn=tf.nn.sigmoid, weights_initializer=tf.zeros_initializer()) return rgb def render_feature( cppn_f = lambda: image_cppn(84), optimizer = tf.train.AdamOptimizer(0.001), objective = objectives.channel('noname', 0),transforms=[]): vis = render.render_vis(m, objective, param_f=cppn_f, optimizer=optimizer, transforms=transforms, thresholds=[2**i for i in range(5,10)], verbose=False) #show(vis) return vis #video rendering code... from lucid.misc.io.serialize_array import _normalize_array from lucid.misc.tfutil import create_session from moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriter from IPython.display import clear_output, Image, display, HTML import moviepy.editor as mpy from lucid.modelzoo import vision_models from lucid.misc.io import show, save, load from lucid.optvis import objectives from lucid.optvis import render @wrap_objective def all_activation(layer, batch=None): """Value of action minus average value of all actions""" if batch is None: return lambda T: tf.reduce_mean(T(layer)) else: return lambda T: tf.reduce_mean(T(layer)[batch, ...]) cppn_default_f = lambda: image_cppn( size=84, num_layers=8,num_hidden_channels=16,normalize=True, activation_fn=relu_normalized, num_output_channels=4) #composite_activation #relu_normalized #composite_activation_unbiased def optimize_input(obj, model, param_f, transforms, lr=0.05, step_n=512,num_output_channels=4,do_render=False,out_name="out"): sess = create_session() # Set up optimization problem size = 84 t_size = tf.placeholder_with_default(size, []) T = render.make_vis_T( model, obj, param_f=param_f, transforms = transforms, optimizer=tf.train.AdamOptimizer(lr), ) tf.global_variables_initializer().run() if do_render: video_fn = out_name + '.mp4' writer = FFMPEG_VideoWriter(video_fn, (size, size*4), 60.0) # Optimization loop try: for i in range(step_n): _, loss, img = sess.run([T("vis_op"), T("loss"), T("input")]) if do_render: #if outputting only one channel... if num_output_channels==1: img=img[...,-1:] #print(img.shape) img=np.tile(img,3) else: #img=img[...,-3:] img=img.transpose([0,3,1,2]) img=img.reshape([84*4,84,1]) img=np.tile(img,3) writer.write_frame(_normalize_array(img)) if i > 0 and i % 50 == 0: clear_output() print("%d / %d score: %f"%(i, step_n, loss)) show(img) except KeyboardInterrupt: pass finally: if do_render: print("closing...") writer.close() # Save trained variables if do_render: train_vars = sess.graph.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES) params = np.array(sess.run(train_vars), object) save(params, out_name + '.npy') # Save final image final_img = T("input").eval({t_size: 600})[...,-1:] #change size save(final_img, out_name+'.jpg', quality=90) out = T("input").eval({t_size: 84}) sess.close() return out ================================================ FILE: atari_zoo/top_patches.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Code to extract images patches that maximally activate particular neurons # in an Atari convnet. Note that right now this code is specifically fit # to the Atari convnet structure, and would need adaptation and generalization # to fit to arbitrary structures. This would likely be non-trivial because it # requires some reflection on the structure of the network (reasoning about # pooling / convs) to calculate receptive fields at particular layers, etc. import sys import tensorflow as tf import lucid import numpy as np import atari_zoo from atari_zoo import MakeAtariModel from atari_zoo.rollout import generate_rollout from lucid.misc.io import show import lucid.optvis.objectives as objectives import lucid.optvis.param as param import lucid.optvis.transform as transform import lucid.optvis.render as render import atari_zoo.utils from atari_zoo.utils import conv_activations_to_canvas from atari_zoo.utils import fc_activations_to_canvas from lucid.optvis.render import import_model from matplotlib.pyplot import * #from IPython import embed # receptive field at conv3 is 36 # receptive field at conv2 is 20 # receptive field at conv1 is 8 (8x8 conv...) def pad_image(image, padSize, pad_values=0.): """ Function that pads an image on all 4 sides, each side having the same padding. simulating the receptive field that can be larger than original image image: shape (batch, h, w, c) or (h, w, c) padSize: integer. Number of pixels to pad each side pad_values: what value to pad it with """ if len(image.shape) == 4: # (batch, h, w, c) pads = ((0,0), (padSize,padSize),(padSize,padSize), (0,0)) elif len(image.shape) == 3: # (h, w, c) pads = ((padSize,padSize),(padSize,padSize), (0,0)) else: raise ValueError('Unsupported representation shape {}'.format(image.shape)) ret = np.pad(image, pads, 'constant', constant_values=pad_values) return ret def get_obs_patch(observation, ii, jj, receptive_stride=(36,8), pad_each_side=4+2*4+1*8,plot=False): """ Function that get a patch from an observation matrix, according to a (ii, jj) location at a layer higher up observation: (batch, h, w, c), normally (batch, 84, 84, 4) ii: integer index in the h dimension jj: integer index in the w dimension receptive_stride: a tuple of (receptive field size, stride size) indicating from this higher-up layer where (ii, jj) is located, the size of receptive field and stride into the observation. For networks used in this application, the three conv layers have, respectively, (8,4), (20,8), (36,8) onto the original observation. pad_each_side: how much the observation should be padded, due to the fact that receptive field at some point expand outside of the original image. Because there have been 3 layers of conv, having filter sizes of 8, 4, and 3, strides of 2, 2, and 1. Under "same" padding as they do, the eventual padding is 4 + 4*2 + 1*2*4 = 20 """ repp = pad_image(observation, pad_each_side) # pad to (112,112,4) (rec_size, stride) = receptive_stride # the field to look at in observation top = int(ii*stride-rec_size/2) bot = int(ii*stride+rec_size/2) left = int(jj*stride-rec_size/2) right = int(jj*stride+rec_size/2) #print('Before pad: ', top, bot, left, right) print('bottom left location in original obs: ({},{})'.format(bot, left)) [new_top, new_bot, new_left, new_right] = [k+pad_each_side for k in [top,bot,left,right]] #print('After pad: ', new_top, new_bot, new_left, new_right) #figure(figsize=(10,4)) if plot: for cc in range(observation.shape[-1]): subplot(101+observation.shape[-1]*10+cc) #print('bottom left location in padded obs: ({},{})'.format(bot+pad_each_side, left+pad_each_side)) matshow(repp[new_top:new_bot,new_left:new_right,cc], fignum=0) #print(repp[new_top:new_bot,new_left:new_right,cc].shape) return repp[new_top:new_bot,new_left:new_right,observation.shape[-1]-1], (top, left) def build_model_get_act(algo, env, run_id=1, tag='final', local=True, which_layer=2): """ Function that builds/loads a model given algorithm algo and environment env, etc., and obtain activations at a specific layer. which_layer: the index into layers. 0->Conv1, 1->Conv2, 2->Conv3, 3->FC """ # Activation map shapes: # 0 Online/Conv/Relu (21, 21, 32) # 1 Online/Conv_1/Relu (11, 11, 64) # 2 Online/Conv_2/Relu (11, 11, 64) # 3 Online/fully_connected/Relu (512) # #TODO # load model m = MakeAtariModel(algo, env, run_id, tag=tag)() nA = atari_zoo.game_action_counts[env] acts_shapes = [(0,21,21,32), (0,11,11,64), (0,11,11,64), (0,512),(0,nA)] # getting frames, observations obs = m.get_observations() frames = m.get_frames() # get the flow ready from observation the the layer activation you want m.load_graphdef() #get a tf session session = atari_zoo.utils.get_session() #create a placeholder input to the network X_t = tf.placeholder(tf.float32, [None] + m.image_shape) #now get access to a dictionary that grabs output layers from the model T = import_model(m,X_t,X_t) # the activation tensor we want acts_T = T(m.layers[which_layer]['name']) try: acts = session.run(acts_T, {X_t: obs}) except: # some models does not allow batch size > 1 so do it one at a time acts = np.empty(acts_shapes[which_layer]) for obs_1 in obs: obs_1 = np.expand_dims(obs_1, axis=0) #rep_1 = session.run(rep_layer_T, {X_t: obs_1}) rep_1 = session.run(acts_T, {X_t: obs_1}) acts = np.append(acts, rep_1, axis=0) if m.channel_order=='NCHW': acts = np.transpose(acts, axes=[0,2,3,1]) print('Layer {} {} activations obtained. Shape {}'.format(which_layer, m.layers[which_layer]['name'], acts.shape)) return obs, acts, frames def plot_topN_patches(activations, observations, which_filter=38, which_layer=2, which='top',n=3,plot=True): """ Plot the things activations: activations across all observations. e.g. (2501, 11, 11, 64) which_filter: the filter of interest, integer between e.g. [0, 64) for conv3 Top 3 and Bottom 3 are determined by the activation vaules in activations Plots are first on activations and then on specific observation patches """ #last two are fc layers receptive_stride = [(8,4), (20,8), (36,8),(84,0),(84,0)][which_layer] pad_each_side = [4, 4+4*2, 4+4*2+1*8,0,0][which_layer] # Find the maximum value in each channel of activation acts_filter = activations[..., which_filter] # e.g. (2501, 11, 11) max_per_sample = [] for act in acts_filter: # each (11,11) max_per_sample.append(act.max()) max_per_sample = np.array(max_per_sample) top3 = max_per_sample.argsort()[::-1][:n] #print(max_per_sample) bot3 = max_per_sample.argsort()[:n] rand3 = np.random.choice(len(max_per_sample), n) if which.startswith('top'): picks = top3 elif which.startswith('bot'): picks = bot3 elif which.startswith('rand'): picks = rand3 else: raise ValueError('which={"top", "bot", "rand"}') def plot_things(picks,plot=True): patches = [] bottleft = [] #figure(figsize=(10,4)) for cc, sample_pick in enumerate(picks): if len(activations.shape)==2: #fc rep_pick = np.zeros((5,5)) rep_pick[0,0] = activations[sample_pick,which_filter]+1e-6 else: rep_pick = activations[sample_pick,:,:,which_filter] [ii, jj] = [int(x) for x in np.where(rep_pick == np.max(rep_pick))] if plot: figure(0,figsize=(10,4)) subplot(1,n,1+cc) imshow(rep_pick) title('Maximum activation loc: ({},{})'.format(ii,jj)) figure(cc+2,figsize=(12,4)) if len(activations.shape)==2: #fc: _patches=observations[picks[cc]] if plot: figure() for k in range(4): subplot(141+k) matshow(_patches[...,k],fignum=0) _bl = (0,0) else: _patches, _bl = get_obs_patch(observations[picks[cc]], ii, jj, receptive_stride, pad_each_side) patches.append(_patches) bottleft.append(_bl) return np.array(patches), bottleft if plot: gray() patches, bottleft = plot_things(picks,plot=plot) return patches, picks, bottleft if __name__=='__main__': algos = ['a2c','es','ga','apex','rainbow','dqn'] game_list_local = ['AmidarNoFrameskip-v4', 'AtlantisNoFrameskip-v4', 'KangarooNoFrameskip-v4', 'ZaxxonNoFrameskip-v4', 'AssaultNoFrameskip-v4', 'EnduroNoFrameskip-v4', 'SeaquestNoFrameskip-v4', 'AsterixNoFrameskip-v4', 'FrostbiteNoFrameskip-v4', 'SkiingNoFrameskip-v4', 'AsteroidsNoFrameskip-v4', 'GravitarNoFrameskip-v4', 'VentureNoFrameskip-v4'] algo = algos[-1] env = 'SeaquestNoFrameskip-v4' # sequest observations, activations = build_model_get_act(algo, env, which_layer=2) plot_top3_bot3_patches(activations, observations, which_filter=38, which_layer=2) ================================================ FILE: atari_zoo/translate.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import glob import sys from pdb import set_trace as bb def module_path(): encoding = sys.getfilesystemencoding() return os.path.dirname(__file__) path = module_path() dopamine_game_list = open(os.path.join(path,"game_lists/dopamine_game_list")).read().split("\n")[:-1] es_apex_game_list = open(os.path.join(path,"game_lists/apex_game_list")).read().split("\n")[:-1] a2c_game_list = open(os.path.join(path,"game_lists/a2c_game_list")).read().split("\n")[:-1] #align game lists by taking out these games blacklist = ['AirRaid','Carnival','ElevatorAction','JourneyEscape','Pooyan'] dopamine_game_list = [k for k in dopamine_game_list if k not in blacklist] a2c_game_list = [k for k in a2c_game_list if (k[:k.find("NoFrameskip-v4")]) not in blacklist] def grab_list(mode): if mode=='a2c' or mode=='canonical': return a2c_game_list if mode=='es' or mode=='apex': return es_apex_game_list if mode=='dopamine': return dopamine_game_list def translate_game_name(inp_name,inp_mode,out_mode): inp_list = None out_list = None inp_list = grab_list(inp_mode) out_list = grab_list(out_mode) inp_idx = inp_list.index(inp_name) return out_list[inp_idx] if __name__=='__main__': for k in range(len(dopamine_game_list)): print(dopamine_game_list[k],es_apex_game_list[k],a2c_game_list[k]) print(translate_game_name('ice_hockey','apex','canonical')) print(a2c_game_list) ================================================ FILE: atari_zoo/utils.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import tensorflow as tf import pylab import numpy as np import json from lucid.misc.io.reading import read_handle try: import tf2onnx except: print('tf2onnx not installed, you will not be able to export to onnx') pass """ Helper function to load json from a url (lucid.misc.io.reading.load chokes on a decoding issue) """ def load_json_from_url(url,cache=None,encoding='utf-8'): with read_handle(url,cache=cache) as handle: res = handle.read().decode(encoding=encoding) return json.loads(res) """ Helper function to generate a new session """ def get_session(): tf.reset_default_graph() tf_config = tf.ConfigProto( inter_op_parallelism_threads=0, intra_op_parallelism_threads=0) tf_config.gpu_options.allow_growth=True session = tf.Session(config=tf_config) return session """ Render a layer of conv weights to an RGB numpy array canvas """ def conv_weights_to_canvas(w): fx = w.shape[0] fy = w.shape[1] in_ch = w.shape[2] out_ch = w.shape[3] scale = 1 padding = 1 x_leap = (fx+padding) y_leap = (fy+padding) c_sz_x = padding + x_leap * in_ch c_sz_x *= scale c_sz_y = padding + y_leap * out_ch c_sz_y *= scale w_max = w.max() w_min = w.min() print(w_min,w_max) #first, cheap rescale w_scaled = (w-w_min)/(w_max-w_min) canvas = np.zeros((c_sz_x,c_sz_y,3)) for i in range(in_ch): for j in range(out_ch): x_idx = padding + i*x_leap y_idx = padding + j*y_leap filt = w_scaled[:,:,i,j] canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,0] = filt canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,1] = filt canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,2] = filt canvas = canvas.transpose([1,0,2]) return canvas """ Use Matplotlib """ def visualize_conv_w(w,title=None,subsample=None): if subsample!=None: w=w[:,:,:,:subsample] canvas = conv_weights_to_canvas(w) #pylab.figure(figsize = (10,20)) pylab.imshow(canvas) if title: pylab.title(title,fontsize=20) return canvas #save model out to onnx format def to_onnx(model,fname="./frozen_out.onnx",scope=""): tf.reset_default_graph() model.load_graphdef() model.import_graph(scope=scope) tf.import_graph_def( model.graph_def, {}, name=scope) graph = tf.get_default_graph() onnx_graph = tf2onnx.tfonnx.process_tf_graph(graph) inp_name = model.input_name+":0" out_name = model.layers[-1]['name']+":0" print(inp_name,out_name) model_proto = onnx_graph.make_model("", [inp_name], [out_name]) with open(fname, "wb") as f: f.write(model_proto.SerializeToString()) print("Done...") #convert fc-level activations to a canvas representation def fc_activations_to_canvas(m,act,scale=8,padding=1,width=32,idx=0): if len(act.shape)==2: act=act[idx] channels = act.shape[0] fx = fy = scale if width>channels: width=channels in_ch = width out_ch = int(channels / width) x_leap = (fx+padding) y_leap = (fy+padding) c_sz_x = padding + x_leap * in_ch #c_sz_x *= scale c_sz_y = padding + y_leap * out_ch #c_sz_y *= scale #print(c_sz_x,c_sz_y) a_max = act.max() a_min = act.min() #print(a_max,a_min) #first, cheap rescale a_scaled = (act-a_min)/(a_max-a_min) canvas = np.zeros((c_sz_x,c_sz_y,3)) canvas[:,:,0]=1.0 for i in range(in_ch): for j in range(out_ch): x_idx = padding + i*x_leap y_idx = padding + j*y_leap filt = a_scaled[i+j*width] canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,0] = filt canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,1] = filt canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,2] = filt canvas = canvas.transpose([1,0,2]) return canvas def get_activation_scaling(model,act): act = model.canonical_activation_representation(act) #print("Processed shape",act.shape) act_max_ch = act.max((0,1,2)) act_min_ch = act.min((0,1,2)) return act_max_ch,act_min_ch #convert conv-level activations to a canvas representation def conv_activations_to_canvas(model,act,scale=1,padding=1,width=8,idx=0,scaling=None): act_max_ch = None act_min_ch = None if scaling!=None: act_max_ch,act_min_ch = scaling if len(act.shape)==4: #handle NCHW and NHWC act = model.canonical_activation_representation(act) #print("Processed shape",act.shape) act = act[idx] fx = act.shape[0] fy = act.shape[1] channels = act.shape[2] #no blank squares if width>channels: width = channels in_ch = width out_ch = int(channels / width) x_leap = (fx+padding) y_leap = (fy+padding) c_sz_x = padding + x_leap * in_ch c_sz_x *= scale c_sz_y = padding + y_leap * out_ch c_sz_y *= scale #global max/min a_max = act.max() a_min = act.min() #first, cheap rescale a_scaled = (act-a_min)/(a_max-a_min) canvas = np.zeros((c_sz_x,c_sz_y,3)) canvas[:,:,0]=1.0 for i in range(in_ch): for j in range(out_ch): x_idx = padding + i*x_leap y_idx = padding + j*y_leap if act_max_ch is None: filt = a_scaled[:,:,i+j*width] else: channel = i+j*width filt = (act[:,:,channel] - act_min_ch[channel])/(act_max_ch[channel]-act_min_ch[channel]+1e-8) #flip x & y filt = np.transpose(filt,[1,0]) canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,0] = filt canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,1] = filt canvas[x_idx:x_idx+fx,y_idx:y_idx+fy,2] = filt canvas = canvas.transpose([1,0,2]) return canvas try: import moviepy.editor as mpy from moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriter except: print("Moviepy not installed, movie generation features unavailable.") from lucid.misc.io.serialize_array import _normalize_array import numpy as np def MakeVideo(m,fps=60.0,skip=1,video_fn='./tmp.mp4'): obs = m.get_observations() frames = m.get_frames() size_x,size_y = frames.shape[1:3] writer = FFMPEG_VideoWriter(video_fn, (size_y, size_x), fps) for x in range(0,frames.shape[0],skip): writer.write_frame(frames[x]) writer.close() def load_clip_from_cache(algo,env,run_id,tag="final",video_cache="."): i_video_fn ="%s/%s-%s-%d-%s.mp4" % (video_cache,algo,env,run_id,tag) return mpy.VideoFileClip(i_video_fn) def movie_grid(clip_dict,x_labels,y_labels,grid_sz_x,grid_sz_y,label_padding=50,padding=5,label_fontsize=20): key = list(clip_dict.keys())[0] exemplar = clip_dict[key] size_x,size_y = exemplar.size duration = exemplar.duration x_step = (size_x+padding) y_step = (size_y+padding) composite_size = (label_padding + x_step * grid_sz_x), (label_padding + y_step * grid_sz_y) #load in all the movie clips for _x in range(grid_sz_x): for _y in range(grid_sz_y): pos =(label_padding + _x*x_step,label_padding + _y*y_step) clip_dict[(_x,_y)] = clip_dict[(_x,_y)].set_position(pos) #clip.write_gif(o_video_fn) clip_list = [] #add background clip clip_list.append(mpy.ColorClip(size=composite_size, color=(255,255,255))) #now add x and y labels l_idx = 0 if y_labels != None: for label in y_labels: txtClip = mpy.TextClip(label,color='black', fontsize=label_fontsize).set_position((0,label_padding+y_step*l_idx+(y_step/2))) l_idx+=1 clip_list.append(txtClip) l_idx = 0 if x_labels != None: for label in x_labels: txtClip = mpy.TextClip(label,color='black', fontsize=label_fontsize).set_position((label_padding+x_step*l_idx,label_padding/2)) l_idx+=1 clip_list.append(txtClip) for key in clip_dict: clip_list.append(clip_dict[key]) cc = mpy.CompositeVideoClip(clip_list,composite_size) return cc def rollout_grid(env,algos,run_ids,tag='final',clip_resize=0.5,label_fontsize=20,out_fn="composite.mp4",video_cache=".",length=None): clip_dict = {} key = None for algo in algos: for run_id in run_ids: key = (algo,run_id) clip_dict[key] = load_clip_from_cache(algo,env,run_id,tag,video_cache).resize(clip_resize) exemplar = clip_dict[key] size_x,size_y = exemplar.size duration = exemplar.duration #labels for grid y_labels = [("R%d"% r) for r in run_ids] x_labels= algos label_padding = 50 padding = 5 num_runs = len(run_ids) x_step = (size_x+padding) y_step = (size_y+padding) composite_size = (label_padding + x_step * len(algos), label_padding + y_step * num_runs) algo_idx = 0 #load in all the movie clips for algo in algos: for run_id in run_ids: pos =(label_padding + algo_idx*x_step,label_padding + (run_id-1)*y_step) clip_dict[(algo,run_id)] = clip_dict[(algo,run_id)].set_position(pos) #clip.write_gif(o_video_fn) print(env,algo,run_id) algo_idx+=1 clip_list = [] #add background clip clip_list.append(mpy.ColorClip(size=composite_size, color=(255,255,255))) #now add x and y labels l_idx = 0 for label in y_labels: txtClip = mpy.TextClip(label,color='black', fontsize=label_fontsize).set_position((0,label_padding+y_step*l_idx+(y_step/2))) l_idx+=1 clip_list.append(txtClip) l_idx = 0 for label in x_labels: txtClip = mpy.TextClip(label,color='black', fontsize=label_fontsize).set_position((label_padding+x_step*l_idx,label_padding/2)) l_idx+=1 clip_list.append(txtClip) for key in clip_dict: clip_list.append(clip_dict[key]) cc = mpy.CompositeVideoClip(clip_list,composite_size) if length!=None: duration = length cc = cc.resize(1.0).subclip(0,duration) if out_fn != None: cc.write_videofile(out_fn) return cc,clip_dict ================================================ FILE: colab/AtariZooColabDemo.ipynb ================================================ { "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "AtariZooColabDemo.ipynb", "version": "0.3.2", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "accelerator": "GPU" }, "cells": [ { "metadata": { "id": "8HWEO12ygohP", "colab_type": "code", "outputId": "3d5a3e29-e11b-48e6-f421-1df434f589bd", "colab": { "base_uri": "https://localhost:8080/", "height": 254 } }, "cell_type": "code", "source": [ "!git clone https://github.com/uber-research/atari-model-zoo\n", "import os\n", "os.chdir(\"/content/atari-model-zoo\")\n", "import atari_zoo" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "Cloning into 'atari-model-zoo'...\n", "remote: Enumerating objects: 126, done.\u001b[K\n", "remote: Counting objects: 100% (126/126), done.\u001b[K\n", "remote: Compressing objects: 100% (95/95), done.\u001b[K\n", "remote: Total 159 (delta 41), reused 104 (delta 30), pack-reused 33\u001b[K\n", "Receiving objects: 100% (159/159), 20.00 MiB | 27.31 MiB/s, done.\n", "Resolving deltas: 100% (46/46), done.\n", "tf2onnx not installed, you will not be able to export to onnx\n", "Imageio: 'ffmpeg-linux64-v3.3.1' was not found on your computer; downloading it now.\n", "Try 1. Download from https://github.com/imageio/imageio-binaries/raw/master/ffmpeg/ffmpeg-linux64-v3.3.1 (43.8 MB)\n", "Downloading: 8192/45929032 bytes (0.0%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b3047424/45929032 bytes (6.6%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b6823936/45929032 bytes (14.9%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b10690560/45929032 bytes (23.3%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b14573568/45929032 bytes (31.7%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b18399232/45929032 bytes (40.1%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b22315008/45929032 bytes (48.6%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b26206208/45929032 bytes (57.1%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b29335552/45929032 bytes (63.9%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b32645120/45929032 bytes (71.1%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b36446208/45929032 bytes (79.4%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b40312832/45929032 bytes (87.8%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b44179456/45929032 bytes (96.2%)\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b45929032/45929032 bytes (100.0%)\n", " Done\n", "File saved as /root/.imageio/ffmpeg/ffmpeg-linux64-v3.3.1.\n" ], "name": "stdout" } ] }, { "metadata": { "id": "135P9vp2siaA", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Download trained model and precomputed rollout data" ] }, { "metadata": { "id": "KypUsPKqh_br", "colab_type": "code", "outputId": "6cb960df-3cf4-4853-a73c-87d6b3cc7a41", "colab": { "base_uri": "https://localhost:8080/", "height": 72 } }, "cell_type": "code", "source": [ "import atari_zoo\n", "from atari_zoo import MakeAtariModel\n", "from pylab import *\n", "\n", "algo = \"rainbow\" #or try.... es, ga, dqn, a2c, apex\n", "env = \"SeaquestNoFrameskip-v4\" #or try... ZaxxonNoFrameSkip-v4\n", "run_id = 2\n", "tag = \"final\"\n", "m = MakeAtariModel(algo,env,run_id,tag)()\n", "\n", "# get observations, frames, ram state, and neural representations from a representative rollout\n", "obs = m.get_observations()\n", "frames = m.get_frames()\n", "ram = m.get_ram()\n", "rep = m.get_representation()" ], "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ "Model path: gs://download-dopamine-rl/lucid/rainbow/Seaquest/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SeaquestNoFrameskip-v4_2\n" ], "name": "stdout" } ] }, { "metadata": { "id": "IH4uNHcGnFda", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Display one RGB frame and corresponding pre-processed observation fed into deep NN\n" ] }, { "metadata": { "id": "KS9W6tNKggV1", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 562 }, "outputId": "b53cec2c-bbbc-41ea-fb5f-afa620de287c" }, "cell_type": "code", "source": [ "from IPython.display import Image, display\n", "import numpy as np\n", "import PIL\n", "\n", "idx = 100\n", "frame = frames[idx]\n", "_obs = obs[idx].transpose((2,0,1))\n", "\n", "#display RGB frame \n", "display(PIL.Image.fromarray(frame))\n", "\n", "#display T-3, T-2, T-1, Now frames of observation fed into deep neural network\n", "for i in range(4):\n", " _obsf = (np.tile(_obs[i,...,np.newaxis],(1,1,3)) * 255).astype(np.uint8)\n", " display(PIL.Image.fromarray(_obsf))" ], "execution_count": 3, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKAAAADSCAIAAABCR1ywAAAE/UlEQVR4nO3dP4tUVxjH8Rux18KA\nhSCCnRMCVkIKhwFhsRUrLUx8B1PpO9jqvoPoQrKlbVgQhi0tFCymtFEsBLENCm5IceRwc+eemXvN\nec6f334/hGW8mZ095rvPmbt3djdNAwAAAADo+CH0L366fpRyHTByJvcCYOts7gWU6PBg39++9+DR\nzuMlY4vucxV9v8ODfXe7e7x3n5KxRe9QRcUt2KKH+d249sBM8LB7Dx51d+N6EVgcgcVxFj2AL5NQ\nDbZocQQWR2BxBBZXd+DQVYipx4VVHJi6Y1QcGGNUFthN4eHBvh9Hf2TS8dOjssANO/NE9QXGJNUH\nDl0TnnpcVX0v+FN0El5sEFf9Fo3tCCwu+Bx8pTlJuQ4YYYLFBSf4538+p1wHjDDB4oITfK15l3Id\nMMIEiwtO8Pkzf6RcB4wwweKCE3xy5e+U64ARJlhccII/nfuSch0wEgz8/urXlOuAkeDLhRd/+T3l\nOmCE52BxBBYXfA7+8PZjynXASDDwxcs/plwHjDDB4ngOFkdgcTwHi2OCgZoFL1U2l071D+XJYIsW\nR2BxBBZHYHEEFkdgcQQWR2BxBDaxmM1zL+EbrmSJY4JNlDPBBI5vMZuv1sdN09x/ss69FgIbGKyb\nKzaBo/Hb8v0na5/T3cg4ygQ25+r++dssy0cncDSr9fFiNl/M5rlaDiJwHC6tu90bWXeD5+C6rdbH\n7h/3Rxe11zgLLnTE50bZx86LCY7PpS3kWgcTbMhf8ciIwOLYosURWByBxRFYHIHFEVgcgcURWByB\nxRFYHIFNFPJKQ0NgebzYII4JjqyczdkhsDgCR1PUd+p4BBbHSVZMBQ5x8HdVYpLSzq08Jjiy0oaY\nwPF1pzl7aQKbKOEbZh3Ook24H0TLvYqmIbCdQhqzRYtjgsURWByBxRFYHIHFEVgcgcURWByBxRFY\nHIHFEVgcgcURWByBxRFYHIHF5Qn8/Omz50+fZfnQp03qb3yna2Js0eIILI7A4lJ82+yY591bv96J\n9eHQZXWSxclUIXL++Kib2mI/FUILq2uzsd2ix8er679aRfJv0aQ1ZbtFEy87fvhMHF8HiyOwOAKL\nI7C4aIFL+HUF2MQEi+PLJHGRJ5iNujRs0eIiBy7qf36NhgmWF/nFhtJ+1ypMJngxm7NLFyLmBDO+\nBYoQuKhfj4yeaBc6yvkNyeiK8xxM3WJFCEzdknEtWhwXOsSFz6IvvEm4DFhhgsWFJ/j8y4TLgBUm\nWFx4gs++TrcKmGGCxRFYHIHFjXo1qb3dDh5f/rWMsgge3+7xg5cq23b4QUOm/mVCi+bx4z5+tMBj\nPtjURfP4///xTQKjHJxkiSOwOAKLI7A4Aoub9m2zy+W38++2bZfLZeht9z7dO7tH2Hl+vre3N/nv\nkcOrhzc3D368+zj9SraYPMHdPL5l73bbtv5u/kb3Dkjm+7doV27zreNzhj4JkMb3B3a1djbbHGWk\nNDlwbyveeZ8x94cdLlWK48skcQQWR2BxBBZHYHEEFkdgcQQWR2BxBBZHYHEEBgAgj/DvyarWYu/F\n4PHV0Y3t9+neAcXZbNY90rsd+iTQI3IW7YL5t6G0/o9uWN09N9+3e2TzEeoiErj57wYb2mx9Xd9s\ndXSjd+edO3lddALvjNGd3e7B7e9Ye2OdwGNOkTaHdft7CZx26QTuGnmSPDi+vSMCjQEAAAAAAAAA\nMPUv9Fqtl5lgVM4AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFQAAABUCAIAAACTCYeWAAAFmUlEQVR4nO2cvW/TTBzHz/bZ8cV2\n6jZ2arlxgVILFdQOlLUTbRc2FiohsVas/CP8KzAgFtgqVUKRWCrxUql1lCYpdURDXuy0Mc4znB6r\nhtC3xJc6yWdyTvbvvt873/le7AAwZjShzv5IJpMMwwxKCnng2R8LCwuSJA1KCmZ+fl6W5Xw+b9u2\nruu6rtu2nc/no8iLjiLotTEM48mTJ6VSSZZlhmE2Nzc/f/68sbEhy3IU2d0s8xhJktbW1ghkdLPM\nHx8fW5aVTqe/f//u+34ul3v48OHXr18dx4kiu1CHt7y8PPA2TxISNZ9KpS48HgiRm19aWlpZWcHH\nuq4/ffoUH7Msu7m5GXXu5wMvPuW6rK+v37lzR9d1AECtVltYWJiZmQEArKysBMerq6sfPnyITsP5\nRGgeAFAqlUqlUqVScV23Wq2Wy2XHcfb39+fn53O5HADg06dPkQo4n5Hu8EI1z3FcIpEYlBTyhMxL\nkhTRWOpmEjIPIeQ4blBSyDO+7f9HEISBDzxIEurt7927l0wmByWFPKGaRwgJgjAoKeQJmXddl6Ko\nf506fNysKS1hQvU8MTEBYbQD3hvFn739SD3nR/q2H5uPGxRFTU5OTk9PP3/+fGpqSlXV6203hDo8\nXddj0eZFUfR9/+XLlwAAx3GKxeK7d+9+//591TjxM69pWq1Ww+u5mUzGMAzHcfb29k5OTq4aKmbm\nIYTpdDqdTu/v77uu22O0mJnH0DR969atk5OTUqnUU5x+CSKJ7/uWZfW+kxFL8wCATqdTrVZ7DBJX\n831hbH5UiaV5mqYVRek9TvwmsHitqVKp9B4qZuZpmk6lUhDCZrPZh2i9hyBMrVbzPG92dlZV1R5D\nxazmfd9vNpvNZlMUxd4XnWJmPqDRaPQ+Eo/fbR9wenraY4QYm++dsflR5TrmIYTZbFYUxb6rIcyV\ne/tMJvPixQtN0968ebO1tRWFJmJcwTzP84qiZDIZTdMAALIsZ7PZer3+69evyORFS2gZa319fWpq\n6tu3b8fHx2fTFxcXHz9+jM0HiYVCwTCMjx8/vn//npDYfhOq+Z2dna4jh2az2Wq1WJY9ODgIEimK\n2t7e3tnZiVxjZFxqAVMQhMnJyR8/frTbbVLCSHCpNo+H01FLIc/4OT+qXGxeVVWaHs4yutiVbdsI\noVjs5FyVS1UpQmgoX0i+wLwgCIqiSJJE0/Twva5zgZ9kMklRlGVZnU6HjCCSnGeeoijHcYbyCY8J\nmWdZ9o+Ord1uD2VXhwmZZxhm+Br2OYSs+r7v+/6gpJAnZF6WZVEUDcMIVmkqlYpt261Wq9FodL0e\nT3JN0wxumYODg3q93mg0Wq1Wl/wglGUZQmiaZpC4u7vreV61WvU87+9LeJ4XRVGSpGw2i1M8z9vd\n3QX/3rQSRZHneVVVgzl4o9EoFAo4l+C00Kzu1atXQQZnwebr9XowpQ3U/2vDEJu3bTvQh4sVm+96\nCTZfKBSCglYURVVVbL7rJTg4Ljucks1mJUnC5v8+PyhiXHaXMj+sDOeg/ZJ079t//vz59u3b2dlZ\ny7JM07QsS9O0o6Ojubm5vb29Bw8e5HK5VCr17Nmzs1cpivLo0aMoVL5+/Rq3VUEQlpaW+hX2UjVv\nmiZ2VSgUcIqmaYeHh/0SMSjGbX5UGZsfVUbafKjDm56eZll2UFLIQ+4rOoRQp9PRdR0h5LpuIpH4\n8uULz/Nzc3N4FuC6brlcJqYHEDOvadrdu3eLxSLLsjzPu66LECoWi/fv38/n8+l0ulwuS5KUSCQY\nhjk9PbVtWxTFiP4YKYBQm+c4rtPp8DyPN7wQQgzD3L59e2trS5Zl3/cNw0AIsSwLIUQImaZJ4Htu\nQjXPcRxe/Oc4Ltjww59K4HVxz/N834cQUhTVbrdbrVYikeg6KR4zZsyYa/Ifi2XoigW88HoAAAAA\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFQAAABUCAIAAACTCYeWAAAFcElEQVR4nO2bP2/aTBzHj/gPd9jG\njrCDYyBKKVZFIqVS2zVbi1Rl69K8gmTPG+nbyJopS6ssGaoWCXVq1UgJhGBXNaIhQZjWlt3h9CCc\n5AkNYIOBz2ROvrvv17/z/fMBwJzZJNL7IxaLEQQxLinBQ/b+yOfzHMeNSwoml8sJglCpVAzDUBRF\nURTDMCqVih91LfhR6MBkMpmtrS1N0wRBIAhid3e3VCptb28LguBHdZNlHsNx3KtXrwKoaLLM//r1\nq1wuJxKJ79+/O45TLBafPXv27du3drvtR3WeDu/58+djf+eDJIjIx+PxvtdjwXfzGxsbm5ub+FpR\nlDdv3uBriqJ2d3f9rv1+yP63DEqhUHj06JGiKACAq6urfD6fSqUAAJubm93rly9fvn//3j8N9+Oj\neQCApmmaptXrddM0Ly8vdV1vt9tnZ2e5XK5YLAIAPn365KuA+5npDs8TeZqmo9HouKQEj8c8x3E+\nzaUmE495kiRpmh6XlOCZN/v/YBhm7BOPIPH09k+ePInFYuOSEjyeyCOEGIYZl5Tg8Zg3TTMSifzf\nrdPHZC1pA8YTZ57nSdLfCe9EcbO3n6lxfqab/dx82IAQxmKxp0+fDllO+Lo3giB4ni8UCktLS8lk\nEgBwdHRkWdYARYXMPISQ47irq6svX77IssyybKvVGrg0z1CnKMqE9/Y8zy8uLrqui7/hzJZ5DM/z\nkiRpmjbkfn7Imj2m2Wx2Op3hv6mG0jwA4Pfv38MXEsqhblTMzc8qoTTPcRxCaPhyQtbh4f1ly7I6\nnc7wpYUs8hDCpaWlUW06hMy8bduNRkOWZUmSht9rDVmz73Q6nU6n1WolEonBFjO9hCzyGMdx6vX6\n8OWE0jwAwHXdGY38qJibn1UGNx+JRNLpNM/zI1QTMAMOdQzD7OzspFKpDx8+HB4ejlZTYDzAPIRQ\nFMVms8nzPMMw+DhVPB5Pp9PtdrvRaPgm0i8esI21vLz8+vXrVCrV29RrtZosy6VSaX9/n+f5fD5/\nI5eu6z6dmR6eBzd7y7IuLi56U0ql0ufPnwEAzWbz48ePI5PmPw+IPG729Xp9JCuqSSCUu7ejYj7O\nzyr9zcdisWk9k9rffLvdtiyLpumFhWlrJv/qJ5FITN+JlT7mKYpiGEZRFNd1R7JhOlH0D6Yoipqm\nTc3Y3ksf8zRNn5+fu64bjJqA8ZinKOrGJMeyLIqigpUUHB7zBEFMX692Dx6rjuM4jjMuKcHjMS8I\nAsuymUyGZVmcUq/XDcPAW+V35hdFEQCgqmq3yVxcXFxfX7darTv7SJIkBUEgSVJV1W7iycmJbduX\nl5e2bd/OAiFkWZbjuHQ6jVNs2z45OcHy7lTFsiyEUJIkLA8A0Gq1qtUqrqV7m2dhs7e3162gF2z+\n+vq6u5jtqu+WfgNs3jCMrj78WLH5O7Ng89VqtfugRVGUJAmbvzMLLhw/O5ySTqc5jsPmb9/ffcT4\n2f2T+Wll2masD+Luvr3RaBwcHKysrJTLZVVVy+WyLMs/f/7MZrOnp6fr6+vFYjEej799+7Y3lyiK\nL1688EPlu3fv8LvKMMzGxsaoiv2nyKuqil1Vq1WcIsvyjx8/RiViXMzf+Vllbn5WmWnzng4vmUxO\n8RruNsH9iw4h5LquoigIIdM0o9Ho169fIYTZbBavAkzT1HU9MD0gMPOyLD9+/LhWq1EUBSE0TRMh\nVKvV1tbWKpVKIpHQdZ3juGg0ShDEnz9/DMNgWdbvj3wBvfM0TbuuCyHEB2kQQgRBrK6uHh8fC4Lg\nOE4mk0EIURRFkiRCSFXVAP7PHVDkuzvf+PwkTjRNEwCAEKJp2rZtx3FIkoxEIviAZTQancqNwzlz\n5oyNv4eC4dAakGmbAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFQAAABUCAIAAACTCYeWAAAFdUlEQVR4nO2cz0/iTBjHp/Y3baUB\nZJtqjcvSg5Ig0T148eaabPZg4kUve/buP+HRP8STx032uPGgJHvcjfgDgoCxZEULFoW272HyNnZ1\nFaEtFPo5lUn7zPOdmT4zfToFgIDRBHn8IxQKoSjaL1e8B3v8Y3Z2luO4frkCSSaTPM8XCgVFUURR\nFEVRUZRCoeBGXWNuGO0aSZK+fPlSLpd5nkdRdGtr6+fPn5ubmzzPu1HdYImHcBz36dMnDyoaLPHX\n19f5fD4ajR4fHxuGkc1mFxYWfv/+fXd350Z1toC3uLjY93veS7zo+fHx8VeP+4Lr4tPp9PLyMjwW\nRXF9fR0e4zi+tbXldu0vg71+Sresrq6+f/9eFEUAwO3t7ezs7OTkJABgeXnZOl5ZWfn+/bt7PryM\ni+IBAOVyuVwuV6tVTdNqtVqlUrm7uzs/P08mk9lsFgBweHjoqgMvM9IBz9bzBEGQJNkvV7zHJp7j\nOJfWUoOJTTyGYQRB9MsV7wmG/f8wDNP3hYeX2KJ9JpNhWbZfrniPrec1TUMQ5F+nDh828aqq3t/f\n98sV77GJj0QioVCoX654j22Qh8NhDHN3wTtQ/B3tR2qeH6xMjscE4v1GPB5HEIRhmB7t+E98PB4n\nSfLz588rKyvxeHxxcbFrUz6L7YIg3NzciKIoSRLLsoIg7O3tdW3NNtWJojjI0R7H8UgkEolEcBw/\nPT1NJpMnJyeiKOZyue4M+kk8BEXR6enpZrNZqVR6NOW/e17X9Xw+r2la76b8Jx4AYJpmrVbr3Y4v\nxTtFIN5v9L68gfhPvIPzkc/EMwzDMEyj0XDEmp/EoygaDocdTLf4STwA4ObmxjRNSZJisVjv1vy0\nttd1vdFoNBoNjuPGxhzoNj+Jt1BV1ZGw57Nhb/Hw8NC7Eb+Kd4RA/KgSiB9V3jbVra2tLSwsHBwc\nfPv2zSWHvORtPS9JEsMwmUzGHWe8ptMc3tevX+fn5x+X6Lp+dHSUSqV2dnY6nHXj8bhlv1ar1ev1\nrnx2jE6HvSRJf5WgKLq0tKSq6lurpCgqk8lY4o+OjnRdf6sRR3hD9jadTj99oiqVSsVi0RXX3Md/\nqWsH6SjgDWuLdCTeqZzZoNGR+Ovr68eBemjodJ7XdX34tui9Lj4UCkWj0XA4jCAIjuMe+OQZr8/z\n8EvD8/Nz0zQ9cMhLXhevaZpTqeJBwyYex/GnUa3Vag1fqIPYxKMoOrr78AzDMAyjX654j008z/Ms\ny8LtLrCkWq0qitJsNv/1BAZfHsiybA2Zi4sLVVXr9Xqz2XymPgzjeR7DMFmWrcJcLtdut2u1Wrvd\nfnoJRVEsy3IcNzU1BUva7TbcilKtVp/1imVZiqImJiasdxv1er1YLMJarNNsa/vt7W2rgsdA8aqq\nXlxcWBqg9/96cwLFK4pi+QebFYp/9hIovlgsWg0di8UmJiag+GcvgcZh28GSqakpjuOg+KfnW00M\n264j8cNKkMN7wp8/f/b396enp/P5vCzL+XxeEISrq6tEInF2dpZKpbLZ7Pj4+MbGxuOrYrHYx48f\n3fByd3cX3qsMw6TTaafMdtTzsixDVVbeQhCEy8tLp5zoF8E9P6oE4keVkRZvC3jv3r0bsnTFy3j3\nCSFN06ZpiqJI07SmaSRJ/vr1i6KoRCIBnwI0Tet9I/Wb8Ei8IAgfPnwolUo4jlMUpWkaTdOlUmlu\nbq5QKESj0UqlwnEcSZIoij48PCiKwrKsS3+MZOHRPU8QhGmaFEW1Wi0AAE3TKIrOzMz8+PGD53nD\nMCRJomkax3EMw2ialmXZg++5Pep5giDg5jGCIKB+AADcM0/TNEEQ7XbbMAwMwxAEabVazWaTJMln\nH4oDAgICuuQ/DafRR0dmKlQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFQAAABUCAIAAACTCYeWAAAFeElEQVR4nO2bQU/bPBiAXRInNk7a\ndG21ktENGBEr26qJMW7cgMtu0yT2Dzhx2R/ht3CFHXeYpkqTpkmbQNpStbRA2FpoRwKE9DtYX0RY\ngUKTtGnznFIrsd8ndhzHdgEIGUwiF38MDw8zDNOtUPyHvfgjm82KotitUCiTk5OSJBUKBU3TZFmW\nZVnTtEKh4EVZQ15kemcymczr16/L5bIkSQzDrKysfPny5d27d5IkeVFcb8lTRFFcXFz0oaDekq9W\nq6qqJhKJra0ty7Ly+fzMzMyPHz+Oj4+9KM7R4b18+bLrz7yf+FHz0Wj0xuOu4Ll8Lpebn5+nx7Is\nv3nzhh5DCFdWVrwu/XrYm0+5K0tLS+Pj47IsAwCOjo6y2eyDBw8AAPPz8/bxwsLChw8fvIvhejyU\nBwCUy+VyuXxwcKDreq1Wq1Qqx8fHv379mpyczOfzAIDPnz97GsD1DHSH56h5juN4nu9WKP7jkBdF\n0aOxVG/ikGdZluO4boXiP2Gz/x9CSNcHHn7i6O1fvHghCEK3QvEfR83ruh6JRK46tf9wyNfr9ZOT\nk26F4j8O+Xv37g0PD3crFP9xNPJYLMay3g54e4rLvf1Aved7aybHZ0L5QAEhdGswEjx5hNDIyMjU\n1BQAIJ1Od5JVkPp2QghCaGZmJpfLWZY1Nze3ubnZSYZBqnkIYTQa5Xl+Y2Njf3//69evHda84z0v\ny3Lvv+ri8TghZG9v7+zsrMOsgtTsKdVqtVaruTIYC1Kzt2k2m51XOwiovFuE8oGCYRiEkCtZBUx+\naGjIxe/OIPX2EEKe5y3LcmvFOkg1jzFOJpMuZhgk+dPT02q1KstyKpXCGHeeYZCavWEYhmE0Go14\nPG6aZucZBqnmKefn579//3Ylq+DJg3CE5wqh/KASyg8qd5RnGObRo0dv37599uyZuwH5yR0HOYSQ\n1dVVAMDfv3+/ffvmakj+cQt5hFAymSSEPH/+3J7qe/LkCSFEVVW6tSxY3EI+Ho8vLS1NT09fSn/1\n6hXLsp3Lx2KxbDZ7KbFSqXi02R7cSh5jHI1GNzc3Dw8PL6bv7u6qqtp5KIeHh58+feo8n/YJ3tS1\ni7TV27Ms25fbVdqSxxj35R+P2pKv1+uEEELI0FBfDYralTEMQxRFCKGn0fjMzfIQQkKILMuRSMSV\nyaPeoa1XXSKR2Nvb8+hfPl3kZnkIYalUsizLh2h8xiEPIfz3PW+aZr/uT3NYMQzTr54tcahaltWX\nzfsqHPKSJAmCkMlk7O1OBwcHmqbR2fKW19MlFEVR7CZTKpXq9Xqj0TAMo0V5LCtJEsuyiqLYidvb\n26Zp1mq1lrPxCCFBEERRHB0dpSmmaW5vb9PwWkYlCAJCKJVK2Ss8jUajWCzSUuzTHIPW9+/f2wVc\nhMrX6/VSqWQ70OivWj+i8pqm2fHR20rlW15C5YvFon2jk8lkKpWi8i0voZnTe0dTRkdHRVGk8v+e\nb99ieu/aku9X+mq4elta9+1//vxZX19/+PChqqqKoqiqmk6n9/f3JyYmfv78+fTp03w+H41Gl5eX\nL16VTCZnZ2e9iHJtbY0+q4SQXC7nVrZt1byiKNSqWCzSlHQ6vbu761YQ3SJ85geVUH5QGWh5R4d3\n//79PpuruR7/5mQxxs1mU5ZljLGu6zzPf//+HSE0MTFBvwJ0Xa9UKr7FA3yTT6fTjx8/3tnZgRAi\nhHRdxxjv7OxMT08XCoVEIlGpVERR5HmeYZjT01NN0wRB8G6thuLTM89xXLPZRAjRvTR0LnxsbOzj\nx4+SJFmWlclkMMYQQpZlMcaKovjwf26fap7jODrtzXGcvZdI13UAAMaY4zjTNC3LoqsjZ2dnhmHw\nPN/yozgkJCTkjvwHJtXSTKZ1uxkAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "AUSGKCZOrYsm", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Visualize RAM state across this rollout\n" ] }, { "metadata": { "id": "rSZDq6L7rfYb", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 635 }, "outputId": "79d8e679-f6d6-4f62-964b-2a77b9cb4f86" }, "cell_type": "code", "source": [ "ram = np.array(ram)\n", "#get ram state across all frames of the observation\n", "bin_array = np.zeros((ram.shape[0],128*8),dtype=np.uint8)\n", "\n", "#convert from integer to bits\n", "for idx in range(ram.shape[0]):\n", " state = ram[idx]\n", " \n", " binary = m.ram_state_to_bits(state)\n", " binary = [int(k) for k in binary]\n", " \n", " bin_array[idx]=binary\n", "\n", "gray()\n", "matshow(bin_array)" ], "execution_count": 62, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 62 }, { "output_type": "display_data", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\nqHL3bezSfIcqtFdpbDqi7zKsEzgTe0yuCVE4shjFRADg5Zdfxu7du/Hkk0/itddew7Jly3Duuefi\nsccew8MPP4zzzz//Y9e37Xj566q+V/S79DOb7xV9p+zfTe1ter+6622eYfN722e7wqTcXNhYd8+2\n9dyWps+36V91GK3O7Nu3D4888ggef/xxDA0NYe3atTj33HMBAF/96lfx+uuvo9frYXJycv47hw8f\nRq/XQ6/Xw8TEBABgdnYWSZJgYGCgscGRSISLWhH54IMPsGPHDjz66KPzqzG333473nrrLQDA/v37\ncfbZZ2PVqlU4ePAgpqamMD09jfHxcaxZswbr16/H6OgoAGDv3r248MILHb5OJBLxTV9S48c899xz\neOihh/DFL35x/rOrr74azzzzDD71qU9hyZIl2LZtG5YvX47R0VHs2rULfX19GBkZwVVXXYWTJ09i\n69atePPNNzEwMIDt27fjjDPOcP5ikUjED7UiEolEIlVQZ6xGIhF+oohEIpFWRBGJRCKtiCISiURa\nEUUkEom0IopIJBJpRRSRSCTSiigikUikFf8fhgHagJ0vCjgAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "GGGFATfmtr8l", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Visualize neural representation across rollout for this rollout \n", "\n", "Activations of the 512 fully-connected neurons for each observation" ] }, { "metadata": { "id": "Puo55z-Us0mU", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 984 }, "outputId": "0d42e3ba-bfa8-4a28-b1dc-94ad7a044057" }, "cell_type": "code", "source": [ "hot()\n", "matshow(rep,vmax=3,vmin=0)" ], "execution_count": 63, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 63 }, { "output_type": "display_data", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "OucVhqv-qqAB", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Visualizing Top Patches for Sub-detecting Neuron\n", "\n", "Requires GPU runtime to be enabled (Go to \"Runtime\" menu -> \"Change Runtime Type\" option)" ] }, { "metadata": { "id": "wXjmrtOsiAsc", "colab_type": "code", "outputId": "abe7a6dc-f6ff-4ae9-cecc-3bb557b02870", "colab": { "base_uri": "https://localhost:8080/", "height": 90 } }, "cell_type": "code", "source": [ "import atari_zoo.top_patches\n", "algo = 'apex'\n", "env = 'SeaquestNoFrameskip-v4' \n", "run_id = 2\n", "observations, activations,frames = atari_zoo.top_patches.build_model_get_act(algo, env, run_id=run_id,which_layer=2)" ], "execution_count": 52, "outputs": [ { "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SeaquestNoFrameskip-v4_2\n", "Layer 2 deepq/q_func/convnet/Conv_2/Relu activations obtained. Shape (2501, 11, 11, 64)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "TzN49pBbp3XG", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 163 }, "outputId": "7c783b6e-a732-4405-ffc0-e6e604c4eba4" }, "cell_type": "code", "source": [ "#sub detector for apex run 2 Seaquest is feature 60\n", "filter_id = 60\n", "\n", "patches, picks, topleft = atari_zoo.top_patches.plot_topN_patches(activations, observations, which_filter=filter_id, which_layer=2,n=8,plot=False)" ], "execution_count": 66, "outputs": [ { "output_type": "stream", "text": [ "bottom left location in original obs: (66,22)\n", "bottom left location in original obs: (66,30)\n", "bottom left location in original obs: (66,30)\n", "bottom left location in original obs: (50,-2)\n", "bottom left location in original obs: (50,30)\n", "bottom left location in original obs: (66,30)\n", "bottom left location in original obs: (58,22)\n", "bottom left location in original obs: (74,30)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "68lppms2uE1U", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 2675 }, "outputId": "90a1ab47-1b91-46fd-d35c-8e2a92158ef6" }, "cell_type": "code", "source": [ "import matplotlib.patches as patches\n", "from pylab import *\n", "\n", "for pp, tl in zip(picks, topleft):\n", " #print(tl)\n", " #print(tuple(reversed(tl)))\n", " gray()\n", " fig, ax = subplots(1)\n", " ax.matshow(observations[pp,:,:,0])\n", " rect = patches.Rectangle(tuple(reversed(tl)),36,36,linewidth=1,edgecolor='r',facecolor='none')\n", " ax.add_patch(rect)" ], "execution_count": 67, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\neTO5ur6EAiIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\nsSQiEvB/TT5/a9OQkD0AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\nxfKRRx7BsGHDAAB9+vRBc3MzysrKsHTpUgBASkoKtmzZ4pdief36dU2/sbHR5+vwxzK9JVMWgHnc\nkSkLINe/ja5kcTxVCNCeLnjHHdqfWMLDw9V2cLC2lDmeZuSrbePxB56goCD07t0bAFBcXIzHHnsM\nzc3N6m53VFQU6urqfBKGiEhWwiel79u3D5s2bcKWLVswbtw4WK1WADcreFZWFgoLC11+tqKiAiaT\nyTeJKTAMBsD/1yuQrPj930LoB56DBw8iPz8fBQUFiIiIQO/evWG32xEaGgqbzebxV2qz2Qyg81fw\nDBo0SNP39fOIjx49iu9973s+Xaa3ZMoCAEcBufJItH1kygL4J4+3339Xszjvhj/77LNq2/mw3F//\n+le17Wo3vLN5jh496nLMY7G8evUqVq1ahffffx/9+vUDAIwaNQolJSV49tlnUVpaiuTkZOEwndHS\n0qLpX7t2zefr8McyvSVTFoB53JEpCyDXv42uZDl79qym/67gI3nd1QpfbRuPxXLv3r1oaGjAK6+8\nor72xhtvIDc3F0VFRYiLi8OECRN8EoaISFYei+WUKVMwZcqUW17funWrXwIREclI6it4nH/yb2pq\n8vk6bDabz5fpLZmyAMzjjkxZAP/k8XaZXcki09/DGa8NJyISwGJJRCSAxZKISIDUxyz79u2r6fv6\nTukAEBMT4/NlekumLGhslCsP5No+MmUB/JCnC99/T902nFkSEQlgsSQiEsBiSUQkgMWSiEgAiyUR\nkQAWSyIiASyWREQCWCyJiASwWBIRCWCxJCISIPXljkSO0tLS1PbevXs1YwUFBZr+xo0b1ba7RwUQ\nieLMkohIAIslEZEA7oZTtxEeHq6233nnHc3YN998o+m/9NJLattx9x0Ali1b5od01NNxZklEJIDF\nkohIAIslEZEAHrOkbuPJJ59U2ydOnNCMhYWFafo1NTVqOzY21r/B6FuBM0siIgEslkREArgbTt3G\njBkz9I5A32KcWRIRCfA4s2xubkZ2djbq6+vR0tKC2bNnY8iQIcjMzERbWxuio6ORl5eHkJCQQOQl\nItKFx2L56aefwmQyYcaMGaiursYvfvELjBw5EhaLBampqVizZg2Ki4thsVgCkZeISBced8PT0tLU\nY0U1NTWIiYlBWVkZxowZAwBISUmB1Wr1b0oiIp0ZFEVRRN44depU1NbWIj8/Hz//+c/VAnn27Flk\n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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUsAAAFKCAYAAACU6307AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3XtwVOX9x/FPJMRACLeYAGEEvAba\nBJFqW5BYUxAKWAVaBCMy1pGCXIyjSCBGCqUWuQ6CjKgQnKFFgtFBnOokxSmOQ0Mc0GJSNQptkVti\nRAIICZJwfn/w4zQnmN0ny16e0Pdrxpnn2WfPOR924etzzp5LlOM4jgAAPl0R6QAA0BJQLAHAAMUS\nAAxQLAHAAMUSAAxQLAHAQHS4NvTHP/5Re/bsUVRUlHJyctS3b99wbdr1+eefa+rUqXrwwQc1YcIE\nHTlyRLNmzVJ9fb0SExO1ZMkSxcTEhCXL4sWLtXv3btXV1Wny5MlKS0uLWJaamhrNnj1bR48e1Zkz\nZzR16lT17t07Ynkkqba2VnfddZemTp2qAQMGRCxLSUmJsrKydMMNN0iSbrzxRj388MMR/Wy2bt2q\ntWvXKjo6Wo8++qhSUlIikue1117T1q1b3X5ZWZleffVVzZs3T5KUkpKi+fPnhzzHBadOnVJ2draO\nHz+us2fPatq0aUpMTAxeHicMSkpKnN/+9reO4zjO3r17nXvvvTccm/U4deqUM2HCBCc3N9fZsGGD\n4ziOM3v2bOftt992HMdxli1b5vz5z38OS5bi4mLn4YcfdhzHcb755hvnZz/7WcSyOI7j/OUvf3Fe\neuklx3Ec5+DBg87QoUMjmsdxHGf58uXOmDFjnNdffz2iWXbu3OnMmDHD81ok83zzzTfO0KFDnZMn\nTzqVlZVObm5uxL8rxzn/b3zevHnOhAkTnD179jiO4ziPP/64s3379rBl2LBhg7N06VLHcRynoqLC\nGTZsWFDzhGU3vLi4WEOGDJEkXXfddTp+/Li+/fbbcGzaFRMTo5dffllJSUnuayUlJRo8eLAkKSMj\nQ8XFxWHJcuutt+q5556TJLVv3141NTURyyJJI0aM0KRJkyRJR44cUZcuXSKaZ9++fdq7d6/uuOMO\nSZH7npoSyTzFxcUaMGCA2rVrp6SkJC1YsMCKz2f16tWaNGmSDh065O41hjtLp06dVF1dLUk6ceKE\nOnbsGNQ8YSmWX3/9tTp16uT2O3furKqqqnBs2hUdHa3Y2FjPazU1Ne7uSkJCQtgytWrVSm3btpUk\nFRQU6Pbbb49YlobGjx+vmTNnKicnJ6J5Fi1apNmzZ7v9SH82e/fu1ZQpU3Tfffdpx44dEc1z8OBB\n1dbWasqUKcrMzFRxcXHEP5+PP/5Y3bp1U6tWrdS+fXv39XBnGTlypA4fPqw777xTEyZM0KxZs4Ka\nJ2zHLBtyLLzCMhKZtm3bpoKCAuXl5Wno0KERzSJJmzZt0qeffqonn3zSkyGcebZs2aJ+/frp6quv\n/t7xcH82vXr10vTp0zV8+HAdOHBAEydOVH19fcTySFJ1dbWef/55HT58WBMnTozYd3VBQUGBRo8e\nfdHr4c7y5ptvKjk5WevWrdNnn32madOmKT4+Pmh5wlIsk5KS9PXXX7v9r776SomJieHYtE9t27ZV\nbW2tYmNjVVlZ6dlFD7X3339fa9as0dq1axUfHx/RLGVlZUpISFC3bt3Up08f1dfXKy4uLiJ5tm/f\nrgMHDmj79u2qqKhQTExMRD+bLl26aMSIEZKkHj166KqrrlJpaWnE8iQkJOjmm29WdHS0evToobi4\nOLVq1SpieaTzhyVyc3MVFRXl7gZLCnuWDz/8UIMGDZIk9e7dW2fOnFFdXV3Q8oRlN/y2225TYWGh\nJOmf//ynkpKS1K5du3Bs2qeBAwe6uYqKipSenh6W7Z48eVKLFy/Wiy++qI4dO0Y0iyTt2rVLeXl5\nks4fMjl9+nTE8qxYsUKvv/66Nm/erLFjx2rq1KkR/Wy2bt2qdevWSZKqqqp09OhRjRkzJmJ5Bg0a\npJ07d+rcuXM6duxYRL8r6XwBiouLU0xMjFq3bq1rr71Wu3btikiWnj17as+ePZKkQ4cOKS4uTtdd\nd13Q8kQ5YZorL126VLt27VJUVJR+97vfqXfv3uHYrKusrEyLFi3SoUOHFB0drS5dumjp0qWaPXu2\nzpw5o+TkZC1cuFCtW7cOeZb8/HytWrVK11xzjfvas88+q9zc3LBnkc6fpvPUU0/pyJEjqq2t1fTp\n05Wamqrs7OyI5Llg1apV6t69uwYNGhSxLN9++61mzpypEydO6OzZs5o+fbr69OkT0c9m06ZNKigo\nkCQ98sgjSktLi1iesrIyrVixQmvXrpV0/vju3Llzde7cOd10002aM2dOWHJI508dysnJ0dGjR1VX\n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\nMkHQohkVy71792rKlCk6fvy4pk+frpqaGne3OyEhQVVVVSENCQCRFuU4juPrDZWVldq9e7eGDx+u\nAwcOaOLEiTp9+rQ++OADSdL+/fuVnZ2tTZs2NbmOsrIypaamBjc5QisqSvL9VwOXM77/i/idWXbp\n0sU91aJHjx666qqrVFpaqtraWsXGxqqysvKiUzMaS0tLkyQ5jtOsm7Z269bN04+Pjzde1kR5eblS\nUlKCus5A2ZRFksolu/JY9PnYlEUKTZ5Av/+W/tmUl5c3Oeb31KGtW7dq3bp1kqSqqiodPXpUY8aM\nUWFhoSSpqKhI6enpxmEAoCXyO7P8+c9/rpkzZ+rdd9/V2bNnNW/ePPXp00fZ2dnKz89XcnIyjyEF\ncNnzWyzbtWunNWvWXPT6+vXrQxIIAGzEFTwAYIBiCQAGKJYAYIBiCQAGKJYAYIBiCQAGKJYAYIBi\nCQAGKJYAYIBiCQAGKJYAYIBiCQAGKJYAYIBiCQAGAnpgGQCYavx0hCeffNJt5+fne8Z+8pOfePr7\n9u1z27t37w5om08//bRnrKamxm0vW7bMeJ3MLAHAAMUSAAxQLAHAAMcsAYTUzJkzPf1z58657bFj\nx3rGrrzySk9/8+bNAW3zwhNpJe8xysaeeOIJ43UyswQAAxRLADDAbjiAoGt46k50tLfMLFy40G3P\nmTPHM/bJJ594+jfffLPb/uijj4y337dvX7e9dOlSz1jDbTbMIkmTJk1qcp3MLAHAAMUSAAxQLAHA\nAMcsAQSd4zhuu/FxwYZ8jV2KC+t98MEHg7ZNZpYAYMBoZrl161atXbtW0dHRevTRR5WSkqJZs2ap\nvr5eiYmJWrJkiWJiYkKdFQAixu/M8tixY1q9erU2btyoNWvW6N1339XKlSuVmZmpjRs3qmfPnioo\nKAhHVgCIGL/Fsri4WAMGDFC7du2UlJSkBQsWqKSkRIMHD5YkZWRkqLi4OORBASCS/O6GHzx4ULW1\ntZoyZYpOnDihGTNmqKamxt3tTkhIUFVVlc91lJaWKjU1VZL3wK8NysvLIx3BZVMWRUXZlUd2fT42\nZZFCkOcSvv/L9bMxOmZZXV2t559/XocPH9bEiRM9Bc+k+KWlpbnvbXwjUF+6devm6cfHxxsva6K8\nvFwpKSlBXWegbMoiSeWSXXks+nxsyiKFJk+g339L/2x8FVa/xTIhIUE333yzoqOj1aNHD8XFxalV\nq1aqra1VbGysKisrlZSUZBymORr/aNSmTZugbyMU6wyUTVkk8vhiUxbJrn8bl+tn4/eY5aBBg7Rz\n506dO3dOx44d0+nTpzVw4EAVFhZKkoqKipSenh6UMABgK78zyy5dumjYsGG69957JUm5ublKS0tT\ndna28vPzlZycrFGjRoU8KABEktExy/Hjx2v8+PGe19avXx+SQABgI6svd2z8Y1DjWz0FQyjWGSib\nskjk8cWmLJJd/zYu18+Gyx0BwADFEgAM2DVfbqTxOZx1dXVB30Yo1hkom7JI5PHFpiySXf82LtfP\nhpklABigWAKAAYolABiw+phl42vBO3fu7LZvueUWz1jjvi/V1dXfu87GvvnmG+N1BouvPFOmTAlo\nnW+//ban/+WXX7rtxg+g9/VA+lBozp83JyfHeL1r1qxpcizc32vjy+0a9nv06OEZGzFiREDbaEl/\njxues92xY0fjde7atavJ/tmzZz1jJ0+eNF6vKWaWAGCAYgkABqzeDR8yZIinP2DAgKCst+HUP9Bd\n20u5R15Tt4xqzm5mcwS0azdunKZNm+Z5qaKiwnjxhldf3Xjjjc3f/iUK9Hv9/PPP3bav2w/+6le/\n8vS7du3q6Xfo0CGg7Qcq6H+P9+y56M/YWLj/Hgd66G3mzJme/r///e+Ats/MEgAMUCwBwADFEgAM\nWH3M0mY23To/VBofdwv3cbhIMD2+erl8/77+HJfLn7HxExcC/XMxswQAA8ws8f169tS948ZFOsV/\njRuneyOd4QKbskghyXMqMTHIa2z5KJb4fv/5jzZv3hzpFK57773Xmjw2ZZHsy3O5YjccAAxQLAHA\nAMUSAAxclscsly9f7ukfP37c06+trZV0/ljPwoULv3dMuvhOJg37WVlZnrE33njDbU+cONEzNnny\nZE//7rvvdtv333//9/8hLtGFRxdHeh3BFIo8jb/jxpd4NpVj27ZtQc/S2JVXXunpp6enh3ybaBoz\nSwAwQLEEAAMUSwAwcFkes/zkk088/e7du3v6De+ivHfvXs/YunXr3HbDO6pL0jPPPOO2586d6xnr\n16+f2/7ss888Y6NHj/b0Gx8nA2A/v8Xytdde09atW91+WVmZXn31Vc2bN0/S+ess58+fH7KAAGAD\nv8Vy7NixGjt2rCTpgw8+0DvvvKNnnnlGOTk56tu3r5544gm99957+tnPfhbysAAQKc3aDV+9erUW\nLlyoCRMmqG/fvpKkjIwMFRcXW1Us165da/zehrvdjTV+mNKSJUsCyvPTn/40oOUuxaVe/mbbJXTh\nytP47vyX+j5cPox/4Pn444/VrVs3tWrVSu3bt3dfT0hIUFVVVUjCAYAtohxfDxppYO7cuRo5cqR6\n9eqlyZMna8uWLZKkv//973r99de1bNmyJpctKytTampqcBIDQAQY74aXlJQoNzdXUVFRnl+JKysr\nlZSU5HPZtLQ0SecfANXwQVb+PPbYY55+sB5YdoFNu5o2ZZHI44tNWSS78tiURWp+Hl9XiRnthldW\nViouLk4xMTFq3bq1rr32WvcB50VFRVyG9T/o8OHDnv+Ay53RzLKqqkqdO3d2+zk5OZo7d67OnTun\nm266SQMHDgxZQACwgVGxTE1N9fzCfP3112vjxo0hCwUAtrksr+BBaLz//vtuu7Ky0jMWFxfn6Q8f\nPjwsmYBw4dpwADBAsQQAAxRLADDAMUt4nD592m3v2LHDM3bhEldJ6tChQ9gyATZgZgkABiiWAGCA\n3XB4HDx40G3fdtttEUwC2IWZJQAYoFgCgAGKJQAYML6f5SVt5P9vy9bcW7SFmk15bMoikccXm7JI\nduWxKYvU/Dy+yiEzSwAwQLEEAAMUSwAwwHmWCInrr7/ebe/du9cz1vBJoD169PCMffnll267a9eu\nTa6/U6dOnv7QoUM9/YqKiiaXra2tddslJSVNvg9oiJklABigWAKAAXbDERTx8fGefsNnybdq1coz\n9sknn7jtxrvTbdq0cduNd6X79evnttu1a+cZ279/v6efkJDgtt99913P2OjRo932D37wAzWl4R2Y\nJGnbtm2e9Te8O3zDwwe4PDGzBAADFEsAMECxBAADHLNESJw6darJse7duwe0zobHQf/xj394xhqe\njiRJ+/btc9u/+MUvmlznFVd45wvnzp1r8r0Nc3fv3l3V1dW+A+OywswSAAxQLAHAAHcdsiSPTVkk\n8vhiUxbJrjw2ZZG46xAAhJ3fH3hOnTql7OxsHT9+XGfPntW0adOUmJioefPmSZJSUlI0f/78UOcE\ngMhy/NiwYYOzdOlSx3Ecp6Kiwhk2bJgzYcIEZ8+ePY7jOM7jjz/ubN++3ec6JDkXNnWhbcN/NuWx\nKQt5Wk4W2/LYlCWQPL743Q3v1KmTe4rEiRMn1LFjRx06dEh9+/aVJGVkZKi4uNjfagCgRfO7Gz5y\n5Ei98cYbuvPOO3XixAm98MIL+v3vf++OJyQkeM5/+z6lpaVKTU2VJJ8HUCPBpjw2ZZHI44tNWSS7\n8tiURQpeHr/F8s0331RycrLWrVunzz77TNOmTfPcNMEkSFpamvvelvxLWSjZlEUijy82ZZHsymNT\nFqn5eXzVM7/F8sMPP9SgQYMj0vWqAAAA4ElEQVQkSb1799aZM2dUV1fnjldWViopKck4DAC0RH6P\nWfbs2VN79uyRJB06dEhxcXG67rrrtGvXLklSUVGR0tPTQ5sSACLM70npp06dUk5Ojo4ePaq6ujpl\nZWUpMTFRc+fO1blz53TTTTdpzpw5vjfCSel+2ZRFIo8vNmWR7MpjUxYpuLvhXMFjSR6bskjk8cWm\nLJJdeWzKIgW3WHIFDwAYoFgCgAGKJQAYoFgCgAGKJQAYoFgCgAGKJQAYCMt5lgDQ0jGzBAADFEsA\nMECxBAADFEsAMECxBAADFEsAMPB/eKspXICJ/eIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\nywAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUsAAAFKCAYAAACU6307AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3X9UVGX+B/D3CLIkoOIICG5ivwTb\nGTNPtWFSkaaLtvljN7WJPLWr6fojOq0BEsvKelzzRx7TPFkpbsddA0PX6GwFW62tuSOtukvMVrjY\nLirKRAZowhA/7vcPv97lIjPzMN6Z+0Dv1zme8zzzzL33zQx8fO6de++YFEVRQEREHvUzOgARUW/A\nYklEJIDFkohIAIslEZEAFksiIgEslkREAoIDtaHf/va3KC8vh8lkQnZ2NsaMGROoTauOHz+OxYsX\n47HHHkNaWhrOnj2LjIwMtLe3IyoqCuvXr0dISEhAsqxbtw5Hjx5FW1sbFi5cCKvValiW5uZmZGVl\n4dy5c2hpacHixYuRmJhoWB4AcLlceOCBB7B48WIkJSUZlqWsrAzp6em46aabAACjRo3C/PnzDX1t\niouLsX37dgQHB+PJJ59EQkKCIXneeOMNFBcXq32Hw4HXX38dK1euBAAkJCQgLy/P7zkuu3jxIjIz\nM9HY2IjW1lYsWbIEUVFR+uVRAqCsrEx54oknFEVRlKqqKmX27NmB2KzGxYsXlbS0NCUnJ0fZtWuX\noiiKkpWVpbz99tuKoijK888/r/zhD38ISBa73a7Mnz9fURRF+frrr5V77rnHsCyKoih/+tOflFde\neUVRFEU5ffq0MnnyZEPzKIqibNy4UZk1a5ayd+9eQ7McPnxYWbZsmeYxI/N8/fXXyuTJk5ULFy4o\nTqdTycnJMfy9UpRLf+MrV65U0tLSlPLyckVRFOXpp59WDhw4ELAMu3btUjZs2KAoiqLU1tYqU6ZM\n0TVPQHbD7XY7Jk2aBAC44YYb0NjYiG+++SYQm1aFhITg1VdfRXR0tPpYWVkZJk6cCABISUmB3W4P\nSJbbb78dL7zwAgBg4MCBaG5uNiwLAEydOhULFiwAAJw9exYxMTGG5jlx4gSqqqpw7733AjDufXLH\nyDx2ux1JSUkIDw9HdHQ0Vq1aJcXrs3XrVixYsAA1NTXqXmOgs0RGRqKhoQEAcP78eQwePFjXPAEp\nll999RUiIyPV/pAhQ1BXVxeITauCg4MRGhqqeay5uVndXTGbzQHLFBQUhAEDBgAAioqKcPfddxuW\npbO5c+di+fLlyM7ONjTP2rVrkZWVpfaNfm2qqqqwaNEiPPzwwzh06JCheU6fPg2Xy4VFixbBZrPB\nbrcb/vp88skniI2NRVBQEAYOHKg+Hugs06ZNw5kzZ3D//fcjLS0NGRkZuuYJ2DHLzhQJr7A0ItN7\n772HoqIi5OfnY/LkyYZmAYCCggJ89tlneOaZZzQZApln//79GDt2LK699tpuxwP92owcORJLly5F\namoqTp06hXnz5qG9vd2wPADQ0NCAF198EWfOnMG8efMMe68uKyoqwsyZM694PNBZ3nzzTcTFxWHH\njh34/PPPsWTJEkREROiWJyDFMjo6Gl999ZXa//LLLxEVFRWITXs0YMAAuFwuhIaGwul0anbR/e3g\nwYPYtm0btm/fjoiICEOzOBwOmM1mxMbGYvTo0Whvb0dYWJgheQ4cOIBTp07hwIEDqK2tRUhIiKGv\nTUxMDKZOnQoAGDFiBIYOHYqKigrD8pjNZtx6660IDg7GiBEjEBYWhqCgIMPyAJcOS+Tk5MBkMqm7\nwQACnuXYsWOYMGECACAxMREtLS1oa2vTLU9AdsPvuusulJSUAAD+9a9/ITo6GuHh4YHYtEfjx49X\nc5WWliI5OTkg271w4QLWrVuHl19+GYMHDzY0CwAcOXIE+fn5AC4dMmlqajIsz6ZNm7B3717s2bMH\nDz30EBYvXmzoa1NcXIwdO3YAAOrq6nDu3DnMmjXLsDwTJkzA4cOH0dHRgfr6ekPfK+BSAQoLC0NI\nSAj69++P66+/HkeOHDEkS3x8PMrLywEANTU1CAsLww033KBbHpMSoLnyhg0bcOTIEZhMJvz6179G\nYmJiIDarcjgcWLt2LWpqahAcHIyYmBhs2LABWVlZaGlpQVxcHNasWYP+/fv7PUthYSG2bNmC6667\nTn3sueeeQ05OTsCzAJdO03n22Wdx9uxZuFwuLF26FBaLBZmZmYbkuWzLli0YPnw4JkyYYFiWb775\nBsuXL8f58+fR2tqKpUuXYvTo0Ya+NgUFBSgqKgIA/OIXv4DVajUsj8PhwKZNm7B9+3YAl47v5ubm\noqOjA7fccgtWrFgRkBzApVOHsrOzce7cObS1tSE9PR1RUVG65QlYsSQi6s14BQ8RkQAWSyIiASyW\nREQCWCyJiASwWBIRCWCxJCIS4PMVPDLcco2IKFB8KpYff/wxqqurUVhYiBMnTiA7OxuFhYV6ZyMi\nkocv93XbtGmTsmfPHrU/ZcoU5cKFC26fD0ABoFRUVKhtGf7JlEemLMzTe7LIlkemLL7k8cSnYpmT\nk6P8+c9/VvsPP/yw8sUXX3gtlp3bMvyTKY9MWZin92SRLY9MWXzJ44kudx1SvFwxWVFRAYvFIvTc\nQJMpj0xZAObxRKYsgFx5ZMoC6JfHp2LZ01uuWa1WAJdCm0wmXzbpFzLlkSkLwDyeyJQFkCuPTFmA\nnufxVFh9OnVI1luuERH5i08zy3HjxuEHP/gB5s6dq95yjYioLwvILdouT4N7+xTdn2TKAjCPJzJl\nAeTKI1MWQILdcCKi7xoWSyIiASyWREQCWCyJiAQY8r3hosaNG6fpx8XF6b6NBx54QPd1+kqmLADz\neCJTFkCuPDJlAfTLw5klEZEAFksiIgFS74bTd88TTzyhtl955RXNWOfvwp4+fbpm7MyZM5r+bbfd\npraLi4s1YwsXLlTbubm5mrF+/f43f2hpadGMvfrqq5r2ggULuh0DIDxGvQdnlkREAlgsiYgEsFgS\nEQngMUuSSufjlElJSZqx+fPnq+2XXnpJMzZs2DBN/8c//rHanjJlitvttba2avpz5sxR28HB2j+P\nd999FwDw2GOPqW367uDMkohIAIslEZEA7oaTtBITEzX9L774wu1zhw8frumvW7dObX//+9/XjA0Z\nMkRtdz4dCQAmTZqktjMyMrrd1mOPPYYPPvhA81jX04wiIyPVtsvlcpubeg/OLImIBLBYEhEJYLEk\nIhLAY5YkrZ07d6rtWbNmqV+S152jR4+6Hauvr9f0Kyoq3D5X9FLErutcunSp2+cuW7ZMaJ0kN84s\niYgEsFgSEQlgsSQiEsBiSUQkgMWSiEgAiyURkQCeOkTC4uPj1bbNZtOMrVmzRng9W7duVdtLliwR\nXm7VqlVq+1e/+pXwckR64MySiEiAULE8fvw4Jk2ahN///vcAgLNnz+LRRx+FzWZDeno6vv32W7+G\nJCIymtdi2dTUhFWrVmluxLp582bYbDbs3r0b8fHxKCoq8mtIIiKjeT1mGRISgldffVXzDXVlZWXI\ny8sDAKSkpCA/P/+KY1jUO6WmpqrtzncbB4AHH3zQ7XJDhw7V9AcOHKi2V6xY4Xa5kSNHavrXXXed\n2u76O9X5bug//elPNWP8D5v8zaQoiiLyxC1btiAyMhJpaWlISkqC3W4HAJw8eRIZGRkoKChwu6zD\n4YDFYtEnMRGRAa7603CRWmu1WtXnmkwm4XWPGzdO04+Li+tZOC/eeuutK2ZPRpEly+WZ5eLFi6/4\n3m5PM8uus0fRmeXq1as1fXczy2HDhqG2tlbtd72pRiBnlrK8V5fJlEemLEDP87z11ltux3wqlgMG\nDIDL5UJoaCicTieio6N9WQ1JzlNx7Fy4uuOpQHbmdDo1/WeffVZouUOHDgk9j0gvPp06NH78ePV/\n9tLSUiQnJ+saiohINl5nlg6HA2vXrkVNTQ2Cg4NRUlKCDRs2ICsrC4WFhYiLi8OMGTMCkZWIyDBe\ni6XFYsGuXbuueLzzjVmJiPo6Xu5IGu+88w6ASx/wiN41vDu+Lutuubfeeuuq8hBdLV7uSEQkgMWS\niEiA1LvhISEhmn5oaKju2/DHOn0lUxaAeTyRKQsgVx6ZsgD65eHMkohIAIslEZEAFksiIgFSH7MM\nCwvT9IcMGaL7NvyxTl/JlAVgHk9kygLIlUemLIB+eTizJCISwGJJRCRA6t3wrh/5d90t14M/1ukr\nmbIAzOOJTFkAufLIlAXQLw9nlkREAlgsiYgEsFgSEQlgsSQiEsBiSUQkgMWSiEgAiyURkQCpz7Ps\nen5UZGSk7tvwxzp9JVMWgHk8kSkLIFcembIA+uXhzJKISACLJRGRAKl3wysrKzX9xsZG3bdx6NAh\n3dfpq65Zut4p/ttvvw1kHKleG0CuPDJlAeTKI1MWQL88nFkSEQlgsSQiEsBiSUQkQOpjlm1tbZq+\nP47ZBfo4oCddswwaNEjTz8jIUNu5ubkBz2M0mfLIlAWQK49MWQD98ggVy3Xr1uHo0aNoa2vDwoUL\nYbVakZGRgfb2dkRFRWH9+vVXfBhBRNSXeC2Whw8fxr///W8UFhaivr4eM2fORFJSEmw2G1JTU7Fx\n40YUFRXBZrMFIi8RkSG8Fsvbb78dY8aMAQAMHDgQzc3NKCsrQ15eHgAgJSUF+fn5fimW38Xd8IED\nB6p9q9WqGQ8KClLbd9xxh2aspaVF0//73/+uSx6ZyJRHpiyAXHlkygLol8frBzxBQUEYMGAAAKCo\nqAh33303mpub1d1us9mMuro6XcIQEcnKpCiKIvLE9957Dy+//DLy8/MxefJk2O12AEB1dTUyMzNR\nUFDgdlmHwwGLxaJPYiIiAwh9wHPw4EFs27YN27dvR0REBAYMGACXy4XQ0FA4nU5ER0d7XP7y7qSi\nKDCZTMLhEhISNP2hQ4cKLyvio48+woQJE3Rdp68uZ+m8Gz5+/HjNcyZOnKi233zzTc2Y3rvhMr02\ngFx5ZMoCyJVHpixAz/N89NFHbse8FssLFy5g3bp1+N3vfofBgwcDuPRHXFJSgunTp6O0tBTJycnC\nYXqi67c7hoeH674Nf6zTV+Hh4ejX739HRhwOh2a8a9/buvTIIxOZ8siUBZArj0xZAP3yeC2Wb7/9\nNurr6/HUU0+pjz333HPIyclBYWEh4uLiMGPGDF3CEBHJymuxnDNnDubMmXPF4zt37vRLICIiGQl/\nwHNVG/n/45Q9PWZ5+VP4y/r3769rroaGBvXQgtFkygIwjycyZQHkyiNTFqDneRoaGtyO8dpwIiIB\nLJZERAJYLImIBEh916Gud92JiIjQfRsxMTG6r9NXMmUBmMcTmbIAcuWRKQugXx7OLImIBLBYEhEJ\nYLEkIhLAYklEJIDFkohIAIslEZEAFksiIgEslkREAlgsiYgEsFgSEQmQ+nJH6vvGjRun6R87dsyg\nJESecWZJRCSAxZKISAB3wyngfvjDH6rtsrIyA5MQiePMkohIAIslEZEAFksiIgE8Zkl+l5ycrOkf\nPHjQoCREvuPMkohIAIslEZEA7oaTX/Tr5/7/4XvuuUdtf/jhh4GIQ3TVOLMkIhLgdWbZ3NyMrKws\nnDt3Di0tLVi8eDESExORkZGB9vZ2REVFYf369QgJCQlEXiIiQ3gtln/5y19gsViwYMEC1NTU4Gc/\n+xnGjRsHm82G1NRUbNy4EUVFRbDZbIHIS0RkCK/FcurUqWr77NmziImJQVlZGfLy8gAAKSkpyM/P\nZ7EkjY6ODrXt6VShO++8U9OvqalR26dOndI/GJGPTIqiKCJPnDt3Lmpra7Ft2zY8/vjjsNvtAICT\nJ08iIyMDBQUFbpd1OBywWCz6JCYiMoDwp+EFBQX47LPP8Mwzz6BzfRWptVarVX2uyWQSDhcbG6vp\nR0RECC8rorKyEgkJCbqu01cyZQECl0d0ZinT6yNTFkCuPDJlAXqep7Ky0u2Y12LpcDhgNpsRGxuL\n0aNHo729HWFhYXC5XAgNDYXT6UR0dLRwGKLODh8+rOnffPPNBiUh8szrqUNHjhxBfn4+AOCrr75C\nU1MTxo8fj5KSEgBAaWnpFZezERH1NV5nlnPnzsWzzz4Lm80Gl8uF3NxcWCwWZGZmorCwEHFxcZgx\nY0YgshIRGcZrsQwNDcXzzz9/xeM7d+70SyAiIhnxckeSyqeffmp0BKJu8XJHIiIBLJZERAJYLImI\nBLBYEhEJYLEkIhLAYklEJIDFkohIAIslEZEAFksiIgEslkREAlgsiYgEsFgSEQlgsSQiEsBiSUQk\ngMWSiEgAiyURkQAWSyIiASyWREQCWCyJiASwWBIRCWCxJCISwGJJRCSAX4VL3Rs5EpXV1Uan+B+T\nCZVGZ7hMpiyAX/KcDg7GxOuv13mtvRuLJXWvuhoJo0YZnUJVWVmJhIQEo2MAkCsL4J88lceP67q+\nvoC74UREAoSKpcvlwqRJk7Bv3z6cPXsWjz76KGw2G9LT0/Htt9/6OyMRkeGEiuVLL72EQYMGAQA2\nb94Mm82G3bt3Iz4+HkVFRX4NSEQkA6/F8sSJE6iqqsK9994LACgrK8PEiRMBACkpKbDb7X4NSEQk\nA6/Fcu3atcjKylL7zc3NCAkJAQCYzWbU1dX5Lx0RkSQ8fhq+f/9+jB07Ftdee22344qiCG2koqIC\nFoulR8sESmWlPCeByJQFJpNceSDX6yNTFsAPea7i/e+rr43HYnngwAGcOnUKBw4cQG1tLUJCQjBg\nwAC4XC6EhobC6XQiOjra60asViuAS4XSZDIJh4uNjdX0IyIihJcVIdMpIDJlAYBKQK48Er0+MmUB\n/HTqEHx7/3v7a+OpsHoslps2bVLbW7ZswfDhw/GPf/wDJSUlmD59OkpLS5GcnCwchIiot+rxeZbL\nli3D/v37YbPZ0NDQgBkzZvgjFxGRVISv4Fm2bJna3rlzp1/CEBHJilfwEBEJYLEkIhLAYklEJIDF\nkohIAIslEZEAFksiIgEslkREAlgsiYgEsFgSEQlgsSQiEsBiSUQkgMWSiEgAiyURkQAWSyIiASyW\nREQCWCyJiASwWBIRCWCxJCISwGJJRCSAxZKISACLJRGRABZLIiIBLJZERAJYLImIBLBYEhEJYLEk\nIhLAYklEJCDY2xPKysqQnp6Om266CQAwatQozJ8/HxkZGWhvb0dUVBTWr1+PkJAQv4clIjKK12IJ\nAHfccQc2b96s9lesWAGbzYbU1FRs3LgRRUVFsNlsfgtJRGQ0n3bDy8rKMHHiRABASkoK7Ha7rqGI\niGQjNLOsqqrCokWL0NjYiKVLl6K5uVnd7Tabzairq/NrSCIio5kURVE8PcHpdOLo0aNITU3FqVOn\nMG/ePDQ1NeHjjz8GAFRXVyMzMxMFBQVu1+FwOGCxWPRNTv5lMgGefzWoL+P7fwWvM8uYmBhMnToV\nADBixAgMHToUFRUVcLlcCA0NhdPpRHR0tMd1WK1WAICiKDCZTMLhYmNjNf2IiAjhZUVUVlYiISFB\n13X6SqYsAFAJyJVHotdHpiyAf/L4+v739temsrLS7ZjXYllcXIy6ujr8/Oc/R11dHc6dO4dZs2ah\npKQE06dPR2lpKZKTk4XDEAXCtGnT1PYTTzyhGXvhhRfU9gcffBCwTNS7eS2W9913H5YvX473338f\nra2tWLlyJUaPHo3MzEwUFhYiLi4OM2bMCERWIiLDeC2W4eHh2LZt2xWP79y50y+BiIhkJPRpOFFv\nM3/+fLXd1NSkGXvkkUfUNnfDSRQvdyQiEsBiSUQkgMWSiEgAj1mStP74xz9q+tOnT1fbjz/+uGas\nvb1d029ra3O73rCwMLW9d+9ezVhhYaHa3rNnj3hY6vM4syQiEsBiSUQkgLvhJK1+/bT/lz/66KNq\nu7m52ef1dr7ktn///pqxtLQ0tb1v3z636wgODsaKFSvU/u23364Zb21tdbvsX//6V7Xd+Woikhtn\nlkREAlgsiYgEsFgSEQngMUuS1po1a9T2a6+95vEYoq+6nnLU+dQhT9ra2rBq1Srd85C8OLMkIhLA\nYklEJIC74SStw4cPa/q7d+82KAkRZ5ZEREJYLImIBLBYEhEJ4DFLIvLJuHHj1PaxY8f8vr34+HhN\nv7q62u/b7IwzSyIiASyWREQCuBtORN1KTEzU9B944AG3z/3iiy/U9uDBgzV3iNqyZYvPGZYvX+52\nrLy8XG1brVbN2MaNG33epjucWRIRCWCxJCISwGJJRCSAxyyJqFtff/21pl9fX6/pR0ZGqu3Ro0dr\n2g6HQ5cMdXV1avubb77RjJnNZrXd2Nioy/Y84cySiEiA0MyyuLgY27dvR3BwMJ588kkkJCQgIyMD\n7e3tiIqKwvr16xESEuLvrEREhvE6s6yvr8fWrVuxe/dubNu2De+//z42b94Mm82G3bt3Iz4+HkVF\nRYHISkRkGK8zS7vdjqSkJISHhyM8PByrVq3Cfffdh7y8PABASkoK8vPzYbPZ/B6WiALnyy+/1PR3\n7NghtJzdbtctw2uvvabbuq6W12J5+vRpuFwuLFq0COfPn8eyZcvQ3Nys7nabzWbNQdjuVFRUwGKx\nAAAURdEhtn4qKyuNjqCSKQtMJrnyQK7XR6YsgB/yXMX731dfG6Fjlg0NDXjxxRdx5swZzJs3T1Pw\nRIrf5bPrFUXRfGezN7GxsZp+RESE8LIiKisrkZCQoOs6fSVTFgCoBOTKI9HrI1MWwD95fH3/e/tr\n46mwei2WZrMZt956K4KDgzFixAiEhYUhKCgILpcLoaGhcDqdiI6OFg7TE10/NLrmmmt034Y/1ukr\nmbIAzOOJTFkAuf42+upr4/UDngkTJuDw4cPo6OhAfX09mpqaMH78eJSUlAAASktLkZycrEsYIiJZ\neZ1ZxsTEYMqUKZg9ezYAICcnB1arFZmZmSgsLERcXBxmzJjh96BEREYSOmY5d+5czJ07V/PYzp07\n/RKIiEhGUl/u2PXDoOBg/eP6Y52+kikLwDyeyJQFkOtvo6++NrzckYhIAIslEZEAuebLXXQ9h7Ot\nrU33bfhjnb6SKQvAPJ7IlAWQ62+jr742nFkSEQlgsSQiEsBiSUQkQOpjll2vBR8yZIjavu222zRj\nXfueNDQ0dLvOrrreKToQPOVZtGiRT+t8++23Nf2TJ0+q7ebmZs1Y176/9eTnzc7OFl7vtm3b3I4F\n+n3terld5/6IESM0Y1OnTvVpG73p97jzOduDBw8WXueRI0fc9ltbWzVjFy5cEF6vKM4siYgEsFgS\nEQmQejd80qRJmn5SUpIu6+089fd11/Zq7pHn7pZRPdnN7Amfdu3mzMGSJUs0D9XW1gov3vnqq1Gj\nRvV8+1fJ1/f1+PHjatvT7Qd/8pOfaPrDhg3T9AcNGuTT9n2l++9xefkVP2NXgf499vXQ2/LlyzX9\n//znPz5tnzNLIiIBLJZERAJYLImIBEh9zFJmMt0631+6HncL9HE4I4geX+0r77+nn6Ov/Ixdv3HB\n15+LM0siIgEslkREAlgsiYgEsFgSEQlgsSQiEsBiSUQkoE+eOrRx40ZNv7GxUdN3uVwAgNmzZ2PN\nmjXdjgFX3smkcz89PV0ztm/fPrU9b948zdjChQs1/QcffFBtP/LII93/EFfp8lcX+2zOnKtfh85k\nyuMtS+ffh3fffdenbXzve9/T9JOTk31aD+mDM0siIgEslkREAlgsiYgE9Mljlp9++qmmP3z4cE2/\n812Uq6qqNGM7duxQ253vqA4Aq1evVtu5ubmasbFjx6rtzz//XDM2c+ZMTb/rsVAikp/XYvnGG2+g\nuLhY7TscDrz++utYuXIlgEvXWebl5fktIBGRDLwWy4ceeggPPfQQAODjjz/GO++8g9WrVyM7Oxtj\nxozBL3/5S3z44Ye45557/B6WiMgoPdoN37p1K9asWYO0tDSMGTMGAJCSkgK73S5Vsdy+fbvwczvv\ndnfV9cuU1q9f71OeO++806flrsaePXuuavnZOqxDT7Nnz5YmT0+zdL3jP/VOwh/wfPLJJ4iNjUVQ\nUBAGDhyoPm42m1FXV+eXcEREsjApnr5opJPc3FxMmzYNI0eOxMKFC7F//34AwN/+9jfs3bsXzz//\nvNtlHQ4HLBaLPokpMEwmQOxXg/oivv9XEN4NLysrQ05ODkwmk+ZTYqfTiejoaI/LWq1WAJe+AKrz\nF1l589RTT2n6en1h2WW9edfO37gb7p5MWQD/5PH1/e/tr42nK7OEdsOdTifCwsIQEhKC/v374/rr\nr1e/4Ly0tJSXYX0HnTlzRvOPqK8TmlnW1dVhyJAhaj87Oxu5ubno6OjALbfcgvHjx/stIBGRDISK\npcVi0XzCfOONN2L37t1+C0VEJJs+eQUP+cfBgwfVttPp1IyFhYVp+qmpqQHJRBQovDaciEgAiyUR\nkQAWSyIiATxmSRpNTU1q+9ChQ5qxy5e4AsCgQYMClolIBpxZEhEJYLEkIhLA3XDSOH36tNq+6667\nDExCJBfOLImIBHBmSd2Lj8fsOXOMTvE/c+ZAmi/ClSkL4Jc8F6OidF5j78diSd3773979d1j/Emm\nLIB8efoq4ftZXtVG/v+2bD29RZu/yZRHpiwA83giUxZArjwyZQF6nsdTOeQxSyIiASyWREQCWCyJ\niATwAx7yixtvvFFtV1VVacY6fxPoiBEjNGMnT55U28OGDXO7/sjISE1/8uTJmn5tba3bZV0ul9ou\nKytz+zyizjizJCISwGJJRCSAu+Gki4iICE2/83fJBwUFacY+/fRTtd11d/qaa65R2113pceOHau2\nw8PDNWPV1dWavtlsVtvvv/++ZmzmzJlq++abb4Y7ne/ABADvvfeeZv2d7w7f+fAB9U2cWRIRCWCx\nJCISwGJJRCSAxyzJLy5evOh2bPjw4T6ts/Nx0H/+85+asc6nIwHAiRMn1PaPfvQjt+vs1087X+jo\n6HD73M65hw8fjoaGBs+BqU/hzJKISACLJRGRAN51SJI8MmUBmMcTmbIAcuWRKQvAuw4REQWc1w94\nLl68iMzMTDQ2NqK1tRVLlixBVFQUVq5cCQBISEhAXl6ev3MSERlL8WLXrl3Khg0bFEVRlNraWmXK\nlClKWlqaUl5eriiKojz99NNZ09hsAAABs0lEQVTKgQMHPK4DgHJ5U5fbMvyTKY9MWZin92SRLY9M\nWXzJ44nX3fDIyEj1FInz589j8ODBqKmpwZgxYwAAKSkpsNvt3lZDRNSred0NnzZtGvbt24f7778f\n58+fx0svvYTf/OY36rjZbNac/9adiooKWCwWAPB4ANUIMuWRKQvAPJ7IlAWQK49MWQD98ngtlm++\n+Sbi4uKwY8cOfP7551iyZInmpgkiQaxWq/rc3vxJmT/JlAVgHk9kygLIlUemLEDP83iqZ16L5bFj\nxzBhwgQAQGJiIlpaWtDW1qaOO51OREdHC4chIuqNvB6zjI+PR3l5OQCgpqYGYWFhuOGGG3DkyBEA\nQGlpKZKTk/2bkojIYF5PSr948SKys7Nx7tw5tLW1IT09HVFRUcjNzUVHRwduueUWrFixwvNGeFK6\nVzJlAZjHE5myAHLlkSkLoO9uOK/gkSSPTFkA5vFEpiyAXHlkygLoWyx5BQ8RkQAWSyIiASyWREQC\nWCyJiASwWBIRCWCxJCISwGJJRCQgIOdZEhH1dpxZEhEJYLEkIhLAYklEJIDFkohIAIslEZEAFksi\nIgH/B/C/a99c8fqFAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "jXpbN71BuK1z", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "" ], "execution_count": 0, "outputs": [] } ] } ================================================ FILE: dimensionality_reduction/README.md ================================================ Install requirements: ``` pip install click pip install matplotlib==2.0.2 pip install mpldatacursor ``` First download data to the data path specified in JSON file and then run reducer: ``` python -m process state_reduce.json --download ``` If you already downloaded data to the specified data path, simply run reducer as: ``` python -m process state_reduce.json ``` Run visualizer: ``` python -m visualize viz_state_2d.json ``` ================================================ FILE: dimensionality_reduction/process.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import click import json import numpy as np from process_helper import assemble_data, reduce_dim, disassemble, download_data @click.command() @click.argument('path_to_config', nargs=1) @click.option('--download', is_flag=True) def main(path_to_config, download): """ PATH_TO_CONFIG: Path to config.json """ print("loading", path_to_config) with open(path_to_config) as f: config = json.load(f) print(config['data']) print(config['method']) print(config['data']['key']) if download: download_data(config['data']) Xs, npz_files, npz_dims, _, _, _ = assemble_data(config['data'], dict_key=config['data']['key']) X = np.vstack(Xs) print(npz_files) print(npz_dims) print(X.shape) X_r = reduce_dim(X, config['method']) #print(X_r.shape) disassemble(X_r, npz_files, npz_dims, config['method']['name'], dict_key=config['data']['key']) if __name__ == '__main__': main() ================================================ FILE: dimensionality_reduction/process_helper.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict import numpy as np from sklearn import decomposition, manifold import atari_zoo from atari_zoo import MakeAtariModel import urllib.request import os def download_data(data): print("downloading data ...") env = data['game'] tag = "final" algos_data = OrderedDict(data['algos']) for algo in algos_data.keys(): for exp_idx in algos_data[algo]: print(algo, exp_idx) m = MakeAtariModel(algo,env,exp_idx,tag)() path_to_npz = data['path'] + '/' + algo + '/' + data['game'] + '/' filename = 'model' + str(exp_idx) + '_final_rollout.' + 'npz' if not os.path.exists(path_to_npz): os.makedirs(path_to_npz) urllib.request.urlretrieve (m.data_path, path_to_npz+filename) def assemble_data(data, ext=".", dict_key='ram'): """Assemble hi-D BCs from all generations""" #1 reconstruct the data directories X, npz_files, npz_dims = [], [], [] raw_data = {} glo_max_score, glo_min_score = None, None algos_data = OrderedDict(data['algos']) for algo in algos_data.keys(): for exp_idx in algos_data[algo]: path_to_npz = (data['path'] + '/' + algo + '/' + data['game'] + '/model' + str(exp_idx) + '_final_rollout'+ext+'npz') npz_files.append(path_to_npz) #check if path exist try: npz_data = np.load(path_to_npz) except: raise IOError("Invalid path: {}. \n If you want to re-download the data, please add --download".format(path_to_npz)) if algo not in raw_data.keys(): raw_data[algo] = {} raw_data[algo][str(exp_idx)] = npz_data print(npz_data[dict_key].shape) print(type(npz_data[dict_key])) npz_dims.append(npz_data[dict_key].shape[0]) X.append(npz_data[dict_key]) if 'score' in npz_data.keys(): loc_max, loc_min = max(npz_data['score']), min(npz_data['score']) if glo_max_score == None or loc_max > glo_max_score: glo_max_score = loc_max if glo_min_score == None or loc_min < glo_min_score: glo_min_score = loc_min print(loc_max, loc_min) return X, npz_files, npz_dims, raw_data, glo_max_score, glo_min_score def reduce_dim(X, method): print(method) print("Reducing ...") perplexity = 30 n_iter = 1000 pca_dim = 50 if 'tsne' in method['name']: if 'perplexity' in method.keys(): perplexity = method['perplexity'] if 'n_iter' in method.keys(): n_iter = method['n_iter'] if 'pca_dim' in method.keys(): pca_dim = method['pca_dim'] print(perplexity, n_iter, pca_dim) if method['name'] == 'tsne': print('running tsne') X_r = manifold.TSNE(n_components=2, perplexity=perplexity, verbose=2, random_state=0, n_iter=n_iter).fit_transform(X) elif method['name'] == 'pca': print('running pca') X_r = decomposition.PCA(n_components=2).fit_transform(X) elif method['name'] == 'pca_tsne': print('running pca') X_pca = decomposition.PCA(n_components=pca_dim).fit_transform(X) print('running tsne') X_r = manifold.TSNE(n_components=2, perplexity=perplexity, verbose=2, random_state=0, n_iter=n_iter).fit_transform(X_pca) elif method['name'] == 'debug': print('running debug') nrow, ncol = X.shape idx_last_x, idx_last_y = int(ncol / 2 - 1), -1 X_r = np.hstack((X[:, idx_last_x].reshape(nrow, 1), X[:, idx_last_y].reshape(nrow, 1))) else: raise NotImplementedError print('Reduction Completed! X.shape={} X_r.shape={}'.format(X.shape, X_r.shape)) return X_r def disassemble(X, files, dims, dr_method, dict_key='ram'): print(dr_method) dict_key_2d = dict_key+"_2d" X_splitted = np.split(X, np.cumsum(dims)[:-1]) for x_2d, file in zip(X_splitted, files): npz_name = file.split('.')[0] + '.' + dr_method + '.' + dict_key_2d print(x_2d.shape, npz_name) vals_to_save = {dict_key_2d:x_2d} np.savez_compressed(npz_name, **vals_to_save) if dr_method == "debug": for file in files: data = np.load(file) npz_name = file.split('.')[0] + '.' + dr_method + '.' + dict_key_2d + '.npz' data_2d = np.load(npz_name) print(data[dict_key].shape) print(data_2d[dict_key_2d].shape) assert data[dict_key].shape[0] == data_2d[dict_key_2d].shape[0] assert np.array_equal(data[dict_key][:, int(data[dict_key].shape[1] / 2 - 1) ], data_2d[dict_key_2d][:, 0]) assert np.array_equal(data[dict_key][:, -1], data_2d[dict_key_2d][:, 1]) ================================================ FILE: dimensionality_reduction/ram_reduce.json ================================================ { "data": { "path": "/Users//data/rollout2", "game": "SeaquestNoFrameskip-v4", "key": "ram", "algos": { "a2c": [1, 2, 3], "apex": [1, 2, 3], "dqn": [1, 2, 3], "es":[1, 2, 3], "ga":[1, 2, 3], "rainbow":[1, 2, 3] } }, "method": { "name": "pca_tsne", "pca_dim": 50, "perplexity": 30, "n_iter": 3000 } } ================================================ FILE: dimensionality_reduction/representation_reduce.json ================================================ { "data": { "path": "/Users/ailabs/data/rollout", "game": "FrostbiteNoFrameskip-v4", "key": "representation", "algos": { "a2c": [3] } }, "method": { "name": "pca_tsne", "pca_dim": 50, "perplexity": 30, "n_iter": 1000 } } ================================================ FILE: dimensionality_reduction/visualize.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import click import json from visualize_helper import figure_control import matplotlib.pyplot as plt @click.command() @click.argument('path_to_config', nargs=1) @click.option('--global_max_min', is_flag=True, help="Will use global max/max across all exps for color intensity.") def main(path_to_config, global_max_min): """ PATH_TO_CONFIG: Path to config.json """ print("loading", path_to_config) with open(path_to_config) as f: config = json.load(f) print(config['data']) print(config['method']) print(global_max_min) main_plot = figure_control(config, global_max_min) plt.show() if __name__ == '__main__': main() ================================================ FILE: dimensionality_reduction/visualize_helper.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import matplotlib.pyplot as plt from process_helper import assemble_data from matplotlib.widgets import CheckButtons import numpy as np from colour import Color from mpldatacursor import datacursor artist2data = {} label2artist = {} COLORS = [ (Color('#f9d9d9'), Color('#d61515')), # red (Color('#d9ddfb'), Color('#0b1667')), # blue (Color('#9aecb8'), Color('#045c24')), # green (Color('#ffbef9'), Color('#ce00bb')), # pink (Color('#ffb27e'), Color('#fb6500')), # orange (Color('#d0d0d0'), Color('#000000')), # black (Color('#beffcf'), Color('#33FF66')), # lime green (Color('#f2d6b9'), Color('#996633')), # brown (Color('#d5b2ec'), Color('#9900FF')), # purple (Color('#baffff'), Color('#009999')), # teel ] numBins = 255 COLOR_HEX_LISTS = [] for color in COLORS: color_gradient = color[0].range_to(color[1], numBins) hex_list = [c.get_hex_l() for c in color_gradient] COLOR_HEX_LISTS.append(hex_list) def color_index(fitness, minfit, maxfit): cind = (fitness - minfit)/(maxfit - minfit) * numBins cind = int(cind) if cind >= numBins: cind = numBins-1 elif cind < 0: cind = 0 return cind def color_list(color_idx, scores, global_limit=None): this_color = COLOR_HEX_LISTS[color_idx] if global_limit: loc_max, loc_min = global_limit else: loc_max, loc_min = max(scores), min(scores) hex_list = [] for s in scores: hex_list.append(this_color[color_index(s, loc_min, loc_max)]) return hex_list def checkb_click(label): print("clicked", label) artist = label2artist[label] artist.set_visible(not artist.get_visible()) visible = artist.get_visible() if visible: artist.set_picker(5) else: artist.set_picker(None) plt.draw() class figure_control: def __init__(self, config, global_max_min): self.config = config print(config) _, _, _, self.raw_data, self.glo_max_score, self.glo_min_score = assemble_data(config['data']) Xs, npz_files, npz_dims, _, _, _ = assemble_data(config['data'], ext='.' + config['method']['name'] + '.'+config['data']['key'] + '.', dict_key=config['data']['key']) print(self.glo_max_score, self.glo_min_score) print(npz_dims, npz_files) self.fig = plt.figure(config['data']['key'].upper(), figsize=(14,7)) self.ax = self.fig.add_subplot(111) plt.subplots_adjust(left = 0.5, right = 0.9) self.fig.canvas.mpl_connect('pick_event', self.onpick) checkb_labels = [] idx = 0 list_of_artists = [] labels_cursor = {} for data, file in zip(Xs, npz_files): print(data.shape) algo = file.split('/')[-3] rollout = int(file.split('/')[-1].split('_')[0][-1]) scores = self.raw_data[algo][str(rollout)]['score'] if global_max_min: global_limit = (self.glo_max_score, self.glo_min_score) else: global_limit = None hex_list = color_list(idx%len(COLORS), scores, global_limit=global_limit ) artist = self.ax.scatter(data[:, 0], data[:, 1], c=hex_list, visible=False) list_of_artists.append(artist) labels_cursor[artist]=[] for i in range(data.shape[0]): labels_cursor[artist].append(algo.upper() + " r" + str(rollout) + " s"+str(i) + ": "+str(scores[i])) #artist.set_visible(True) #artist.set_picker(5) artist2data[artist] = (algo, rollout) label = algo.upper() + " rollout#" + str(rollout) label2artist[label] = artist checkb_labels.append(label) idx += 1 formatter = lambda **kwargs: ', '.join(kwargs['point_label']) self.dc = datacursor(list_of_artists, hover=True, formatter=formatter, point_labels=labels_cursor) checkb_ax = self.fig.add_axes([0.1, 0.1, 0.4, 0.8]) checkb_ax.axis('off') self.checkb = CheckButtons(checkb_ax, checkb_labels, [False]*len(checkb_labels)) self.checkb.on_clicked(checkb_click) def pop_frame(self, algo, rollout, index): fig = plt.figure(figsize=(3, 3)) ax = fig.add_subplot(111) fig.suptitle(algo + " rollout #" + str(rollout) + " step " + str(index) + " score "+str(self.raw_data[algo][str(rollout)]['score'][index])) print(algo, rollout, index) ax.imshow(self.raw_data[algo][str(rollout)]['frames'][index]) fig.show() def onpick(self, event): print(hasattr(event, 'ind')) print(hasattr(event, 'artist')) if hasattr(event, 'ind') and hasattr(event, 'artist'): print("picked", event.ind) index = event.ind[-1] algo, rollout = artist2data[event.artist] print(index) print(artist2data[event.artist]) print(event.artist.get_offsets()[index]) self.pop_frame(algo, rollout, index) ================================================ FILE: dimensionality_reduction/viz_ram_2d.json ================================================ { "data": { "path": "/data/rollout2", "game": "SeaquestNoFrameskip-v4", "key": "ram_2d", "algos": { "a2c": [1, 2, 3], "apex": [1, 2, 3], "dqn": [1, 2, 3], "es":[1, 2, 3], "ga":[1, 2, 3], "rainbow":[1, 2, 3] } }, "method": { "name": "pca_tsne" } } ================================================ FILE: dimensionality_reduction/viz_representation_2d.json ================================================ { "data": { "path": "/Users//data/rollout", "game": "SeaquestNoFrameskip-v4", "key": "representation_2d", "algos": { "apex": [3] } }, "method": { "name": "pca_tsne" } } ================================================ FILE: docs/RGraph/libraries/RGraph.bar.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.Bar=function(conf) {if(typeof conf==='object'&&typeof conf.data==='object'&&typeof conf.id==='string'){var id=conf.id,canvas=document.getElementById(id),data=conf.data,parseConfObjectForOptions=true}else{var id=conf,canvas=document.getElementById(id),data=arguments[1]} this.id=id;this.canvas=canvas;this.context=this.canvas.getContext('2d');this.canvas.__object__=this;this.type='bar';this.max=0;this.stackedOrGrouped=false;this.isRGraph=true;this.uid=RGraph.CreateUID();this.canvas.uid=this.canvas.uid?this.canvas.uid:RGraph.CreateUID();this.colorsParsed=false;this.original_colors=[];this.cachedBackgroundCanvas=null;this.firstDraw=true;this.properties={'chart.background.barcount':null,'chart.background.barcolor1':'rgba(0,0,0,0)','chart.background.barcolor2':'rgba(0,0,0,0)','chart.background.grid':true,'chart.background.grid.color':'#ddd','chart.background.grid.width':1,'chart.background.grid.hsize':20,'chart.background.grid.vsize':20,'chart.background.grid.vlines':true,'chart.background.grid.hlines':true,'chart.background.grid.border':true,'chart.background.grid.autofit':true,'chart.background.grid.autofit.align':true,'chart.background.grid.autofit.numhlines':5,'chart.background.grid.autofit.numvlines':20,'chart.background.grid.dashed':false,'chart.background.grid.dotted':false,'chart.background.image.stretch':true,'chart.background.image.x':null,'chart.background.image.y':null,'chart.background.image.w':null,'chart.background.image.h':null,'chart.background.image.align':null,'chart.background.color':null,'chart.background.hbars':null,'chart.numyticks':10,'chart.hmargin':5,'chart.hmargin.grouped':1,'chart.strokecolor':'rgba(0,0,0,0)','chart.axis.color':'black','chart.axis.linewidth':1,'chart.gutter.top':25,'chart.gutter.bottom':35,'chart.gutter.left':25,'chart.gutter.right':25,'chart.labels':null,'chart.labels.bold':false,'chart.labels.color':null,'chart.labels.ingraph':null,'chart.labels.above':false,'chart.labels.above.decimals':0,'chart.labels.above.size':null,'chart.labels.above.color':null,'chart.labels.above.background':'rgba(0,0,0,0)','chart.labels.above.angle':null,'chart.labels.above.offset':4,'chart.labels.above.units.pre':'','chart.labels.above.units.post':'','chart.ylabels':true,'chart.ylabels.count':5,'chart.ylabels.inside':false,'chart.ylabels.offsetx':0,'chart.ylabels.offsety':0,'chart.labels.offsetx':0,'chart.labels.offsety':0,'chart.xaxispos':'bottom','chart.yaxispos':'left','chart.text.angle':0,'chart.text.color':'black','chart.text.size':12,'chart.text.font':'Arial, Verdana, sans-serif','chart.text.accessible':true,'chart.text.accessible.overflow':'visible','chart.text.accessible.pointerevents':false,'chart.ymin':0,'chart.ymax':null,'chart.title':'','chart.title.font':null,'chart.title.background':null,'chart.title.hpos':null,'chart.title.vpos':null,'chart.title.bold':true,'chart.title.xaxis':'','chart.title.xaxis.bold':true,'chart.title.xaxis.size':null,'chart.title.xaxis.font':null,'chart.title.xaxis.color':null,'chart.title.yaxis':'','chart.title.yaxis.bold':true,'chart.title.yaxis.size':null,'chart.title.yaxis.font':null,'chart.title.yaxis.color':null,'chart.title.xaxis.pos':null,'chart.title.yaxis.pos':null,'chart.title.yaxis.x':null,'chart.title.yaxis.y':null,'chart.title.xaxis.x':null,'chart.title.xaxis.y':null,'chart.title.x':null,'chart.title.y':null,'chart.title.halign':null,'chart.title.valign':null,'chart.colors':['red','#0f0','blue','pink','orange','cyan','black','white','green','magenta'],'chart.colors.sequential':false,'chart.colors.reverse':false,'chart.grouping':'grouped','chart.variant':'bar','chart.variant.sketch.verticals':true,'chart.variant.threed.xaxis':true,'chart.variant.threed.yaxis':true,'chart.variant.threed.angle':0.1,'chart.variant.threed.offsetx':10,'chart.variant.threed.offsety':5,'chart.shadow':false,'chart.shadow.color':'#aaa','chart.shadow.offsetx':0,'chart.shadow.offsety':0,'chart.shadow.blur':15,'chart.tooltips':null,'chart.tooltips.effect':'fade','chart.tooltips.css.class':'RGraph_tooltip','chart.tooltips.event':'onclick','chart.tooltips.highlight':true,'chart.tooltips.hotspot.xonly':false,'chart.highlight.stroke':'rgba(0,0,0,0)','chart.highlight.fill':'rgba(255,255,255,0.7)','chart.key':null,'chart.key.background':'white','chart.key.position':'graph','chart.key.shadow':false,'chart.key.shadow.color':'#666','chart.key.shadow.blur':3,'chart.key.shadow.offsetx':2,'chart.key.shadow.offsety':2,'chart.key.position.gutter.boxed':false,'chart.key.position.x':null,'chart.key.position.y':null,'chart.key.interactive':false,'chart.key.interactive.highlight.chart.stroke':'black','chart.key.interactive.highlight.chart.fill':'rgba(255,255,255,0.7)','chart.key.interactive.highlight.label':'rgba(255,0,0,0.2)','chart.key.halign':'right','chart.key.color.shape':'square','chart.key.rounded':true,'chart.key.text.size':10,'chart.key.linewidth':1,'chart.key.colors':null,'chart.key.text.color':'black','chart.contextmenu':null,'chart.units.pre':'','chart.units.post':'','chart.scale.decimals':0,'chart.scale.point':'.','chart.scale.thousand':',','chart.scale.round':false,'chart.scale.zerostart':true,'chart.crosshairs':false,'chart.crosshairs.color':'#333','chart.crosshairs.hline':true,'chart.crosshairs.vline':true,'chart.linewidth':1,'chart.annotatable':false,'chart.annotate.color':'black','chart.zoom.factor':1.5,'chart.zoom.fade.in':true,'chart.zoom.fade.out':true,'chart.zoom.hdir':'right','chart.zoom.vdir':'down','chart.zoom.frames':25,'chart.zoom.delay':16.666,'chart.zoom.shadow':true,'chart.zoom.background':true,'chart.resizable':false,'chart.resize.handle.background':null,'chart.adjustable':false,'chart.adjustable.only':null,'chart.noaxes':false,'chart.noxaxis':false,'chart.noyaxis':false,'chart.events.click':null,'chart.events.mousemove':null,'chart.numxticks':null,'chart.bevel':false,'chart.errorbars':false,'chart.errorbars.color':'black','chart.errorbars.capped':true,'chart.errorbars.capped.width':14,'chart.errorbars.linewidth':1,'chart.combinedchart.effect':null,'chart.combinedchart.effect.options':null,'chart.combinedchart.effect.callback':null,'chart.clearto':'rgba(0,0,0,0)'} if(!this.canvas){alert('[BAR] No canvas support');return;} for(var i=0;i0){alert('[BAR] The data element with index '+i+' should be negative');}}}} if(name.toLowerCase()=='chart.linewidth'&&value==0){value=0.0001;} prop[name]=value;return this;};this.get=this.Get=function(name) {if(name.substr(0,6)!='chart.'){name='chart.'+name;} while(name.match(/([A-Z])/)){name=name.replace(/([A-Z])/,'.'+RegExp.$1.toLowerCase());} return prop[name];};this.draw=this.Draw=function() {if(typeof(prop['chart.background.image'])=='string'){RG.DrawBackgroundImage(this);} RG.FireCustomEvent(this,'onbeforedraw');if(prop['chart.variant']==='3d'){if(prop['chart.text.accessible']){}else{co.setTransform(1,prop['chart.variant.threed.angle'],0,1,0.5,0.5);}} if(!this.colorsParsed){this.parseColors();this.colorsParsed=true;} this.gutterLeft=prop['chart.gutter.left'];this.gutterRight=prop['chart.gutter.right'];this.gutterTop=prop['chart.gutter.top'];this.gutterBottom=prop['chart.gutter.bottom'];if((prop['chart.variant']=='pyramid'||prop['chart.variant']=='dot')&&typeof(prop['chart.tooltips'])=='object'&&prop['chart.tooltips']&&prop['chart.tooltips'].length>0){alert('[BAR] ('+this.id+') Sorry, tooltips are not supported with dot or pyramid charts');} this.coords=[];this.coords2=[];this.coordsText=[];this.max=0;this.grapharea=ca.height-this.gutterTop-this.gutterBottom;this.halfgrapharea=this.grapharea/2;this.halfTextHeight=prop['chart.text.size']/2;RG.background.Draw(this);this.drawbars();this.drawAxes();this.DrawLabels();if(prop['chart.bevel']||prop['chart.bevelled']){this.DrawBevel();} if(prop['chart.key']&&prop['chart.key'].length){RG.DrawKey(this,prop['chart.key'],prop['chart.colors']);} if(prop['chart.contextmenu']){RG.ShowContext(this);} if(prop['chart.errorbars']){this.drawErrorbars();} if(prop['chart.labels.ingraph']){RG.DrawInGraphLabels(this);} if(prop['chart.resizable']){RG.AllowResizing(this);} RG.InstallEventListeners(this);if(this.firstDraw){this.firstDraw=false;RG.fireCustomEvent(this,'onfirstdraw');this.firstDrawFunc();} RG.fireCustomEvent(this,'ondraw');return this;};this.exec=function(func) {func(this);return this;};this.drawAxes=this.DrawAxes=function() {if(prop['chart.noaxes']){return;} var xaxispos=prop['chart.xaxispos'];var yaxispos=prop['chart.yaxispos'];var isSketch=prop['chart.variant']=='sketch';co.beginPath();co.strokeStyle=prop['chart.axis.color'];co.lineWidth=prop['chart.axis.linewidth']+0.001;if(RG.ISSAFARI==-1){co.lineCap='square';} if(prop['chart.noyaxis']==false){if(yaxispos=='right'){co.moveTo(ca.width-this.gutterRight+(isSketch?3:0),this.gutterTop-(isSketch?3:0));co.lineTo(ca.width-this.gutterRight-(isSketch?2:0),ca.height-this.gutterBottom+(isSketch?5:0));}else{co.moveTo(this.gutterLeft-(isSketch?2:0),this.gutterTop-(isSketch?5:0));co.lineTo(this.gutterLeft-(isSketch?1:0),ca.height-this.gutterBottom+(isSketch?5:0));}} if(prop['chart.noxaxis']==false){if(xaxispos=='center'){co.moveTo(this.gutterLeft-(isSketch?5:0),Math.round(((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop+(isSketch?2:0)));co.lineTo(ca.width-this.gutterRight+(isSketch?5:0),Math.round(((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop-(isSketch?2:0)));}else if(xaxispos=='top'){co.moveTo(this.gutterLeft-(isSketch?3:0),this.gutterTop-(isSketch?3:0));co.lineTo(ca.width-this.gutterRight+(isSketch?5:0),this.gutterTop+(isSketch?2:0));}else{co.moveTo(this.gutterLeft-(isSketch?5:0),ma.round(this.getYCoord(0)-(isSketch?2:0)));co.lineTo(ca.width-this.gutterRight+(isSketch?8:0),ma.round(this.getYCoord(0)+(isSketch?2:0)));}} var numYTicks=prop['chart.numyticks'];if(prop['chart.noyaxis']==false&&!isSketch){var yTickGap=(ca.height-this.gutterTop-this.gutterBottom)/numYTicks;var xpos=yaxispos=='left'?this.gutterLeft:ca.width-this.gutterRight;if(this.properties['chart.numyticks']>0){for(y=this.gutterTop;xaxispos=='center'?y<=(ca.height-this.gutterBottom):y<(ca.height-this.gutterBottom+(xaxispos=='top'?1:0));y+=yTickGap){if(xaxispos=='center'&&y==(this.gutterTop+(this.grapharea/2))){continue;} if(xaxispos=='top'&&y==this.gutterTop){continue;} co.moveTo(xpos+(yaxispos=='left'?0:0),ma.round(y));co.lineTo(xpos+(yaxispos=='left'?-3:3),ma.round(y));} if(xaxispos==='bottom'&&prop['chart.ymin']!==0){co.moveTo(xpos+(yaxispos=='left'?0:0),ma.round(ca.height-prop['chart.gutter.bottom']));co.lineTo(xpos+(yaxispos=='left'?-3:3),ma.round(ca.height-prop['chart.gutter.bottom']));}} if(prop['chart.noxaxis']){if(xaxispos=='center'){co.moveTo(xpos+(yaxispos=='left'?-3:3),Math.round(ca.height/2));co.lineTo(xpos,Math.round(ca.height/2));}else if(xaxispos=='top'){co.moveTo(xpos+(yaxispos=='left'?-3:3),Math.round(this.gutterTop));co.lineTo(xpos,Math.round(this.gutterTop));}else{co.moveTo(xpos+(yaxispos=='left'?-3:3),Math.round(ca.height-this.gutterBottom));co.lineTo(xpos,Math.round(ca.height-this.gutterBottom));}}} if(prop['chart.noxaxis']==false&&!isSketch){if(typeof(prop['chart.numxticks'])=='number'){var xTickGap=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.numxticks'];}else{var xTickGap=(ca.width-this.gutterLeft-this.gutterRight)/this.data.length;} if(xaxispos=='bottom'){yStart=prop['chart.ymin']<0?this.getYCoord(0)-3:this.getYCoord(0);yEnd=this.getYCoord(0)+3;}else if(xaxispos=='top'){yStart=this.gutterTop-3;yEnd=this.gutterTop;}else if(xaxispos=='center'){yStart=((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop+3;yEnd=((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop-3;} var noEndXTick=prop['chart.noendxtick'];for(x=this.gutterLeft+(yaxispos=='left'?xTickGap:0),len=(ca.width-this.gutterRight+(yaxispos=='left'?5:0));xthis.gutterLeft){co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);}else if(yaxispos=='left'&&noEndXTick&&x>this.gutterLeft&&x<(ca.width-this.gutterRight)){co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);}else if(yaxispos=='right'&&x<(ca.width-this.gutterRight)&&!noEndXTick){co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);}else if(yaxispos=='right'&&x<(ca.width-this.gutterRight)&&x>(this.gutterLeft)&&noEndXTick){co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);}} if(prop['chart.noyaxis']||prop['chart.numxticks']==null){if(typeof(prop['chart.numxticks'])=='number'&&prop['chart.numxticks']>0){co.moveTo(Math.round(this.gutterLeft),yStart);co.lineTo(Math.round(this.gutterLeft),yEnd);}}} if(prop['chart.noyaxis']&&prop['chart.noxaxis']==false&&prop['chart.numxticks']==null){if(xaxispos=='center'){co.moveTo(ma.round(this.gutterLeft),(ca.height/2)-3);co.lineTo(ma.round(this.gutterLeft),(ca.height/2)+3);}else{co.moveTo(ma.round(this.gutterLeft),ca.height-this.gutterBottom);co.lineTo(ma.round(this.gutterLeft),ca.height-this.gutterBottom+3);}} co.stroke();};this.drawbars=this.Drawbars=function() {co.lineWidth=prop['chart.linewidth'];co.strokeStyle=prop['chart.strokecolor'];co.fillStyle=prop['chart.colors'][0];var prevX=0,prevY=0,decimals=prop['chart.scale.decimals'];if(prop['chart.ymax']){this.scale2=RG.getScale2(this,{'max':prop['chart.ymax'],'strict':prop['chart.scale.round']?false:true,'min':prop['chart.ymin'],'scale.thousand':prop['chart.scale.thousand'],'scale.point':prop['chart.scale.point'],'scale.decimals':prop['chart.scale.decimals'],'ylabels.count':prop['chart.ylabels.count'],'scale.round':prop['chart.scale.round'],'units.pre':prop['chart.units.pre'],'units.post':prop['chart.units.post']});}else{var errorbars=prop['chart.errorbars'];if(typeof errorbars==='number'){var value=errorbars;prop['chart.errorbars']=[];for(var i=0;i0){RGraph.DrawBars(this);} var variant=prop['chart.variant'];if(variant==='3d'){RG.draw3DAxes(this);} var xaxispos=prop['chart.xaxispos'],width=(ca.width-this.gutterLeft-this.gutterRight)/this.data.length,orig_height=height,hmargin=prop['chart.hmargin'],shadow=prop['chart.shadow'],shadowColor=prop['chart.shadow.color'],shadowBlur=prop['chart.shadow.blur'],shadowOffsetX=prop['chart.shadow.offsetx'],shadowOffsetY=prop['chart.shadow.offsety'],strokeStyle=prop['chart.strokecolor'],colors=prop['chart.colors'],sequentialColorIndex=0 var height;for(i=0,len=this.data.length;i=0){height=ma.abs(this.getYCoord(0)-this.getYCoord(this.data[i]));}else{y=this.getYCoord(0);height=ma.abs(this.getYCoord(0)-this.getYCoord(this.data[i]));}} var barWidth=width-(2*hmargin);if(barWidth<0){alert('[RGRAPH] Warning: you have a negative bar width. This may be caused by the chart.hmargin being too high or the width of the canvas not being sufficient.');} co.strokeStyle=strokeStyle;co.fillStyle=colors[0];if(prop['chart.colors.sequential']){co.fillStyle=colors[i];} if(variant=='sketch'){co.lineCap='round';var sketchOffset=3;co.beginPath();co.strokeStyle=colors[0];if(prop['chart.colors.sequential']){co.strokeStyle=colors[i];} co.moveTo(x+hmargin+2,y+height-2);co.lineTo(x+hmargin-1,y-4);co.moveTo(x+hmargin-3,y+ -2+(this.data[i]<0?height:0));co.bezierCurveTo(x+((hmargin+width)*0.33),y+15+(this.data[i]<0?height-10:0),x+((hmargin+width)*0.66),y+5+(this.data[i]<0?height-10:0),x+hmargin+width+ -1,y+0+(this.data[i]<0?height:0));co.moveTo(x+hmargin+width-5,y-5);co.lineTo(x+hmargin+width-3,y+height-3);if(prop['chart.variant.sketch.verticals']){for(var r=0.2;r<=0.8;r+=0.2){co.moveTo(x+hmargin+width+(r>0.4?-1:3)-(r*width),y-1);co.lineTo(x+hmargin+width-(r>0.4?1:-1)-(r*width),y+height+(r==0.2?1:-2));}} co.stroke();}else if(variant=='bar'||variant=='3d'||variant=='glass'||variant=='bevel'){if(RGraph.ISOLD&&shadow){this.DrawIEShadow([x+hmargin,y,barWidth,height]);} if(variant=='glass'){RGraph.filledCurvyRect(co,x+hmargin,y,barWidth,height,3,this.data[i]>0,this.data[i]>0,this.data[i]<0,this.data[i]<0);RGraph.strokedCurvyRect(co,x+hmargin,y,barWidth,height,3,this.data[i]>0,this.data[i]>0,this.data[i]<0,this.data[i]<0);}else{co.beginPath();co.rect(x+hmargin,y,barWidth,height);co.fill();RG.NoShadow(this);co.beginPath();co.rect(x+hmargin,y,barWidth,height);co.stroke();} if(variant=='3d'){var prevStrokeStyle=co.strokeStyle;var prevFillStyle=co.fillStyle;if(this.data[i]>=0){co.beginPath();co.moveTo(x+hmargin,y);co.lineTo(x+hmargin+prop['chart.variant.threed.offsetx'],y-prop['chart.variant.threed.offsety']);co.lineTo(x+hmargin+prop['chart.variant.threed.offsetx']+barWidth,y-prop['chart.variant.threed.offsety']);co.lineTo(x+hmargin+barWidth,y);co.closePath();co.stroke();co.fill();} co.beginPath();co.moveTo(x+hmargin+barWidth,y);co.lineTo(x+hmargin+barWidth+prop['chart.variant.threed.offsetx'],this.data[i]<0&&xaxispos==='bottom'?this.getYCoord(0):(this.data[i]<0&&(y-prop['chart.variant.threed.offsety'])<(this.gutterTop+this.halfgrapharea)?(this.gutterTop+this.halfgrapharea):(y-prop['chart.variant.threed.offsety'])));co.lineTo(x+hmargin+barWidth+prop['chart.variant.threed.offsetx'],this.data[i]<0&&(y-prop['chart.variant.threed.offsety']+height)<(this.gutterTop+this.getYCoord(0))?this.getYCoord(this.data[i])-prop['chart.variant.threed.offsety']:(this.data[i]>0?y-prop['chart.variant.threed.offsety']+height:ma.min(y-prop['chart.variant.threed.offsety']+height,ca.height-this.gutterBottom)));co.lineTo(x+hmargin+barWidth,y+height);co.closePath();co.stroke();co.fill();if(this.data[i]>0){co.beginPath();co.fillStyle='rgba(255,255,255,0.5)';co.moveTo(x+hmargin,y);co.lineTo(x+hmargin+prop['chart.variant.threed.offsetx'],y-prop['chart.variant.threed.offsety']);co.lineTo(x+hmargin+prop['chart.variant.threed.offsetx']+barWidth,y-prop['chart.variant.threed.offsety']);co.lineTo(x+hmargin+barWidth,y);co.lineTo(x+hmargin,y);co.closePath();co.stroke();co.fill();} co.beginPath();co.fillStyle='rgba(0,0,0,0.4)';co.moveTo(x+hmargin+barWidth,y);co.lineTo(x+hmargin+barWidth+prop['chart.variant.threed.offsetx'],this.data[i]<0&&xaxispos==='bottom'?this.getYCoord(0):(this.data[i]<0&&(y-prop['chart.variant.threed.offsety'])<(this.gutterTop+this.halfgrapharea)?(this.gutterTop+this.halfgrapharea):y-prop['chart.variant.threed.offsety']));co.lineTo(x+hmargin+barWidth+prop['chart.variant.threed.offsetx'],this.data[i]<0&&(y-prop['chart.variant.threed.offsety']+height)0?y-prop['chart.variant.threed.offsety']+height:ma.min(y-prop['chart.variant.threed.offsety']+height,ca.height-this.gutterBottom));co.lineTo(x+hmargin+barWidth,y+height);co.lineTo(x+hmargin+barWidth,y);co.closePath();co.stroke();co.fill();co.strokeStyle=prevStrokeStyle;co.fillStyle=prevFillStyle;}else if(variant=='glass'){var grad=co.createLinearGradient(x+hmargin,y,x+hmargin+(barWidth/2),y);grad.addColorStop(0,'rgba(255,255,255,0.9)');grad.addColorStop(1,'rgba(255,255,255,0.5)');co.beginPath();co.fillStyle=grad;co.fillRect(x+hmargin+2,y+(this.data[i]>0?2:0),(barWidth/2)-2,height-2);co.fill();}}else if(variant=='dot'){co.beginPath();co.moveTo(x+(width/2),y);co.lineTo(x+(width/2),y+height);co.stroke();co.beginPath();co.fillStyle=this.properties['chart.colors'][i];co.arc(x+(width/2),y+(this.data[i]>0?0:height),2,0,6.28,0);co.fillStyle=prop['chart.colors'][0];if(prop['chart.colors.sequential']){co.fillStyle=colors[i];} co.stroke();co.fill();}else{alert('[BAR] Warning! Unknown chart.variant: '+variant);} this.coords.push([x+hmargin,y,width-(2*hmargin),height]);if(typeof this.coords2[i]=='undefined'){this.coords2[i]=[];} this.coords2[i].push([x+hmargin,y,width-(2*hmargin),height]);}else if(this.data[i]&&typeof(this.data[i])=='object'&&prop['chart.grouping']=='stacked'){if(this.scale2.min){alert("[ERROR] Stacked Bar charts with a Y min are not supported");} var barWidth=width-(2*hmargin);var redrawCoords=[];var startY=0;var dataset=this.data[i];if(barWidth<0){alert('[RGRAPH] Warning: you have a negative bar width. This may be caused by the chart.hmargin being too high or the width of the canvas not being sufficient.');} for(j=0;j0){co.strokeRect(x+hmargin,y,width-(2*hmargin),height);co.fillRect(x+hmargin,y,width-(2*hmargin),height);} if(j==0){var startY=y;var startX=x;} if(shadow){redrawCoords.push([x+hmargin,y,width-(2*hmargin),height,co.fillStyle]);} if(variant=='3d'){var prevFillStyle=co.fillStyle;var prevStrokeStyle=co.strokeStyle;if(j==0){co.beginPath();co.moveTo(startX+hmargin,y);co.lineTo(startX+prop['chart.variant.threed.offsetx']+hmargin,y-prop['chart.variant.threed.offsety']);co.lineTo(startX+prop['chart.variant.threed.offsetx']+barWidth+hmargin,y-prop['chart.variant.threed.offsety']);co.lineTo(startX+barWidth+hmargin,y);co.closePath();co.fill();co.stroke();} co.beginPath();co.moveTo(startX+barWidth+hmargin,y);co.lineTo(startX+barWidth+hmargin+prop['chart.variant.threed.offsetx'],y-prop['chart.variant.threed.offsety']);co.lineTo(startX+barWidth+hmargin+prop['chart.variant.threed.offsetx'],y-prop['chart.variant.threed.offsety']+height);co.lineTo(startX+barWidth+hmargin,y+height);co.closePath();co.fill();co.stroke();if(j==0){co.fillStyle='rgba(255,255,255,0.5)';co.beginPath();co.moveTo(startX+hmargin,y);co.lineTo(startX+prop['chart.variant.threed.offsetx']+hmargin,y-prop['chart.variant.threed.offsety']);co.lineTo(startX+prop['chart.variant.threed.offsetx']+barWidth+hmargin,y-prop['chart.variant.threed.offsety']);co.lineTo(startX+barWidth+hmargin,y);co.closePath();co.fill();co.stroke();} co.fillStyle='rgba(0,0,0,0.4)';co.beginPath();co.moveTo(startX+barWidth+hmargin,y);co.lineTo(startX+barWidth+hmargin+prop['chart.variant.threed.offsetx'],y-prop['chart.variant.threed.offsety']);co.lineTo(startX+barWidth+hmargin+prop['chart.variant.threed.offsetx'],y-prop['chart.variant.threed.offsety']+height);co.lineTo(startX+barWidth+hmargin,y+height);co.closePath();co.fill();co.stroke();co.strokeStyle=prevStrokeStyle;co.fillStyle=prevFillStyle;} y+=height;} if(shadow){RGraph.NoShadow(this);for(k=0;k=0){startY-=height;}} co.strokeRect(startX+groupedMargin,startY,individualBarWidth-(2*groupedMargin),height);co.fillRect(startX+groupedMargin,startY,individualBarWidth-(2*groupedMargin),height);y+=height;if(variant=='3d'){var prevFillStyle=co.fillStyle;var prevStrokeStyle=co.strokeStyle;var hmarginGrouped=prop['chart.hmargin.grouped'];if(this.data[i][j]>=0){co.beginPath();co.moveTo(startX+hmarginGrouped,startY);co.lineTo(startX+hmarginGrouped+prop['chart.variant.threed.offsetx'],startY-prop['chart.variant.threed.offsety']);co.lineTo(startX+prop['chart.variant.threed.offsetx']+individualBarWidth-hmarginGrouped,startY-prop['chart.variant.threed.offsety']);co.lineTo(startX+individualBarWidth-hmarginGrouped,startY);co.closePath();co.fill();co.stroke();} co.beginPath();co.moveTo(startX+individualBarWidth-hmarginGrouped-1,startY);co.lineTo(startX+individualBarWidth-hmarginGrouped+prop['chart.variant.threed.offsetx'],this.data[i][j]<0?(this.getYCoord(0)+ma.abs(height)-prop['chart.variant.threed.offsety']):this.getYCoord(0)-height-prop['chart.variant.threed.offsety']);co.lineTo(startX+individualBarWidth-hmarginGrouped+prop['chart.variant.threed.offsetx'],this.data[i][j]<0&&(startY+height-prop['chart.variant.threed.offsety'])<(this.gutterTop+this.halfgrapharea)?(this.gutterTop+this.halfgrapharea):(startY+height-prop['chart.variant.threed.offsety']));co.lineTo(startX+individualBarWidth-hmarginGrouped-1,startY+height);co.closePath();co.fill();co.stroke();if(this.data[i][j]>=0){co.fillStyle='rgba(255,255,255,0.5)';co.beginPath();co.moveTo(startX+hmarginGrouped,startY);co.lineTo(startX+hmarginGrouped+prop['chart.variant.threed.offsetx'],startY-prop['chart.variant.threed.offsety']);co.lineTo(startX+prop['chart.variant.threed.offsetx']+individualBarWidth-hmarginGrouped,startY-prop['chart.variant.threed.offsety']);co.lineTo(startX+individualBarWidth-hmarginGrouped,startY);co.closePath();co.fill();co.stroke();} co.fillStyle='rgba(0,0,0,0.4)';co.beginPath();co.moveTo(startX+individualBarWidth-hmarginGrouped,startY);co.lineTo(startX+individualBarWidth+prop['chart.variant.threed.offsetx']-hmarginGrouped,this.data[i][j]<0?(this.getYCoord(0)+ma.abs(height)-prop['chart.variant.threed.offsety']):this.getYCoord(0)-height-prop['chart.variant.threed.offsety']);co.lineTo(startX+individualBarWidth+prop['chart.variant.threed.offsetx']-hmarginGrouped,this.data[i][j]<0&&(startY+height-5)<(this.gutterTop+this.halfgrapharea)?(this.gutterTop+this.halfgrapharea):(startY+height-prop['chart.variant.threed.offsety']));co.lineTo(startX+individualBarWidth-hmarginGrouped,startY+height);co.closePath();co.fill();co.stroke();co.strokeStyle=prevStrokeStyle;co.fillStyle=prevFillStyle;} if(height<0){height=Math.abs(height);startY=startY-height;} this.coords.push([startX+groupedMargin,startY,individualBarWidth-(2*groupedMargin),height]);if(typeof this.coords2[i]=='undefined'){this.coords2[i]=[];} this.coords2[i].push([startX+groupedMargin,startY,individualBarWidth-(2*groupedMargin),height]);if(prop['chart.shadow']){redrawCoords.push([startX+groupedMargin,startY,individualBarWidth-(2*groupedMargin),height,co.fillStyle]);}} if(redrawCoords.length){RGraph.NoShadow(this);co.lineWidth=prop['chart.linewidth'];co.beginPath();for(var j=0;j=1;--i){var y=this.gutterTop+(grapharea*(i/((labels.length-1)*2)))+(grapharea/2);RG.Text2(this,{'font':font,'size':text_size,'x':xpos+offsetx,'y':y+offsety,'text':String(labels[labels.length-i-1]),'valign':'center','halign':align,'bordered':boxed,'tag':'scale'});} return;} for(var i=0;i=0;--i){var y=this.gutterTop+((this.halfgrapharea/numYLabels)*(i+1))+this.halfgrapharea;var text=this.scale2.labels[i];RG.Text2(this,{'font':font,'size':text_size,'x':xpos+offsetx,'y':y+offsety,'text':'-'+text,'valign':'center','halign':align,'bordered':boxed,'tag':'scale'});} if(this.scale2.min!=0||prop['chart.scale.zerostart']){RG.Text2(this,{'font':font,'size':text_size,'x':xpos+offsetx,'y':this.gutterTop+this.halfgrapharea+offsety,'text':RG.number_format(this,(this.scale2.min.toFixed((this.scale2.min===0?0:prop['chart.scale.decimals']))),units_pre,units_post),'valign':'center','valign':'center','halign':align,'bordered':boxed,'tag':'scale'});}}};this.drawlabels_bottom=this.Drawlabels_bottom=function() {var text_size=prop['chart.text.size'],units_pre=prop['chart.units.pre'],units_post=prop['chart.units.post'],context=this.context,align=prop['chart.yaxispos']=='left'?'right':'left',font=prop['chart.text.font'],numYLabels=prop['chart.ylabels.count'],ymin=prop['chart.ymin'],offsetx=prop['chart.ylabels.offsetx'],offsety=prop['chart.ylabels.offsety'] co.beginPath();co.fillStyle=prop['chart.text.color'];co.strokeStyle='black';if(prop['chart.ylabels.inside']==true){var xpos=prop['chart.yaxispos']=='left'?this.gutterLeft+5:ca.width-this.gutterRight-5;var align=prop['chart.yaxispos']=='left'?'left':'right';var boxed=true;}else{var xpos=prop['chart.yaxispos']=='left'?this.gutterLeft-5:ca.width-this.gutterRight+5;var boxed=false;} if(prop['chart.ylabels.specific']&&typeof(prop['chart.ylabels.specific'])=='object'){var labels=prop['chart.ylabels.specific'];var grapharea=ca.height-this.gutterTop-this.gutterBottom;for(var i=0;i=(typeof obj.data[dataset]==='object'&&obj.data[dataset]?obj.data[dataset].length:1)){if(typeof obj.data[dataset]==='number'){idx-=1;}else if(obj.data[dataset]){idx-=obj.data[dataset].length;}else{idx-=1;} dataset++;} if(typeof(obj.data[dataset])=='number'){idx=null;} return{0:obj,1:left,2:top,3:width,4:height,5:i,object:obj,x:left,y:top,width:width,height:height,index:i,tooltip:tooltip,index_adjusted:idx,dataset:dataset};}} return null;};this.getShapeByX=function(e) {var canvas=e.target;var mouseCoords=RGraph.getMouseXY(e);var obj=arguments[1]?arguments[1]:this;for(var i=0,len=obj.coords.length;i=left&&mouseX<=(left+width)){if(prop['chart.tooltips']){var tooltip=RGraph.parseTooltipText?RGraph.parseTooltipText(prop['chart.tooltips'],i):prop['chart.tooltips'][i];} return{0:obj,1:left,2:top,3:width,4:height,5:i,'object':obj,'x':left,'y':top,'width':width,'height':height,'index':i,'tooltip':tooltip};}} return null;};this.getValue=function(arg) {var co=this.context;var ca=this.canvas;var prop=this.properties;if(arg.length==2){var mouseX=arg[0];var mouseY=arg[1];}else{var mouseCoords=RG.getMouseXY(arg);var mouseX=mouseCoords[0];var mouseY=mouseCoords[1];} if(mouseY(ca.height-prop['chart.gutter.bottom'])||mouseX(ca.width-prop['chart.gutter.right'])){return null;} if(prop['chart.xaxispos']=='center'){var value=(((this.grapharea/2)-(mouseY-prop['chart.gutter.top']))/this.grapharea)*(this.scale2.max-this.scale2.min) value*=2;if(value>=0){value+=this.scale2.min;}else{value-=this.scale2.min;}}else if(prop['chart.xaxispos']=='top'){var value=((this.grapharea-(mouseY-prop['chart.gutter.top']))/this.grapharea)*(this.scale2.max-this.scale2.min) value=this.scale2.max-value;value=ma.abs(value)* -1;}else{var value=((this.grapharea-(mouseY-prop['chart.gutter.top']))/this.grapharea)*(this.scale2.max-this.scale2.min) value+=this.scale2.min;} return value;};this.getYCoord=function(value) {if(value>this.scale2.max){return null;} var co=this.context,ca=this.canvas,prop=this.properties;var y,xaxispos=prop['chart.xaxispos'];if(xaxispos=='top'){if(value<0){value=ma.abs(value);} y=((value-this.scale2.min)/(this.scale2.max-this.scale2.min))*this.grapharea;y=y+this.gutterTop}else if(xaxispos=='center'){y=((value-this.scale2.min)/(this.scale2.max-this.scale2.min))*(this.grapharea/2);y=(this.grapharea/2)-y;y+=this.gutterTop;}else{if(value=prop['chart.gutter.left']&&mouseXY[0]<=(ca.width-prop['chart.gutter.right'])&&mouseXY[1]>=prop['chart.gutter.top']&&mouseXY[1]<=(ca.height-prop['chart.gutter.bottom'])){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){var value=Number(this.getValue(e));var shape=RG.Registry.Get('chart.adjusting.shape') if(shape){RG.Registry.Set('chart.adjusting.shape',shape);if(this.stackedOrGrouped&&prop['chart.grouping']=='grouped'){var indexes=RG.sequentialIndexToGrouped(shape['index'],this.data);if(typeof this.data[indexes[0]]=='number'){this.data[indexes[0]]=Number(value);}else if(!RG.isNull(this.data[indexes[0]])){this.data[indexes[0]][indexes[1]]=Number(value);}}else if(typeof this.data[shape['index']]=='number'){this.data[shape['index']]=Number(value);} RG.redrawCanvas(e.target);RG.fireCustomEvent(this,'onadjust');}}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RGraph.array_clone(prop['chart.colors']);this.original_colors['chart.key.colors']=RGraph.array_clone(prop['chart.key.colors']);this.original_colors['chart.crosshairs.color']=prop['chart.crosshairs.color'];this.original_colors['chart.highlight.stroke']=prop['chart.highlight.stroke'];this.original_colors['chart.highlight.fill']=prop['chart.highlight.fill'];this.original_colors['chart.text.color']=prop['chart.text.color'];this.original_colors['chart.background.barcolor1']=prop['chart.background.barcolor1'];this.original_colors['chart.background.barcolor2']=prop['chart.background.barcolor2'];this.original_colors['chart.background.grid.color']=prop['chart.background.grid.color'];this.original_colors['chart.background.color']=prop['chart.background.color'];this.original_colors['chart.strokecolor']=prop['chart.strokecolor'];this.original_colors['chart.axis.color']=prop['chart.axis.color'];} var colors=prop['chart.colors'];if(colors){for(var i=0;ixaxis_ycoord)){y=y-100;h=h+100;}else{y=y;h=h+100;} co.beginPath();co.rect(x-3,y-3,w+6,h+6);co.lineWidth=5;co.stroke();co.restore();}}}};this.interactiveKeyHighlight=function(index) {this.coords2.forEach(function(value,idx,arr) {if(typeof value[index]=='object'&&value[index]){var x=value[index][0] var y=value[index][1] var w=value[index][2] var h=value[index][3] co.fillStyle=prop['chart.key.interactive.highlight.chart.fill'];co.strokeStyle=prop['chart.key.interactive.highlight.chart.stroke'];co.lineWidth=2;co.strokeRect(x,y,w,h);co.fillRect(x,y,w,h);}});};this.on=function(type,func) {if(type.substr(0,2)!=='on'){type='on'+type;} if(typeof this[type]!=='function'){this[type]=func;}else{RG.addCustomEventListener(this,type,func);} return this;};this.drawAboveLabels=function() {var labels=prop['chart.labels.above'],specific=prop['chart.labels.above.specific'],color=prop['chart.labels.above.color'],background=prop['chart.labels.above.background'],decimals=prop['chart.labels.above.decimals'],size=prop['chart.labels.above.size'],angle=-1*prop['chart.labels.above.angle'],unitsPre=prop['chart.labels.above.units.pre'],unitsPost=prop['chart.labels.above.units.post'],coords=this.coords,coords2=this.coords2,data=this.data,ldata=RG.arrayLinearize(this.data),offset=prop['chart.labels.above.offset'],text_font=prop['chart.text.font'],text_size=prop['chart.text.size'],grouping=prop['chart.grouping'] RG.noShadow(this);co.fillStyle=typeof color==='string'?color:prop['chart.text.color'];if(labels&&grouping==='grouped'){for(var i=0,len=data.length,sequentialIndex=0;i=0){var angle=angle;var halign=(angle?'left':'center');var valign=angle!==0?'center':'bottom';RG.text2(this,{'font':text_font,'size':typeof size==='number'?size:text_size-3,'x':coords2[i][0][0]+(coords2[i][0][2]/2),'y':coords2[i][0][1]-offset,'text':specific?(specific[sequentialIndex]||''):RG.numberFormat(this,Number(typeof data[i]==='object'?data[i][0]:data[i]).toFixed(decimals),unitsPre,unitsPost),'halign':halign,'valign':valign,'angle':angle,'marker':false,'bounding':true,'bounding.fill':background,'bounding.stroke':'rgba(0,0,0,0)','tag':'labels.above'});sequentialIndex++;}else if(typeof data[i]==='number'&&data[i]<0){var angle=angle;var halign=angle?'right':'center';var valign=angle!==0?'center':'top';RG.text2(this,{'font':text_font,'size':typeof size==='number'?size:text_size-3,'x':coords2[i][0][0]+(coords2[i][0][2]/2),'y':coords2[i][0][1]+coords2[i][0][3]+offset,'text':specific?(specific[sequentialIndex]||''):RG.numberFormat(this,Number(typeof data[i]==='object'?data[i][0]:data[i]).toFixed(decimals),unitsPre,unitsPost),'halign':halign,'valign':valign,'angle':angle,'bounding':true,'bounding.fill':background,'bounding.stroke':'rgba(0,0,0,0)','marker':false,'tag':'labels.above'});sequentialIndex++;}else if(typeof data[i]==='object'){for(var j=0,len2=data[i].length;jopt.startFrames[i]){if(typeof obj.data[i]==='number'){obj.data[i]=ma.min(ma.abs(original[i]),ma.abs(original[i]*((opt.counters[i]++)/framesperbar)));if(original[i]<0){obj.data[i]*=-1;}}else if(!RG.isNull(obj.data[i])){for(var j=0,len2=obj.data[i].length;j=opt.frames){if(labelsAbove){obj.set('labelsAbove',true);RG.redraw();} callback(obj);}else{RG.redrawCanvas(obj.canvas);RG.Effects.updateCanvas(iterator);}} iterator();return this;};this.colorWave=function() {var obj=this,opt=arguments[0]||{};opt.frames=opt.frames||60;opt.startFrames=[];opt.counters=[],colors=obj.properties['chart.colors'];if(colors.length<=obj.data.length){obj.set('chart.colors.sequential',true);colors=RG.arrayPad(colors,obj.data.length,colors[colors.length-1]);} var framesperbar=opt.frames/2,frame=-1,callback=arguments[1]||function(){},originalColors=RG.arrayClone(obj.properties['chart.colors']);for(var i=0,len=originalColors.length;iopt.startFrames[i]&&colors[i].match(/^rgba?\(([0-9 ]+),([0-9 ]+),([0-9 ]+)(,([ 0-9.]+)?)\)/)){colors[i]='rgba({1},{2},{3},{4})'.format(RegExp.$1,RegExp.$2,RegExp.$3,(frame-opt.startFrames[i])/framesperbar);}else{colors[i]=colors[i].replace(/,[0-9. ]+\)/,',0)');}} if(frame>=opt.frames){callback(obj);}else{RG.redrawCanvas(obj.canvas);RG.Effects.updateCanvas(iterator);}} iterator();return this;};this.grow=function() {var opt=arguments[0]||{},frames=opt.frames||30,frame=0,callback=arguments[1]||function(){},obj=this,labelsAbove=this.get('labelsAbove') if(RG.isArray(opt.data)){var ymax=0;for(var i=0;i0){co.beginPath();for(var i=0;i0){var xInterval=this.axisWidth/prop['chart.numxticks'];if(typeof(prop['chart.xtickinterval'])=='number'){xInterval=prop['chart.xtickinterval'];} for(i=this.gutterLeft;i<(this.gutterLeft+this.axisWidth);i+=xInterval){co.beginPath();co.moveTo(ma.round(i),ca.height-this.gutterBottom);co.lineTo(ma.round(i),(ca.height-this.gutterBottom)+4);co.closePath();co.stroke();} var stoppingPoint=ca.width-this.gutterRight;for(i=(this.gutterLeft+this.axisWidth+prop['chart.gutter.center']+xInterval);i<=stoppingPoint;i+=xInterval){co.beginPath();co.moveTo(ma.round(i),ca.height-this.gutterBottom);co.lineTo(ma.round(i),(ca.height-this.gutterBottom)+4);co.closePath();co.stroke();} if(prop['chart.noyaxis']){pa2(co,'b m % % l % % s %',ma.round(this.gutterLeft+this.axisWidth),ca.height-this.gutterBottom,ma.round(this.gutterLeft+this.axisWidth),(ca.height-this.gutterBottom)+4,co.strokeStyle);pa2(co,'b m % % l % % s %',ma.round(this.gutterLeft+this.axisWidth+prop['chart.gutter.center']),ca.height-this.gutterBottom,ma.round(this.gutterLeft+this.axisWidth+prop['chart.gutter.center']),(ca.height-this.gutterBottom)+4,co.strokeStyle);}}};this.getMax=this.GetMax=function() {var dec=prop['chart.scale.decimals'];if(prop['chart.xmax']){var max=prop['chart.xmax'];var min=prop['chart.xmin'];this.scale2=RG.getScale2(this,{max:max,min:min,strict:true,'scale.thousand':prop['chart.scale.thousand'],'scale.point':prop['chart.scale.point'],'scale.decimals':prop['chart.scale.decimals'],'ylabels.count':prop['chart.labels.count'],'scale.round':prop['chart.scale.round'],'units.pre':prop['chart.units.pre'],'units.post':prop['chart.units.post']});this.max=this.scale2.max;this.min=this.scale2.min;}else{var max=1;for(var i=0;i=left&&mouseX<=(left+width)&&mouseY>=top&&mouseY<=(top+height));} if(over){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],i);return{0:this,1:left,2:top,3:width,4:height,5:i,object:this,x:left,y:top,width:width,height:height,index:i,tooltip:tooltip};}} return null;};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{RG.Highlight.Rect(this,shape);}};this.getValue=function(e) {var obj=e.target.__object__;var mouseXY=RG.getMouseXY(e);var mouseX=mouseXY[0];if(mouseX>this.gutterLeft&&mouseX<((ca.width/2)-(prop['chart.gutter.center']/2))){var value=(mouseX-prop['chart.gutter.left'])/this.axisWidth;value=this.max-(value*this.max);} if(mouseX<(ca.width-this.gutterRight)&&mouseX>((ca.width/2)+(prop['chart.gutter.center']/2))){var value=(mouseX-prop['chart.gutter.left']-this.axisWidth-prop['chart.gutter.center'])/this.axisWidth;value=(value*this.max);} return value;};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if(mouseXY[0]>prop['chart.gutter.left']&&mouseXY[0]<(ca.width-prop['chart.gutter.right'])&&mouseXY[1]>prop['chart.gutter.top']&&mouseXY[1]<(ca.height-prop['chart.gutter.bottom'])){return this;}};this.getXCoord=function(value) {if(value>this.max||value<0){return null;} var ret=[];var offset=((value/this.max)*this.axisWidth);ret[0]=(this.gutterLeft+this.axisWidth)-offset;ret[1]=(ca.width-this.gutterRight-this.axisWidth)+offset;return ret;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.axis.color']=RG.array_clone(prop['chart.axis.color']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);} var props=this.properties;var colors=props['chart.colors'];for(var i=0;iopt.startFrames_left[i]){var isNull=RG.isNull(obj.left[i]);if(typeof obj.left[i]==='number'){obj.left[i]=ma.min(ma.abs(original_left[i]),ma.abs(original_left[i]*((opt.counters_left[i]++)/framesperbar)));if(original_left[i]<0){obj.left[i]*=-1;}}else if(RG.isArray(obj.left[i])){for(var j=0;jopt.startFrames_right[i]){var isNull=RG.isNull(obj.right[i]);if(typeof obj.left[i]==='number'){obj.right[i]=ma.min(ma.abs(original_right[i]),ma.abs(original_right[i]*((opt.counters_right[i]++)/framesperbar)));if(original_right[i]<0){obj.right[i]*=-1;} if(isNull){obj.right[i]=null;}}else if(RG.isArray(obj.right[i])){for(var j=0;j0&&win.localStorage){var id='__rgraph_annotations_'+e.target.id+'__';var annotations=win.localStorage[id]?win.localStorage[id]+'|':'';annotations+=RG.Registry.Get('annotate.actions');win.localStorage[id]=annotations;} RG.Registry.Set('annotate.actions',[]);RG.FireCustomEvent(obj,'onannotateend');};RGraph.annotating_canvas_onmousemove=function(e) {var obj=e.target.__object__;var prop=obj.properties;var mouseXY=RG.getMouseXY(e);var mouseX=mouseXY[0];var mouseY=mouseXY[1];var lastXY=RG.Registry.Get('annotate.last.coordinates');if(obj.Get('chart.mousedown')){if(obj.type==='bar'&&prop['chart.variant']==='3d'){var adjustment=prop['chart.variant.threed.angle']*mouseXY[0];mouseY-=adjustment;} obj.context.beginPath();if(!lastXY){obj.context.moveTo(mouseX,mouseY)}else{obj.context.strokeStyle=obj.properties['chart.annotate.color'];obj.context.moveTo(lastXY[0],lastXY[1]);obj.context.lineTo(mouseX,mouseY);} RG.Registry.Set('annotate.actions',RG.Registry.Get('annotate.actions')+'|'+mouseX+','+mouseY);RG.Registry.Set('annotate.last.coordinates',[mouseX,mouseY]);RG.FireCustomEvent(obj,'onannotate');obj.context.stroke();}};RG.ShowPalette=RG.Showpalette=function(e) {var isSafari=navigator.userAgent.indexOf('Safari')?true:false;e=RG.FixEventObject(e);var canvas=e.target.parentNode.__canvas__,context=canvas.getContext('2d'),obj=canvas.__object__,div=document.createElement('DIV'),coords=RG.getMouseXY(e) div.__object__=obj;div.className='RGraph_palette';div.style.position='absolute';div.style.backgroundColor='white';div.style.border='1px solid black';div.style.left=0;div.style.top=0;div.style.padding='3px';div.style.paddingLeft='5px';div.style.opacity=0;div.style.boxShadow='rgba(96,96,96,0.5) 3px 3px 3px';div.style.WebkitBoxShadow='rgba(96,96,96,0.5) 3px 3px 3px';div.style.MozBoxShadow='rgba(96,96,96,0.5) 3px 3px 3px';var colors=['Black','Red','Yellow','Green','Orange','White','Magenta','Pink'];for(var i=0,len=colors.length;idocument.body.offsetWidth){div.style.left=(e.pageX-div.offsetWidth)+'px';} RGraph.Registry.Set('chart.palette',div);setTimeout(function(){div.style.opacity=0.2;},50);setTimeout(function(){div.style.opacity=0.4;},100);setTimeout(function(){div.style.opacity=0.6;},150);setTimeout(function(){div.style.opacity=0.8;},200);setTimeout(function(){div.style.opacity=1;},250);RGraph.hideContext();window.onclick=function() {RG.hidePalette();} e.stopPropagation();return false;};RG.clearAnnotations=RG.ClearAnnotations=function(canvas) {if(typeof canvas==='string'){var id=canvas;canvas=doc.getElementById(id);}else{var id=canvas.id} var obj=canvas.__object__;if(win.localStorage&&win.localStorage['__rgraph_annotations_'+id+'__']&&win.localStorage['__rgraph_annotations_'+id+'__'].length){win.localStorage['__rgraph_annotations_'+id+'__']=[];RGraph.FireCustomEvent(obj,'onannotateclear');}};RG.replayAnnotations=RG.ReplayAnnotations=function(obj) {if(!win.localStorage){return;} var context=obj.context;var annotations=win.localStorage['__rgraph_annotations_'+obj.id+'__'];var i,len,move,coords;context.beginPath();context.lineWidth=obj.Get('annotate.linewidth');if(annotations&&annotations.length){annotations=annotations.split('|');}else{return;} for(i=0,len=annotations.length;idocument.body.offsetWidth){x-=div.offsetWidth;} div.style.left=x+'px';div.style.top=y+'px';setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu')) obj.style.opacity = 0.2",50);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu')) obj.style.opacity = 0.4",100);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu')) obj.style.opacity = 0.6",150);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu')) obj.style.opacity = 0.8",200);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu')) obj.style.opacity = 1",250);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu.bg')) obj.style.opacity = 0.2",50);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu.bg')) obj.style.opacity = 0.4",100);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu.bg')) obj.style.opacity = 0.6",150);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu.bg')) obj.style.opacity = 0.8",200);setTimeout("if (obj = RGraph.Registry.Get('chart.contextmenu.bg')) obj.style.opacity = 1",250);RG.Registry.Set('chart.contextmenu',div);RG.Registry.Set('chart.contextmenu.bg',bg);RG.Registry.Get('chart.contextmenu').oncontextmenu=function(){return false;};RG.Registry.Get('chart.contextmenu.bg').oncontextmenu=function(){return false;};canvas.addEventListener('click',function(){RG.HideContext();},false);window.addEventListener('click',function() {RG.HideContext();},false);window.addEventListener('resize',function() {RG.HideContext();},false);if(typeof(obj.getShape)=='function'){RG.Registry.Get('chart.contextmenu').__shape__=obj.getShape(e);} e.stopPropagation();RG.FireCustomEvent(obj,'oncontextmenu');return false;};RG.hideContext=RG.HideContext=function() {var cm=RG.Registry.Get('chart.contextmenu');var cmbg=RG.Registry.Get('chart.contextmenu.bg');RG.HideContextSubmenu();if(cm){cm.parentNode.removeChild(cm);cmbg.parentNode.removeChild(cmbg);cm.style.visibility='hidden';cm.style.display='none';RG.Registry.Set('chart.contextmenu',null);cmbg.style.visibility='hidden';cmbg.style.display='none';RG.Registry.Set('chart.contextmenu.bg',null);}};RG.hideContextSubmenu=RG.HideContextSubmenu=function() {var sub=RG.Registry.Get('chart.contextmenu.submenu');if(sub){sub.style.visibility='none';sub.style.display='none';RG.Registry.Set('chart.contextmenu.submenu',null);}};RG.showContext=RG.ShowContext=function(obj) {RG.HidePalette();if(obj.Get('chart.contextmenu')&&obj.Get('chart.contextmenu').length){var isOpera=navigator.userAgent.indexOf('Opera')>=0;var isSafari=navigator.userAgent.indexOf('Safari')>=0;var isChrome=navigator.userAgent.indexOf('Chrome')>=0;var isMacFirefox=navigator.userAgent.indexOf('Firefox')>0&&navigator.userAgent.indexOf('Mac')>0;var isIE9=navigator.userAgent.indexOf('MSIE 9')>=0;if(((!isOpera&&!isSafari)||isChrome)&&!isMacFirefox){obj.canvas.oncontextmenu=function(e) {e=RG.FixEventObject(e);if(e.ctrlKey)return true;RG.Contextmenu(obj,obj.Get('chart.contextmenu'),e);return false;}}else{obj.canvas.addEventListener('dblclick',function(e) {if(e.ctrlKey)return true;if(!RG.Registry.Get('chart.contextmenu')){RG.Contextmenu(obj,obj.Get('chart.contextmenu'),e);}},false);}}};RG.contextmenu_submenu=RG.Contextmenu_submenu=function(obj,menuitems,parentMenuItem) {RG.HideContextSubmenu();var canvas=obj.canvas;var context=obj.context;var menu=parentMenuItem.parentNode;var subMenu=document.createElement('DIV');subMenu.style.position='absolute';subMenu.style.width='100px';subMenu.style.top=menu.offsetTop+parentMenuItem.offsetTop+'px';subMenu.style.left=(menu.offsetLeft+menu.offsetWidth-(RG.ISOLD?9:0))+'px';subMenu.style.backgroundColor='white';subMenu.style.border='1px solid black';subMenu.className='RGraph_contextmenu';subMenu.__contextmenu__=menu;subMenu.style.boxShadow='3px 3px 3px rgba(96,96,96,0.5)';subMenu.style.MozBoxShadow='3px 3px 3px rgba(96,96,96,0.5)';subMenu.style.WebkitBoxShadow='3px 3px 3px rgba(96,96,96,0.5)';subMenu.style.filter='progid:DXImageTransform.Microsoft.Shadow(color=#aaaaaa,direction=135)';document.body.appendChild(subMenu);for(var i=0;iURL:';div.innerHTML+='
A link using the URL: View
' var img=document.createElement('IMG');RG.Registry.Set('chart.png',img);img.__canvas__=canvas;img.__object__=obj;img.id='__rgraph_image_img__';img.className='RGraph_png';img.src=canvas.toDataURL();div.appendChild(img);setTimeout(function(){document.getElementById("__rgraph_dataurl__").select();},50);window.addEventListener('resize',function(e){var img=RG.Registry.Get('chart.png');img.style.left=(document.body.clientWidth/2)-(img.width/2)+'px';},false);bg.onclick=function(e) {var div=document.getElementById("__rgraph_image_div__");var bg=document.getElementById("__rgraph_image_bg__");if(div){div.style.opacity=0;div.parentNode.removeChild(div);div.id='';div.style.display='none';div=null;} if(bg){bg.style.opacity=0;bg.id='';bg.style.display='none';bg=null;}} window.addEventListener('resize',function(e){bg.onclick(e);},false) RG.showpng_image_bg=bg;RG.showpng_image_div=div;setTimeout('RGraph.showpng_image_div.style.opacity = 0.2',50);setTimeout('RGraph.showpng_image_div.style.opacity = 0.4',100);setTimeout('RGraph.showpng_image_div.style.opacity = 0.6',150);setTimeout('RGraph.showpng_image_div.style.opacity = 0.8',200);setTimeout('RGraph.showpng_image_div.style.opacity = 1',250);setTimeout('RGraph.showpng_image_bg.style.opacity = 0.1',50);setTimeout('RGraph.showpng_image_bg.style.opacity = 0.2',100);setTimeout('RGraph.showpng_image_bg.style.opacity = 0.3',150);setTimeout('RGraph.showpng_image_bg.style.opacity = 0.4',200);setTimeout('RGraph.showpng_image_bg.style.opacity = 0.5',250);img.onclick=function(e) {if(e.stopPropagation)e.stopPropagation();else event.cancelBubble=true;} if(event&&event.stopPropagation){event.stopPropagation();}};})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.common.core.js ================================================ RGraph=window.RGraph||{isRGraph:true};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math;RG.Highlight={};RG.Registry={};RG.Registry.store=[];RG.Registry.store['chart.event.handlers']=[];RG.Registry.store['__rgraph_event_listeners__']=[];RG.Background={};RG.background={};RG.objects=[];RG.Resizing={};RG.events=[];RG.cursor=[];RG.Effects=RG.Effects||{};RG.cache=[];RG.ObjectRegistry={};RG.ObjectRegistry.objects={};RG.ObjectRegistry.objects.byUID=[];RG.ObjectRegistry.objects.byCanvasID=[];RG.OR=RG.ObjectRegistry;RG.PI=ma.PI;RG.HALFPI=RG.PI/2;RG.TWOPI=RG.PI*2;RG.ISFF=ua.indexOf('Firefox')!=-1;RG.ISOPERA=ua.indexOf('Opera')!=-1;RG.ISCHROME=ua.indexOf('Chrome')!=-1;RG.ISSAFARI=ua.indexOf('Safari')!=-1&&!RG.ISCHROME;RG.ISWEBKIT=ua.indexOf('WebKit')!=-1;RG.ISIE=ua.indexOf('Trident')>0||navigator.userAgent.indexOf('MSIE')>0;RG.ISIE6=ua.indexOf('MSIE 6')>0;RG.ISIE7=ua.indexOf('MSIE 7')>0;RG.ISIE8=ua.indexOf('MSIE 8')>0;RG.ISIE9=ua.indexOf('MSIE 9')>0;RG.ISIE10=ua.indexOf('MSIE 10')>0;RG.ISOLD=RGraph.ISIE6||RGraph.ISIE7||RGraph.ISIE8;RG.ISIE11UP=ua.indexOf('MSIE')==-1&&ua.indexOf('Trident')>0;RG.ISIE10UP=RG.ISIE10||RG.ISIE11UP;RG.ISIE9UP=RG.ISIE9||RG.ISIE10UP;RG.getScale=function(max,obj) {if(max==0){return['0.2','0.4','0.6','0.8','1.0'];} var original_max=max;if(max<=1){if(max>0.5){return[0.2,0.4,0.6,0.8,Number(1).toFixed(1)];}else if(max>=0.1){return obj.Get('chart.scale.round')?[0.2,0.4,0.6,0.8,1]:[0.1,0.2,0.3,0.4,0.5];}else{var tmp=max;var exp=0;while(tmp<1.01){exp+=1;tmp*=10;} var ret=['2e-'+exp,'4e-'+exp,'6e-'+exp,'8e-'+exp,'10e-'+exp];if(max<=('5e-'+exp)){ret=['1e-'+exp,'2e-'+exp,'3e-'+exp,'4e-'+exp,'5e-'+exp];} return ret;}} if(String(max).indexOf('.')>0){max=String(max).replace(/\.\d+$/,'');} var interval=ma.pow(10,Number(String(Number(max)).length-1));var topValue=interval;while(topValueNumber(topValue)){topValue+=(interval/2);} if(max<10){topValue=(Number(original_max)<=5?5:10);} if(obj&&typeof(obj.Get('chart.scale.round'))=='boolean'&&obj.Get('chart.scale.round')){topValue=10*interval;} return[topValue*0.2,topValue*0.4,topValue*0.6,topValue*0.8,topValue];};RG.getScale2=function(obj,opt) {var ca=obj.canvas,co=obj.context,prop=obj.properties,numlabels=typeof opt['ylabels.count']=='number'?opt['ylabels.count']:5,units_pre=typeof opt['units.pre']=='string'?opt['units.pre']:'',units_post=typeof opt['units.post']=='string'?opt['units.post']:'',max=Number(opt['max']),min=typeof opt['min']=='number'?opt['min']:0,strict=opt['strict'],decimals=Number(opt['scale.decimals']),point=opt['scale.point'],thousand=opt['scale.thousand'],original_max=max,round=opt['scale.round'],scale={max:1,labels:[],values:[]} if(!max){var max=1;for(var i=0;iarr[i]){i--;break;}} scale.max=arr[i] scale.labels=[];scale.values=[];for(var j=0;jNumber(topValue)){topValue+=(interval/2);} if(max<=10){topValue=(Number(original_max)<=5?5:10);} if(obj&&typeof(round)=='boolean'&&round){topValue=10*interval;} scale.max=topValue;var tmp_point=prop['chart.scale.point'];var tmp_thousand=prop['chart.scale.thousand'];obj.Set('chart.scale.thousand',thousand);obj.Set('chart.scale.point',point);for(var i=0;i=0;i-=1){newarr.push(arr[i]);} return newarr;};RG.abs=function(value) {if(typeof value==='string'){value=parseFloat(value)||0;} if(typeof value==='number'){return ma.abs(value);} if(typeof value==='object'){for(i in value){if(typeof i==='string'||typeof i==='number'||typeof i==='object'){value[i]=RG.abs(value[i]);}} return value;} return 0;};RG.clear=RG.Clear=function(ca) {var obj=ca.__object__,co=ca.getContext('2d'),color=arguments[1]||(obj&&obj.get('clearto')) if(!ca){return;} RG.fireCustomEvent(obj,'onbeforeclear');if(RG.text2.domNodeCache&&RG.text2.domNodeCache[ca.id]){for(var i in RG.text2.domNodeCache[ca.id]){var el=RG.text2.domNodeCache[ca.id][i];if(el&&el.style){el.style.display='none';}}} if(!color||(color&&color==='rgba(0,0,0,0)'||color==='transparent')){co.clearRect(-100,-100,ca.width+200,ca.height+200);co.globalCompositeOperation='source-over';}else if(color){RG.path2(co,'fs % fr -100 -100 % %',color,ca.width+200,ca.height+200);}else{RG.path2(co,'fs % fr -100 -100 % %',obj.get('clearto'),ca.width+200,ca.height+200);} if(RG.Registry.Get('chart.background.image.'+ca.id)){var img=RG.Registry.Get('chart.background.image.'+ca.id);img.style.position='absolute';img.style.left='-10000px';img.style.top='-10000px';} if(RG.Registry.Get('chart.tooltip')&&obj&&!obj.get('chart.tooltips.nohideonclear')){RG.HideTooltip(ca);} ca.style.cursor='default';RG.FireCustomEvent(obj,'onclear');};RG.drawTitle=RG.DrawTitle=function(obj,text,gutterTop) {var ca=canvas=obj.canvas,co=context=obj.context,prop=obj.properties gutterLeft=prop['chart.gutter.left'],gutterRight=prop['chart.gutter.right'],gutterTop=gutterTop,gutterBottom=prop['chart.gutter.bottom'],size=arguments[4]?arguments[4]:12,bold=prop['chart.title.bold'],italic=prop['chart.title.italic'],centerx=(arguments[3]?arguments[3]:((ca.width-gutterLeft-gutterRight)/2)+gutterLeft),keypos=prop['chart.key.position'],vpos=prop['chart.title.vpos'],hpos=prop['chart.title.hpos'],bgcolor=prop['chart.title.background'],x=prop['chart.title.x'],y=prop['chart.title.y'],halign='center',valign='center' if(obj.type=='bar'&&prop['chart.variant']=='3d'){keypos='gutter';} co.beginPath();co.fillStyle=prop['chart.text.color']?prop['chart.text.color']:'black';if(keypos&&keypos!='gutter'){var valign='center';}else if(!keypos){var valign='center';}else{var valign='bottom';} if(typeof prop['chart.title.vpos']==='number'){vpos=prop['chart.title.vpos']*gutterTop;if(prop['chart.xaxispos']==='top'){vpos=prop['chart.title.vpos']*gutterBottom+gutterTop+(ca.height-gutterTop-gutterBottom);}}else{vpos=gutterTop-size-5;if(prop['chart.xaxispos']==='top'){vpos=ca.height-gutterBottom+size+5;}} if(typeof hpos==='number'){centerx=hpos*ca.width;} if(typeof x==='number')centerx=x;if(typeof y==='number')vpos=y;if(typeof x==='string')centerx+=parseFloat(x);if(typeof y==='string')vpos+=parseFloat(y);if(typeof prop['chart.title.halign']==='string'){halign=prop['chart.title.halign'];} if(typeof prop['chart.title.valign']==='string'){valign=prop['chart.title.valign'];} if(typeof prop['chart.title.color']!==null){var oldColor=co.fillStyle var newColor=prop['chart.title.color'];co.fillStyle=newColor?newColor:'black';} var font=prop['chart.text.font'];if(typeof prop['chart.title.font']==='string'){font=prop['chart.title.font'];} var ret=RG.text2(obj,{font:font,size:size,x:centerx,y:vpos,text:text,valign:valign,halign:halign,bounding:bgcolor!=null,'bounding.fill':bgcolor,'bold':bold,italic:italic,tag:'title',marker:false});co.fillStyle=oldColor;};RG.getMouseXY=function(e) {if(!e.target){return;} var el=e.target;var ca=el;var caStyle=ca.style;var offsetX=0;var offsetY=0;var x;var y;var borderLeft=parseInt(caStyle.borderLeftWidth)||0;var borderTop=parseInt(caStyle.borderTopWidth)||0;var paddingLeft=parseInt(caStyle.paddingLeft)||0 var paddingTop=parseInt(caStyle.paddingTop)||0 var additionalX=borderLeft+paddingLeft;var additionalY=borderTop+paddingTop;if(typeof e.offsetX==='number'&&typeof e.offsetY==='number'){if(!RG.ISIE&&!RG.ISOPERA){x=e.offsetX-borderLeft-paddingLeft;y=e.offsetY-borderTop-paddingTop;}else if(RG.ISIE){x=e.offsetX-paddingLeft;y=e.offsetY-paddingTop;}else{x=e.offsetX;y=e.offsetY;}}else{if(typeof el.offsetParent!=='undefined'){do{offsetX+=el.offsetLeft;offsetY+=el.offsetTop;}while((el=el.offsetParent));} x=e.pageX-offsetX-additionalX;y=e.pageY-offsetY-additionalY;x-=(2*(parseInt(document.body.style.borderLeftWidth)||0));y-=(2*(parseInt(document.body.style.borderTopWidth)||0));} return[x,y];};RG.getCanvasXY=function(canvas) {var x=0;var y=0;var el=canvas;do{x+=el.offsetLeft;y+=el.offsetTop;if(el.tagName.toLowerCase()=='table'&&(RG.ISCHROME||RG.ISSAFARI)){x+=parseInt(el.border)||0;y+=parseInt(el.border)||0;} el=el.offsetParent;}while(el&&el.tagName.toLowerCase()!='body');var paddingLeft=canvas.style.paddingLeft?parseInt(canvas.style.paddingLeft):0;var paddingTop=canvas.style.paddingTop?parseInt(canvas.style.paddingTop):0;var borderLeft=canvas.style.borderLeftWidth?parseInt(canvas.style.borderLeftWidth):0;var borderTop=canvas.style.borderTopWidth?parseInt(canvas.style.borderTopWidth):0;if(navigator.userAgent.indexOf('Firefox')>0){x+=parseInt(document.body.style.borderLeftWidth)||0;y+=parseInt(document.body.style.borderTopWidth)||0;} return[x+paddingLeft+borderLeft,y+paddingTop+borderTop];};RG.isFixed=function(canvas) {var obj=canvas;var i=0;while(obj&&obj.tagName.toLowerCase()!='body'&&i<99){if(obj.style.position=='fixed'){return obj;} obj=obj.offsetParent;} return false;};RG.register=RG.Register=function(obj) {if(!obj.Get('chart.noregister')){RGraph.ObjectRegistry.Add(obj);obj.Set('chart.noregister',true);}};RG.redraw=RG.Redraw=function() {var objectRegistry=RGraph.ObjectRegistry.objects.byCanvasID;var tags=document.getElementsByTagName('canvas');for(var i=0,len=tags.length;i0){return String(prepend+String(num)+append);} num=String(num);if(num.indexOf('.')>0){var tmp=num;num=num.replace(/\.(.*)/,'');decimal=tmp.replace(/(.*)\.(.*)/,'$2');} var seperator=thousand_seperator;var foundPoint;for(i=(num.length-1),j=0;i>=0;j++,i--){var character=num.charAt(i);if(j%3==0&&j!=0){output+=seperator;} output+=character;} var rev=output;output='';for(i=(rev.length-1);i>=0;i--){output+=rev.charAt(i);} if(output.indexOf('-'+prop['chart.scale.thousand'])==0){output='-'+output.substr(('-'+prop['chart.scale.thousand']).length);} if(decimal.length){output=output+decimal_seperator+decimal;decimal='';RegExp.$1='';} if(output.charAt(0)=='-'){output=output.replace(/-/,'');prepend='-'+prepend;} return prepend+output+append;};RG.drawBars=RG.DrawBars=function(obj) {var prop=obj.properties;var co=obj.context;var ca=obj.canvas;var hbars=prop['chart.background.hbars'];if(hbars===null){return;} co.beginPath();for(var i=0,len=hbars.length;iobj.scale2.max)start=obj.scale2.max;if(RG.is_null(length))length=obj.scale2.max-start;if(start+length>obj.scale2.max)length=obj.scale2.max-start;if(start+length<(-1*obj.scale2.max))length=(-1*obj.scale2.max)-start;if(prop['chart.xaxispos']=='center'&&start==obj.scale2.max&&length<(obj.scale2.max* -2)){length=obj.scale2.max* -2;} var x=prop['chart.gutter.left'];var y=obj.getYCoord(start);var w=ca.width-prop['chart.gutter.left']-prop['chart.gutter.right'];var h=obj.getYCoord(start+length)-y;if(RG.ISOPERA!=-1&&prop['chart.xaxispos']=='center'&&h<0){h*=-1;y=y-h;} if(prop['chart.xaxispos']=='top'){y=ca.height-y;h*=-1;} co.fillStyle=color;co.fillRect(x,y,w,h);}};RG.drawInGraphLabels=RG.DrawInGraphLabels=function(obj) {var ca=obj.canvas,co=obj.context,prop=obj.properties,labels=prop['chart.labels.ingraph'],labels_processed=[];var fgcolor='black',bgcolor='white',direction=1;if(!labels){return;} for(var i=0,len=labels.length;i0){for(var i=0,len=labels_processed.length;i0){var x=(obj.type=='bar'?coords[0]+(coords[2]/2):coords[0]);var y=(obj.type=='bar'?coords[1]+(coords[3]/2):coords[1]);var length=typeof labels_processed[i][4]==='number'?labels_processed[i][4]:25;co.beginPath();co.fillStyle='black';co.strokeStyle='black';if(obj.type==='bar'){if(obj.Get('chart.xaxispos')=='top'){length*=-1;} if(prop['chart.variant']=='dot'){co.moveTo(ma.round(x),obj.coords[i][1]-5);co.lineTo(ma.round(x),obj.coords[i][1]-5-length);var text_x=ma.round(x);var text_y=obj.coords[i][1]-5-length;}else if(prop['chart.variant']=='arrow'){co.moveTo(ma.round(x),obj.coords[i][1]-5);co.lineTo(ma.round(x),obj.coords[i][1]-5-length);var text_x=ma.round(x);var text_y=obj.coords[i][1]-5-length;}else{co.arc(ma.round(x),y,2.5,0,6.28,0);co.moveTo(ma.round(x),y);co.lineTo(ma.round(x),y-length);var text_x=ma.round(x);var text_y=y-length;} co.stroke();co.fill();}else{if(typeof labels_processed[i]=='object'&&typeof labels_processed[i][3]=='number'&&labels_processed[i][3]==-1){drawUpArrow(x,y) var valign='top';var text_x=x;var text_y=y+5+length;}else{var text_x=x;var text_y=y-5-length;if(text_y<5&&(typeof labels_processed[i]==='string'||typeof labels_processed[i][3]==='undefined')){text_y=y+5+length;var valign='top';} if(valign==='top'){drawUpArrow(x,y);}else{drawDownArrow(x,y);}} co.fill();} co.beginPath();co.fillStyle=(typeof labels_processed[i]==='object'&&typeof labels_processed[i][1]==='string')?labels_processed[i][1]:'black';RG.text2(obj,{font:prop['chart.text.font'],size:prop['chart.text.size'],x:text_x,y:text_y+(obj.properties['chart.text.accessible']?2:0),text:(typeof labels_processed[i]==='object'&&typeof labels_processed[i][0]==='string')?labels_processed[i][0]:labels_processed[i],valign:valign||'bottom',halign:'center',bounding:true,'bounding.fill':(typeof labels_processed[i]==='object'&&typeof labels_processed[i][2]==='string')?labels_processed[i][2]:'white',tag:'labels ingraph'});co.fill();} function drawUpArrow(x,y) {co.moveTo(ma.round(x),y+5);co.lineTo(ma.round(x),y+5+length);co.stroke();co.beginPath();co.moveTo(ma.round(x),y+5);co.lineTo(ma.round(x)-3,y+10);co.lineTo(ma.round(x)+3,y+10);co.closePath();} function drawDownArrow(x,y) {co.moveTo(ma.round(x),y-5);co.lineTo(ma.round(x),y-5-length);co.stroke();co.beginPath();co.moveTo(ma.round(x),y-5);co.lineTo(ma.round(x)-3,y-10);co.lineTo(ma.round(x)+3,y-10);co.closePath();} valign=undefined;}}}};RG.fixEventObject=RG.FixEventObject=function(e) {if(RG.ISOLD){var e=event;e.pageX=(event.clientX+doc.body.scrollLeft);e.pageY=(event.clientY+doc.body.scrollTop);e.target=event.srcElement;if(!doc.body.scrollTop&&doc.documentElement.scrollTop){e.pageX+=parseInt(doc.documentElement.scrollLeft);e.pageY+=parseInt(doc.documentElement.scrollTop);}} if(!e.stopPropagation){e.stopPropagation=function(){window.event.cancelBubble=true;}} return e;};RG.hideCrosshairCoords=RG.HideCrosshairCoords=function() {var div=RG.Registry.Get('chart.coordinates.coords.div');if(div&&div.style.opacity==1&&div.__object__.Get('chart.crosshairs.coords.fadeout')){var style=RG.Registry.Get('chart.coordinates.coords.div').style;setTimeout(function(){style.opacity=0.9;},25);setTimeout(function(){style.opacity=0.8;},50);setTimeout(function(){style.opacity=0.7;},75);setTimeout(function(){style.opacity=0.6;},100);setTimeout(function(){style.opacity=0.5;},125);setTimeout(function(){style.opacity=0.4;},150);setTimeout(function(){style.opacity=0.3;},175);setTimeout(function(){style.opacity=0.2;},200);setTimeout(function(){style.opacity=0.1;},225);setTimeout(function(){style.opacity=0;},250);setTimeout(function(){style.display='none';},275);}};RG.draw3DAxes=RG.Draw3DAxes=function(obj) {var prop=obj.properties,co=obj.context,ca=obj.canvas;var gutterLeft=obj.gutterLeft,gutterRight=obj.gutterRight,gutterTop=obj.gutterTop,gutterBottom=obj.gutterBottom,xaxispos=prop['chart.xaxispos'],graphArea=ca.height-gutterTop-gutterBottom,halfGraphArea=graphArea/2,offsetx=prop['chart.variant.threed.offsetx'],offsety=prop['chart.variant.threed.offsety'],xaxis=prop['chart.variant.threed.xaxis'],yaxis=prop['chart.variant.threed.yaxis'] if(yaxis){RG.draw3DYAxis(obj);} if(xaxis){if(xaxispos==='center'){RG.path2(co,'b m % % l % % l % % l % % c s #aaa f #ddd',gutterLeft,gutterTop+halfGraphArea,gutterLeft+offsetx,gutterTop+halfGraphArea-offsety,ca.width-gutterRight+offsetx,gutterTop+halfGraphArea-offsety,ca.width-gutterRight,gutterTop+halfGraphArea);}else{if(obj.type==='hbar'){var xaxisYCoord=obj.canvas.height-obj.properties['chart.gutter.bottom'];}else{var xaxisYCoord=obj.getYCoord(0);} RG.path2(co,'m % % l % % l % % l % % c s #aaa f #ddd',gutterLeft,xaxisYCoord,gutterLeft+offsetx,xaxisYCoord-offsety,ca.width-gutterRight+offsetx,xaxisYCoord-offsety,ca.width-gutterRight,xaxisYCoord);}}};RG.draw3DYAxis=function(obj) {var prop=obj.properties,co=obj.context,ca=obj.canvas;var gutterLeft=obj.gutterLeft,gutterRight=obj.gutterRight,gutterTop=obj.gutterTop,gutterBottom=obj.gutterBottom,xaxispos=prop['chart.xaxispos'],graphArea=ca.height-gutterTop-gutterBottom,halfGraphArea=graphArea/2,offsetx=prop['chart.variant.threed.offsetx'],offsety=prop['chart.variant.threed.offsety'] if((obj.type==='hbar'||obj.type==='bar')&&prop['chart.yaxispos']==='center'){var x=((ca.width-gutterLeft-gutterRight)/2)+gutterLeft;}else if((obj.type==='hbar'||obj.type==='bar')&&prop['chart.yaxispos']==='right'){var x=ca.width-gutterRight;}else{var x=gutterLeft;} RG.path2(co,'b m % % l % % l % % l % % s #aaa f #ddd',x,gutterTop,x+offsetx,gutterTop-offsety,x+offsetx,ca.height-gutterBottom-offsety,x,ca.height-gutterBottom);};RG.strokedCurvyRect=function(co,x,y,w,h) {var r=arguments[5]?arguments[5]:3;var corner_tl=(arguments[6]||arguments[6]==null)?true:false;var corner_tr=(arguments[7]||arguments[7]==null)?true:false;var corner_br=(arguments[8]||arguments[8]==null)?true:false;var corner_bl=(arguments[9]||arguments[9]==null)?true:false;co.beginPath();co.moveTo(x+(corner_tl?r:0),y);co.lineTo(x+w-(corner_tr?r:0),y);if(corner_tr){co.arc(x+w-r,y+r,r,RG.PI+RG.HALFPI,RG.TWOPI,false);} co.lineTo(x+w,y+h-(corner_br?r:0));if(corner_br){co.arc(x+w-r,y-r+h,r,RG.TWOPI,RG.HALFPI,false);} co.lineTo(x+(corner_bl?r:0),y+h);if(corner_bl){co.arc(x+r,y-r+h,r,RG.HALFPI,RG.PI,false);} co.lineTo(x,y+(corner_tl?r:0));if(corner_tl){co.arc(x+r,y+r,r,RG.PI,RG.PI+RG.HALFPI,false);} co.stroke();};RG.filledCurvyRect=function(co,x,y,w,h) {var r=arguments[5]?arguments[5]:3;var corner_tl=(arguments[6]||arguments[6]==null)?true:false;var corner_tr=(arguments[7]||arguments[7]==null)?true:false;var corner_br=(arguments[8]||arguments[8]==null)?true:false;var corner_bl=(arguments[9]||arguments[9]==null)?true:false;co.beginPath();if(corner_tl){co.moveTo(x+r,y+r);co.arc(x+r,y+r,r,RG.PI,RG.PI+RG.HALFPI,false);}else{co.fillRect(x,y,r,r);} if(corner_tr){co.moveTo(x+w-r,y+r);co.arc(x+w-r,y+r,r,RG.PI+RG.HALFPI,0,false);}else{co.moveTo(x+w-r,y);co.fillRect(x+w-r,y,r,r);} if(corner_br){co.moveTo(x+w-r,y+h-r);co.arc(x+w-r,y-r+h,r,0,RG.HALFPI,false);}else{co.moveTo(x+w-r,y+h-r);co.fillRect(x+w-r,y+h-r,r,r);} if(corner_bl){co.moveTo(x+r,y+h-r);co.arc(x+r,y-r+h,r,RG.HALFPI,RG.PI,false);}else{co.moveTo(x,y+h-r);co.fillRect(x,y+h-r,r,r);} co.fillRect(x+r,y,w-r-r,h);co.fillRect(x,y+r,r+1,h-r-r);co.fillRect(x+w-r-1,y+r,r+1,h-r-r);co.fill();};RG.hideZoomedCanvas=RG.HideZoomedCanvas=function() {var interval=10;var frames=15;if(typeof RG.zoom_image==='object'){var obj=RG.zoom_image.obj;var prop=obj.properties;}else{return;} if(prop['chart.zoom.fade.out']){for(var i=frames,j=1;i>=0;--i,++j){if(typeof RG.zoom_image==='object'){setTimeout("RGraph.zoom_image.style.opacity = "+String(i/10),j*interval);}} if(typeof RG.zoom_background==='object'){setTimeout("RGraph.zoom_background.style.opacity = "+String(i/frames),j*interval);}} if(typeof RG.zoom_image==='object'){setTimeout("RGraph.zoom_image.style.display = 'none'",prop['chart.zoom.fade.out']?(frames*interval)+10:0);} if(typeof RG.zoom_background==='object'){setTimeout("RGraph.zoom_background.style.display = 'none'",prop['chart.zoom.fade.out']?(frames*interval)+10:0);}};RG.addCustomEventListener=RG.AddCustomEventListener=function(obj,name,func) {if(typeof RG.events[obj.uid]==='undefined'){RG.events[obj.uid]=[];} if(name.substr(0,2)!=='on'){name='on'+name;} RG.events[obj.uid].push([obj,name,func]);return RG.events[obj.uid].length-1;};RG.fireCustomEvent=RG.FireCustomEvent=function(obj,name) {if(obj&&obj.isRGraph){if(name.match(/(on)?mouseout/)&&typeof obj.properties['chart.events.mouseout']==='function'){(obj.properties['chart.events.mouseout'])(obj);} if(obj[name]){(obj[name])(obj);} var uid=obj.uid;if(typeof uid==='string'&&typeof RG.events==='object'&&typeof RG.events[uid]==='object'&&RG.events[uid].length>0){for(var j=0;j=0;--i){var obj=objects[i].getObjectByXY(e);if(obj){return obj;}}};RG.OR.getObjectsByXY=function(e) {var canvas=e.target,ret=[],objects=RG.ObjectRegistry.getObjectsByCanvasID(canvas.id);for(var i=(objects.length-1);i>=0;--i){var obj=objects[i].getObjectByXY(e);if(obj){ret.push(obj);}} return ret;};RG.OR.get=RG.OR.getObjectByUID=function(uid) {var objects=RG.ObjectRegistry.objects.byUID;for(var i=0,len=objects.length;i=cx&&y>=cy){angle+=RG.TWOPI;}else if(x>=cx&&yRG.TWOPI){angle-=RG.TWOPI;} return angle;};RG.getHypLength=function(x1,y1,x2,y2) {var ret=ma.sqrt(((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1)));return ret;};RG.getRadiusEndPoint=function(cx,cy,angle,radius) {var x=cx+(ma.cos(angle)*radius);var y=cy+(ma.sin(angle)*radius);return[x,y];};RG.installEventListeners=RG.InstallEventListeners=function(obj) {var prop=obj.properties;if(RG.ISOLD){return;} if(RG.installCanvasClickListener){RG.installWindowMousedownListener(obj);RG.installWindowMouseupListener(obj);RG.installCanvasMousemoveListener(obj);RG.installCanvasMouseupListener(obj);RG.installCanvasMousedownListener(obj);RG.installCanvasClickListener(obj);}else if(RG.hasTooltips(obj)||prop['chart.adjustable']||prop['chart.annotatable']||prop['chart.contextmenu']||prop['chart.resizable']||prop['chart.key.interactive']||prop['chart.events.click']||prop['chart.events.mousemove']||typeof obj.onclick==='function'||typeof obj.onmousemove==='function'){alert('[RGRAPH] You appear to have used dynamic features but not included the file: RGraph.common.dynamic.js');}};RG.pr=function(obj) {var indent=(arguments[2]?arguments[2]:' ');var str='';var counter=typeof arguments[3]=='number'?arguments[3]:0;if(counter>=5){return'';} switch(typeof obj){case'string':str+=obj+' ('+(typeof obj)+', '+obj.length+')';break;case'number':str+=obj+' ('+(typeof obj)+')';break;case'boolean':str+=obj+' ('+(typeof obj)+')';break;case'function':str+='function () {}';break;case'undefined':str+='undefined';break;case'null':str+='null';break;case'object':if(RGraph.is_null(obj)){str+=indent+'null\n';}else{str+=indent+'Object {'+'\n' for(j in obj){str+=indent+' '+j+' => '+RGraph.pr(obj[j],true,indent+' ',counter+1)+'\n';} str+=indent+'}';} break;default:str+='Unknown type: '+typeof obj+'';break;} if(!arguments[1]){alert(str);} return str;};RG.dashedLine=RG.DashedLine=function(co,x1,y1,x2,y2) {var size=5;if(typeof arguments[5]==='number'){size=arguments[5];} var dx=x2-x1;var dy=y2-y1;var num=ma.floor(ma.sqrt((dx*dx)+(dy*dy))/size);var xLen=dx/num;var yLen=dy/num;var count=0;do{(count%2==0&&count>0)?co.lineTo(x1,y1):co.moveTo(x1,y1);x1+=xLen;y1+=yLen;}while(count++<=num);};RG.AJAX=function(url,callback) {if(window.XMLHttpRequest){var httpRequest=new XMLHttpRequest();}else if(window.ActiveXObject){var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");} httpRequest.onreadystatechange=function() {if(this.readyState==4&&this.status==200){this.__user_callback__=callback;this.__user_callback__(this.responseText);}} httpRequest.open('GET',url,true);httpRequest.send();};RG.AJAX.POST=function(url,data,callback) {var crumbs=[];if(window.XMLHttpRequest){var httpRequest=new XMLHttpRequest();}else if(window.ActiveXObject){var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");} httpRequest.onreadystatechange=function() {if(this.readyState==4&&this.status==200){this.__user_callback__=callback;this.__user_callback__(this.responseText);}} httpRequest.open('POST',url,true);httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");for(i in data){if(typeof i=='string'){crumbs.push(i+'='+encodeURIComponent(data[i]));}} httpRequest.send(crumbs.join('&'));};RG.AJAX.getNumber=function(url,callback) {RG.AJAX(url,function() {var num=parseFloat(this.responseText);callback(num);});};RG.AJAX.getString=function(url,callback) {RG.AJAX(url,function() {var str=String(this.responseText);callback(str);});};RG.AJAX.getJSON=function(url,callback) {RG.AJAX(url,function() {var json=eval('('+this.responseText+')');callback(json);});};RG.AJAX.getCSV=function(url,callback) {var seperator=arguments[2]?arguments[2]:',';RG.AJAX(url,function() {var regexp=new RegExp(seperator);var arr=this.responseText.split(regexp);for(var i=0,len=arr.length;i');div.style.fontFamily=font;div.style.fontWeight=bold?'bold':'normal';div.style.fontSize=(size||12)+'pt';var size=[div.offsetWidth,div.offsetHeight];RG.measuretext_cache[str]=size;return size;};RG.text2=RG.Text2=function(obj,opt) {function domtext() {if(String(opt.size).toLowerCase().indexOf('italic')!==-1){opt.size=opt.size.replace(/ *italic +/,'');opt.italic=true;} var cacheKey=ma.abs(parseInt(opt.x))+'_'+ma.abs(parseInt(opt.y))+'_'+String(opt.text).replace(/[^a-zA-Z0-9]+/g,'_')+'_'+obj.canvas.id;if(!ca.rgraph_domtext_wrapper){var wrapper=document.createElement('div');wrapper.id=ca.id+'_rgraph_domtext_wrapper';wrapper.className='rgraph_domtext_wrapper';wrapper.style.overflow=obj.properties['chart.text.accessible.overflow']!=false&&obj.properties['chart.text.accessible.overflow']!='hidden'?'visible':'hidden';wrapper.style.width=ca.offsetWidth+'px';wrapper.style.height=ca.offsetHeight+'px';wrapper.style.cssFloat=ca.style.cssFloat;wrapper.style.display=ca.style.display||'inline-block';wrapper.style.position=ca.style.position||'relative';wrapper.style.left=ca.style.left;wrapper.style.top=ca.style.top;wrapper.style.width=ca.width+'px';wrapper.style.height=ca.height+'px';wrapper.style.lineHeight='initial';ca.style.position='absolute';ca.style.left=0;ca.style.top=0;ca.style.display='inline';ca.style.cssFloat='none';if((obj.type==='bar'||obj.type==='bipolar'||obj.type==='hbar')&&obj.properties['chart.variant']==='3d'){wrapper.style.transform='skewY(5.7deg)';} ca.parentNode.insertBefore(wrapper,ca);ca.parentNode.removeChild(ca);wrapper.appendChild(ca);ca.rgraph_domtext_wrapper=wrapper;}else{wrapper=ca.rgraph_domtext_wrapper;} var defaults={size:12,font:'Arial',italic:'normal',bold:'normal',valign:'bottom',halign:'left',marker:true,color:co.fillStyle,bounding:{enabled:false,fill:'rgba(255,255,255,0.7)',stroke:'#666'}} opt.text=String(opt.text).replace(/\r?\n/g,'[[RETURN]]');if(typeof RG.text2.domNodeCache==='undefined'){RG.text2.domNodeCache=new Array();} if(typeof RG.text2.domNodeCache[obj.id]==='undefined'){RG.text2.domNodeCache[obj.id]=new Array();} if(typeof RG.text2.domNodeDimensionCache==='undefined'){RG.text2.domNodeDimensionCache=new Array();} if(typeof RG.text2.domNodeDimensionCache[obj.id]==='undefined'){RG.text2.domNodeDimensionCache[obj.id]=new Array();} if(!RG.text2.domNodeCache[obj.id]||!RG.text2.domNodeCache[obj.id][cacheKey]){var span=document.createElement('span');span.style.position='absolute';span.style.display='inline';span.style.left=(opt.x*(parseInt(ca.offsetWidth)/parseInt(ca.width)))+'px';span.style.top=(opt.y*(parseInt(ca.offsetHeight)/parseInt(ca.height)))+'px';span.style.color=opt.color||defaults.color;span.style.fontFamily=opt.font||defaults.font;span.style.fontWeight=opt.bold?'bold':defaults.bold;span.style.fontStyle=opt.italic?'italic':defaults.italic;span.style.fontSize=(opt.size||defaults.size)+'pt';span.style.whiteSpace='nowrap';span.tag=opt.tag;if(typeof opt.angle==='number'&&opt.angle!==0){var coords=RG.measureText(opt.text,opt.bold,opt.font,opt.size);span.style.transformOrigin='100% 50%';span.style.transform='rotate('+opt.angle+'deg)';} span.style.textShadow='{1}px {2}px {3}px {4}'.format(co.shadowOffsetX,co.shadowOffsetY,co.shadowBlur,co.shadowColor);if(opt.bounding){span.style.border='1px solid '+(opt['bounding.stroke']||defaults.bounding.stroke);span.style.backgroundColor=opt['bounding.fill']||defaults.bounding.fill;} if((typeof obj.properties['chart.text.accessible.pointerevents']==='undefined'||obj.properties['chart.text.accessible.pointerevents'])&&obj.properties['chart.text.accessible.pointerevents']!=='none'){span.style.pointerEvents='auto';}else{span.style.pointerEvents='none';} span.style.padding=opt.bounding?'2px':null;span.__text__=opt.text span.innerHTML=opt.text.replace('&','&').replace('<','<').replace('>','>');span.innerHTML=span.innerHTML.replace(/\[\[RETURN\]\]/g,'
');wrapper.appendChild(span);opt.halign=opt.halign||'left';opt.valign=opt.valign||'bottom';if(opt.halign==='right'){span.style.left=parseFloat(span.style.left)-span.offsetWidth+'px';span.style.textAlign='right';}else if(opt.halign==='center'){span.style.left=parseFloat(span.style.left)-(span.offsetWidth/2)+'px';span.style.textAlign='center';} if(opt.valign==='top'){}else if(opt.valign==='center'){span.style.top=parseFloat(span.style.top)-(span.offsetHeight/2)+'px';}else{span.style.top=parseFloat(span.style.top)-span.offsetHeight+'px';} var offsetWidth=parseFloat(span.offsetWidth),offsetHeight=parseFloat(span.offsetHeight),top=parseFloat(span.style.top),left=parseFloat(span.style.left);RG.text2.domNodeCache[obj.id][cacheKey]=span;RG.text2.domNodeDimensionCache[obj.id][cacheKey]={left:left,top:top,width:offsetWidth,height:offsetHeight};span.id=cacheKey;}else{span=RG.text2.domNodeCache[obj.id][cacheKey];span.style.display='inline';var offsetWidth=RG.text2.domNodeDimensionCache[obj.id][cacheKey].width,offsetHeight=RG.text2.domNodeDimensionCache[obj.id][cacheKey].height,top=RG.text2.domNodeDimensionCache[obj.id][cacheKey].top,left=RG.text2.domNodeDimensionCache[obj.id][cacheKey].left;} if(opt.marker){RG.path2(context,'b m % % l % % m % % l % % s',opt.x-5,opt.y,opt.x+5,opt.y,opt.x,opt.y-5,opt.x,opt.y+5);} if(obj.type==='drawing.text'){if(obj.properties['chart.events.mousemove']){span.addEventListener('mousemove',function(e){(obj.properties['chart.events.mousemove'])(e,obj);},false);} if(obj.properties['chart.events.click']){span.addEventListener('click',function(e){(obj.properties['chart.events.click'])(e,obj);},false);} if(obj.properties['chart.tooltips']){span.addEventListener(obj.properties['chart.tooltips.event'].indexOf('mousemove')!==-1?'mousemove':'click',function(e) {if(!RG.Registry.get('chart.tooltip')||RG.Registry.get('chart.tooltip').__index__!==0||RG.Registry.get('chart.tooltip').__object__.uid!=obj.uid){RG.hideTooltip();RG.redraw();RG.tooltip(obj,obj.properties['chart.tooltips'][0],opt.x,opt.y,0,e);}},false);}} var ret={};ret.x=left;ret.y=top;ret.width=offsetWidth;ret.height=offsetHeight;ret.object=obj;ret.text=opt.text;ret.tag=opt.tag;RG.text2.domNodeCache.reset=function() {if(arguments[0]){if(typeof arguments[0]==='string'){var ca=document.getElementById(arguments[0])}else{var ca=arguments[0];} var nodes=RG.text2.domNodeCache[ca.id];for(j in nodes){var node=RG.text2.domNodeCache[ca.id][j];if(node&&node.parentNode){node.parentNode.removeChild(node);}} RG.text2.domNodeCache[ca.id]=[];RG.text2.domNodeDimensionCache[ca.id]=[];}else{for(i in RG.text2.domNodeCache){for(j in RG.text2.domNodeCache[i]){if(RG.text2.domNodeCache[i][j]&&RG.text2.domNodeCache[i][j].parentNode){RG.text2.domNodeCache[i][j].parentNode.removeChild(RG.text2.domNodeCache[i][j]);}}} RG.text2.domNodeCache=[];RG.text2.domNodeDimensionCache=[];}};RG.text2.find=function(opt) {var span,nodes=[];var id=typeof opt.id==='string'?opt.id:opt.object.id;for(i in RG.text2.domNodeCache[id]){span=RG.text2.domNodeCache[id][i];if(typeof opt.tag==='string'&&opt.tag===span.tag){nodes.push(span);continue;} if(typeof opt.tag==='object'&&opt.tag.constructor.toString().indexOf('RegExp')){var regexp=new RegExp(opt.tag);if(regexp.test(span.tag)){nodes.push(span);continue;}} if(typeof opt.text==='string'&&opt.text===span.__text__){nodes.push(span);continue;} if(typeof opt.text==='object'&&opt.text.constructor.toString().indexOf('RegExp')){var regexp=new RegExp(opt.text);if(regexp.test(span.__text__)){nodes.push(span);continue;}}} return nodes;};ret.node=span;if(obj&&obj.isRGraph&&obj.coordsText){obj.coordsText.push(ret);} return ret;} if(obj&&obj.isRGraph){var obj=obj;var co=obj.context;var ca=obj.canvas;}else if(typeof obj=='string'){var ca=document.getElementById(obj);var co=ca.getContext('2d');var obj=ca.__object__;}else if(typeof obj.getContext==='function'){var ca=obj;var co=ca.getContext('2d');var obj=ca.__object__;}else if(obj.toString().indexOf('CanvasRenderingContext2D')!=-1||RGraph.ISIE8&&obj.moveTo){var co=obj;var ca=obj.canvas;var obj=ca.__object__;}else if(RG.ISOLD&&obj.fillText){var co=obj;var ca=obj.canvas;var obj=ca.__object__;} if(typeof opt.boundingFill==='string')opt['bounding.fill']=opt.boundingFill;if(typeof opt.boundingStroke==='string')opt['bounding.stroke']=opt.boundingStroke;if(obj&&obj.properties['chart.text.accessible']&&opt.accessible!==false){return domtext();} var x=opt.x,y=opt.y,originalX=x,originalY=y,text=opt.text,text_multiline=typeof text==='string'?text.split(/\r?\n/g):'',numlines=text_multiline.length,font=opt.font?opt.font:'Arial',size=opt.size?opt.size:10,size_pixels=size*1.5,bold=opt.bold,italic=opt.italic,halign=opt.halign?opt.halign:'left',valign=opt.valign?opt.valign:'bottom',tag=typeof opt.tag=='string'&&opt.tag.length>0?opt.tag:'',marker=opt.marker,angle=opt.angle||0 var bounding=opt.bounding,bounding_stroke=opt['bounding.stroke']?opt['bounding.stroke']:'black',bounding_fill=opt['bounding.fill']?opt['bounding.fill']:'rgba(255,255,255,0.7)',bounding_shadow=opt['bounding.shadow'],bounding_shadow_color=opt['bounding.shadow.color']||'#ccc',bounding_shadow_blur=opt['bounding.shadow.blur']||3,bounding_shadow_offsetx=opt['bounding.shadow.offsetx']||3,bounding_shadow_offsety=opt['bounding.shadow.offsety']||3,bounding_linewidth=opt['bounding.linewidth']||1;var ret={};if(typeof opt.color==='string'){var orig_fillstyle=co.fillStyle;co.fillStyle=opt.color;} if(typeof text=='number'){text=String(text);} if(typeof text!=='string'){return;} if(angle!=0){co.save();co.translate(x,y);co.rotate((ma.PI/180)*angle) x=0;y=0;} co.font=(opt.italic?'italic ':'')+(opt.bold?'bold ':'')+size+'pt '+font;var width=0;for(var i=0;i1){y-=((numlines-1)*size_pixels);} var boundingY=y-size_pixels-2;} var boundingW=width+4;var boundingH=height+4;if(bounding){var pre_bounding_linewidth=co.lineWidth;var pre_bounding_strokestyle=co.strokeStyle;var pre_bounding_fillstyle=co.fillStyle;var pre_bounding_shadowcolor=co.shadowColor;var pre_bounding_shadowblur=co.shadowBlur;var pre_bounding_shadowoffsetx=co.shadowOffsetX;var pre_bounding_shadowoffsety=co.shadowOffsetY;co.lineWidth=bounding_linewidth;co.strokeStyle=bounding_stroke;co.fillStyle=bounding_fill;if(bounding_shadow){co.shadowColor=bounding_shadow_color;co.shadowBlur=bounding_shadow_blur;co.shadowOffsetX=bounding_shadow_offsetx;co.shadowOffsetY=bounding_shadow_offsety;} co.strokeRect(boundingX,boundingY,boundingW,boundingH);co.fillRect(boundingX,boundingY,boundingW,boundingH);co.lineWidth=pre_bounding_linewidth;co.strokeStyle=pre_bounding_strokestyle;co.fillStyle=pre_bounding_fillstyle;co.shadowColor=pre_bounding_shadowcolor co.shadowBlur=pre_bounding_shadowblur co.shadowOffsetX=pre_bounding_shadowoffsetx co.shadowOffsetY=pre_bounding_shadowoffsety} if(numlines>1){for(var i=0;i=0){if(RG.is_null(data[group])){group++;grouped_index=0;continue;} if(typeof data[group]=='number'){group++ grouped_index=0;continue;} grouped_index++;if(grouped_index>=data[group].length){group++;grouped_index=0;}} return[group,grouped_index];};RG.Highlight.rect=RG.Highlight.Rect=function(obj,shape) {var ca=obj.canvas;var co=obj.context;var prop=obj.properties;if(prop['chart.tooltips.highlight']){co.lineWidth=1;co.beginPath();co.strokeStyle=prop['chart.highlight.stroke'];co.fillStyle=prop['chart.highlight.fill'];co.rect(shape['x'],shape['y'],shape['width'],shape['height']);co.stroke();co.fill();}};RG.Highlight.point=RG.Highlight.Point=function(obj,shape) {var prop=obj.properties;var ca=obj.canvas;var co=obj.context;if(prop['chart.tooltips.highlight']){co.beginPath();co.strokeStyle=prop['chart.highlight.stroke'];co.fillStyle=prop['chart.highlight.fill'];var radius=prop['chart.highlight.point.radius']||2;co.arc(shape['x'],shape['y'],radius,0,RG.TWOPI,0);co.stroke();co.fill();}};RG.parseDate=function(str) {str=RG.trim(str);if(str==='now'){str=(new Date()).toString();} if(str.match(/^(\d\d)(?:-|\/)(\d\d)(?:-|\/)(\d\d\d\d)(.*)$/)){str='{1}/{2}/{3}{4}'.format(RegExp.$3,RegExp.$2,RegExp.$1,RegExp.$4);} if(str.match(/^(\d\d\d\d)(-|\/)(\d\d)(-|\/)(\d\d)( |T)(\d\d):(\d\d):(\d\d)$/)){str=RegExp.$1+'-'+RegExp.$3+'-'+RegExp.$5+'T'+RegExp.$7+':'+RegExp.$8+':'+RegExp.$9;} if(str.match(/^\d\d\d\d-\d\d-\d\d$/)){str=str.replace(/-/g,'/');} if(str.match(/^\d\d:\d\d:\d\d$/)){var dateObj=new Date();var date=dateObj.getDate();var month=dateObj.getMonth()+1;var year=dateObj.getFullYear();if(String(month).length===1)month='0'+month;if(String(date).length===1)date='0'+date;str=(year+'/'+month+'/'+date)+' '+str;} return Date.parse(str);};RG.resetColorsToOriginalValues=function(obj) {if(obj.original_colors){for(var j in obj.original_colors){if(typeof j==='string'&&j.substr(0,6)==='chart.'){obj.properties[j]=RG.arrayClone(obj.original_colors[j]);}}} if(typeof obj.resetColorsToOriginalValues==='function'){obj.resetColorsToOriginalValues();} obj.colorsParsed=false;};RG.linearGradient=RG.LinearGradient=function(obj,x1,y1,x2,y2,color1,color2) {var gradient=obj.context.createLinearGradient(x1,y1,x2,y2);var numColors=arguments.length-5;for(var i=5;i0&&pos<20;};RG.trim=function(str) {return RG.ltrim(RG.rtrim(str));};RG.ltrim=function(str) {return str.replace(/^(\s|\0)+/,'');};RG.rtrim=function(str) {return str.replace(/(\s|\0)+$/,'');};RG.isNull=RG.is_null=function(arg) {if(arg==null||typeof arg==='object'&&!arg){return true;} return false;};RG.async=RG.Async=function(func) {return setTimeout(func,arguments[1]?arguments[1]:1);};RG.reset=RG.Reset=function(ca) {ca.width=ca.width;RG.ObjectRegistry.clear(ca);ca.__rgraph_aa_translated__=false;if(RG.text2.domNodeCache&&RG.text2.domNodeCache.reset){RG.text2.domNodeCache.reset(ca);} if(!RG.text2.domNodeCache){RG.text2.domNodeCache=[];} if(!RG.text2.domNodeDimensionCache){RG.text2.domNodeDimensionCache=[];} RG.text2.domNodeCache[ca.id]=[];RG.text2.domNodeDimensionCache[ca.id]=[];};RG.att=RG.attribution=function(obj) {var ca=obj.canvas,co=obj.context,prop=obj.properties;if(!ca||!co){return;} var width=ca.width,height=ca.height,wrapper=document.getElementById('cvs').__object__.canvas.parentNode,text=prop['chart.attribution.text']||'Free Charts with RGraph.net',x=prop['chart.attribution.x'],y=prop['chart.attribution.y'],bold=prop['chart.attribution.bold'],italic=prop['chart.attribution.italic'],font=prop['chart.attribution.font']||'sans-serif',size=prop['chart.attribution.size']||8,underline=prop['chart.attribution.underline']?'underline':'none',color=typeof prop['chart.attribution.color']==='string'?prop['chart.attribution.color']:'',href=typeof prop['chart.attribution.href']==='string'?prop['chart.attribution.href']:'http://www.rgraph.net/canvas/index.html';if(wrapper.attribution_node){return;} var measurements=RG.measureText(text,bold,font,size);var a=document.createElement('A');a.href=href;a.innerHTML=text;a.target='_blank';a.style.position='absolute';a.style.left=typeof x==='number'?x:wrapper.offsetWidth-measurements[0]-5+'px';a.style.top=typeof y==='number'?y:wrapper.offsetHeight-measurements[1]+'px';a.style.fontSize=size+'pt';a.style.fontStyle=typeof italic==='boolean'?(italic?'italic':''):'italic',a.style.fontWeight=bold?'bold':'',a.style.textDecoration=underline;a.style.fontFamily=font;a.style.color=color;wrapper.appendChild(a);wrapper.attribution_node=a;};RG.getCanvasTag=function(id) {id=typeof id==='object'?id.id:id;var canvas=doc.getElementById(id);return[id,canvas];};RG.Effects.updateCanvas=RG.Effects.UpdateCanvas=function(func) {win.requestAnimationFrame=win.requestAnimationFrame||win.webkitRequestAnimationFrame||win.msRequestAnimationFrame||win.mozRequestAnimationFrame||(function(func){setTimeout(func,16.666);});win.requestAnimationFrame(func);};RG.Effects.getEasingMultiplier=function(frames,frame) {return ma.pow(ma.sin((frame/frames)*RG.HALFPI),3);};RG.stringsToNumbers=function(str) {var sep=arguments[1]||',';if(typeof str==='number'){return str;} if(typeof str==='string'){if(str.indexOf(sep)!=-1){str=str.split(sep);}else{str=parseFloat(str);}} if(typeof str==='object'&&!RG.isNull(str)){for(var i=0,len=str.length;i0;isArray=value.constructor.toString().indexOf('Array')>0;} if(isObject&&!isArray){recurse(obj,config[key],name+'.'+key,settings);}else if(key==='self'){settings[name]=value;}else{settings[name+'.'+key]=value;}} return settings;};var settings=recurse(obj,config,'chart',{});for(key in settings){if(typeof key==='string'){obj.set(key,settings[key]);}}};RG.path2=function(co,p) {var args=arguments;if(typeof p==='string'){p=splitstring(p);} RG.path2.last=RG.arrayClone(p);for(var i=0,len=p.length;i=0)win.event=e;e=RG.fixEventObject(e);if(RG.HideTooltip&&RG.Registry.Get('chart.tooltip')){RG.clear(RG.Registry.Get('chart.tooltip').__canvas__);RG.redraw();RG.hideTooltip();}};win.addEventListener('mousedown',RG.window_mousedown_event_listener,false);}};RG.installWindowMouseupListener=RG.InstallWindowMouseupListener=function(obj) {if(!RG.window_mouseup_event_listener){RG.window_mouseup_event_listener=function(e) {if(navigator.userAgent.indexOf('Firefox')>=0)win.event=e;e=RG.fixEventObject(e);if(RG.annotating_window_onmouseup){RG.annotating_window_onmouseup(e);return;} if(RG.Registry.Get('chart.adjusting')||RG.Registry.Get('chart.adjusting.gantt')){var obj=RG.Registry.Get('chart.adjusting');if(obj&&obj.type==='line'){obj.data_arr=RG.arrayLinearize(obj.data);} RG.fireCustomEvent(RG.Registry.Get('chart.adjusting'),'onadjustend');} RG.Registry.set('chart.adjusting',null);RG.Registry.set('chart.adjusting.shape',null);RG.Registry.set('chart.adjusting.gantt',null);var tags=document.getElementsByTagName('canvas');for(var i=0;i=0)window.event=e;e=RG.fixEventObject(e);var objects=RG.ObjectRegistry.getObjectsByXY(e);if(objects){for(var i=0,len=objects.length;i=0)window.event=e;e=RG.fixEventObject(e);var objects=RG.OR.getObjectsByXY(e);var uids=[];if(objects&&objects.length>0){for(var i=0,len=objects.length;i=obj.coords.key[i][0]&&mouseXY[0]<=(obj.coords.key[i][0]+obj.coords.key[i][2])&&mouseXY[1]>=obj.coords.key[i][1]&&mouseXY[1]<=(obj.coords.key[i][1]+obj.coords.key[i][3])){RG.Registry.set('key-element',obj.coords.key[i]);overkey=true;} if(!overkey){RG.Registry.set('key-element',null);}}} var func=obj.get('chart.events.mousemove');if(!func&&typeof obj.onmousemove=='function'){var func=obj.onmousemove;} if(shape){var index=shape['object'].type=='scatter'?shape['index_adjusted']:shape['index'];if(typeof(obj['$'+index])=='object'&&typeof(obj['$'+index].onmousemove)=='function'){var func2=obj['$'+index].onmousemove;}} if(shape&&(typeof(func)=='function'||typeof(func2)=='function'||typeof obj.Get('link')==='string')){if(obj.Get('chart.events.mousemove.revertto')==null){obj.Set('chart.events.mousemove.revertto',e.target.style.cursor);} if(typeof(func)=='function')RGraph.custom_events_mousemove_pointer=func(e,shape);if(typeof(func2)=='function')RGraph.custom_events_mousemove_pointer=RGraph.custom_events_mousemove_pointer||func2(e,shape);if(typeof RG.events==='object'&&typeof RG.events[obj.uid]==='object'){for(i in RG.events[obj.uid]){if(typeof i==='string'&&typeof RG.events[obj.uid][i]==='object'&&RG.events[obj.uid][i][1]==='onmousemove'&&typeof RG.events[obj.uid][i][2]==='function'){(RG.events[obj.uid][i][2])(obj);}}}}else if(typeof(obj.Get('chart.events.mousemove.revertto'))=='string'){RG.cursor.push('default');obj.Set('chart.events.mousemove.revertto',null);} var func=obj.properties['chart.events.mouseover'];if(!func&&typeof obj.onmouseover==='function'){func=obj.onmouseover;} if(shape){var index=shape['object'].type=='scatter'?shape['index_adjusted']:shape['index'];if(typeof(obj['$'+index])=='object'&&typeof(obj['$'+index].onmouseover)=='function'){var func2=obj['$'+index].onmouseover;}}else{obj.__mouseover_shape_index__=null;RG.__mouseover_objects__=[];RG.last_mouseover_uid=null;RG.last_mouseover_object=null;} if(typeof RG.__mouseover_objects__==='undefined'){RG.__mouseover_objects__=[];RG.last_mouseover_uid=null;RG.last_mouseover_object=null;} if(shape){if((obj.__mouseover_shape_index__===shape.index)===false){obj.__mouseover_shape__=shape;obj.__mouseover_shape_index__=shape.index;RG.last_mouseover_uid=obj.uid;RG.last_mouseover_object=obj;RG.__mouseover_objects__.push(obj);if(func)func(e,shape);if(func2)func2(e,shape);if(typeof RG.events==='object'&&typeof RG.events[obj.uid]==='object'){for(i in RG.events[obj.uid]){if(typeof i==='string'&&typeof RG.events[obj.uid][i]==='object'&&RG.events[obj.uid][i][1]==='onmouseover'&&typeof RG.events[obj.uid][i][2]==='function'){(RG.events[obj.uid][i][2])(obj);}}}}}else{obj.__mouseover_shape_index__=null;RG.__mouseover_objects__=[];RG.last_mouseover_uid=null;RG.last_mouseover_object=null;} var current_tooltip=RG.Registry.get('chart.tooltip');var tooltips=obj.get('chart.tooltips');var tooltips_event=obj.Get('chart.tooltips.event');if(shape&&(tooltips&&tooltips[shape['index']]||shape['tooltip'])&&tooltips_event.indexOf('mousemove')!==-1&&(RG.isNull(current_tooltip)||obj.uid!=current_tooltip.__object__.uid||(current_tooltip.__index__!=shape['index'])||(typeof shape['dataset']==='number'&&shape['dataset']!=current_tooltip.__shape__['dataset']))){RG.clear(obj.canvas);RG.hideTooltip();RG.redraw();obj.canvas.rgraph_mouseup_event_listener(e);return;} if(obj&&obj.get('chart.adjustable')){obj.Adjusting_mousemove(e);} if(shape||(obj.overChartArea&&obj.overChartArea(e))){break;}} var objects=RG.OR.getObjectsByCanvasID(e.target.id);for(var i=0;i=0)window.event=e;e=RG.fixEventObject(e);if(e.target.__object__&&e.target.__object__.get('chart.annotatable')&&RG.annotating_canvas_onmousedown){RG.annotating_canvas_onmousedown(e);return;} var obj=RG.ObjectRegistry.getObjectByXY(e);if(obj){var id=obj.id;if(obj&&obj.isRGraph&&obj.get('chart.adjustable')){var obj=RG.OR.getObjectByXY(e);if(obj&&obj.isRGraph){switch(obj.type){case'bar':var shape=obj.getShapeByX(e);break;case'gantt':var shape=obj.getShape(e);var data=typeof shape.subindex==='number'?obj.data[shape.index][shape.subindex]:obj.data[shape.index];if(shape){var mouseXY=RG.getMouseXY(e);RG.Registry.set('chart.adjusting.gantt',{index:shape.index,subindex:shape.subindex,object:obj,mousex:mouseXY[0],mousey:mouseXY[1],event:data,event_start:data.start,event_duration:data.duration,mode:(mouseXY[0]>(shape['x']+shape['width']-5)?'resize':'move'),shape:shape});} break;case'line':var shape=obj.getShape(e);break;case'hbar':var shape=obj.getShapeByY(e);break;default:var shape=null;} if(RG.isNull(obj.properties['chart.adjustable.only'])||typeof obj.properties['chart.adjustable.only']==='undefined'||(RG.isArray(obj.properties['chart.adjustable.only'])&&obj.isAdjustable&&obj.isAdjustable(shape))){RG.Registry.set('chart.adjusting.shape',shape);RG.fireCustomEvent(obj,'onadjustbegin');RG.Registry.set('chart.adjusting',obj);RG.clear(obj.canvas);RG.redraw();obj.canvas.rgraph_mousemove_event_listener(e);}}} RG.clear(obj.canvas);RG.redraw();}};obj.canvas.addEventListener('mousedown',obj.canvas.rgraph_mousedown_event_listener,false);}};RG.installCanvasClickListener=RG.InstallCanvasClickListener=function(obj) {if(!obj.canvas.rgraph_click_event_listener){obj.canvas.rgraph_click_event_listener=function(e) {if(navigator.userAgent.indexOf('Firefox')>=0)window.event=e;e=RG.fixEventObject(e);var objects=RG.ObjectRegistry.getObjectsByXY(e);for(var i=0,len=objects.length;iobj.coords.key[j][0]&&mouseX<(obj.coords.key[j][0]+obj.coords.key[j][2])&&mouseY>obj.coords.key[j][1]&&mouseY<(obj.coords.key[j][1]+obj.coords.key[j][3])){var pointer=true;}}}} if(RGraph.custom_events_mousemove_pointer){var pointer=true;RGraph.custom_events_mousemove_pointer=false;} var objects=RG.OR.objects.byCanvasID;for(var i=0,len=objects.length;i(e.target.width-32)&&mouseY>(e.target.height-16)){pointer=true;} if(pointer){e.target.style.cursor='pointer';}else if(e.target.style.cursor=='pointer'){e.target.style.cursor='default';}else{e.target.style.cursor=null;} if(resizable&&mouseX>=(e.target.width-15)&&mouseY>=(e.target.height-15)){e.target.style.cursor='move';}else if(e.target.style.cursor==='move'){e.target.style.cursor='default';} if(typeof mouse_over_key=='boolean'&&mouse_over_key){e.target.style.cursor='pointer';} if(obj&&obj.type=='line'&&obj.get('chart.adjustable')){if(obj.getShape){var shape=obj.getShape(e);if(shape&&obj.isAdjustable(shape)){e.target.style.cursor='ns-resize';}}else{e.target.style.cursor='default';}} if(e.target.__object__&&e.target.__object__.get('chart.annotatable')){e.target.style.cursor='crosshair';} if(obj&&obj.type==='drawing.text'&&shape&&typeof obj.get('link')==='string'){e.target.style.cursor='pointer';}};RG.parseTooltipText=function(tooltips,idx) {if(!tooltips){return null;} if(typeof tooltips=='function'){var text=tooltips(idx);}else if(typeof tooltips=='string'){var text=tooltips;}else if(typeof tooltips=='object'&&typeof tooltips[idx]=='function'){var text=tooltips[idx](idx);}else if(typeof tooltips[idx]=='string'&&tooltips[idx]){var text=tooltips[idx];}else{var text='';} if(text=='undefined'){text='';}else if(text=='null'){text='';} return RG.getTooltipTextFromDIV?RG.getTooltipTextFromDIV(text):text;};RG.drawCrosshairs=RG.DrawCrosshairs=function(e,obj) {var e=RG.fixEventObject(e),width=obj.canvas.width,height=obj.canvas.height,mouseXY=RG.getMouseXY(e),x=mouseXY[0],y=mouseXY[1],gutterLeft=obj.gutterLeft,gutterRight=obj.gutterRight,gutterTop=obj.gutterTop,gutterBottom=obj.gutterBottom,Mathround=Math.round,prop=obj.properties,co=obj.context,ca=obj.canvas RG.redrawCanvas(ca);if(x>=gutterLeft&&y>=gutterTop&&x<=(width-gutterRight)&&y<=(height-gutterBottom)){var linewidth=prop['chart.crosshairs.linewidth']?prop['chart.crosshairs.linewidth']:1;co.lineWidth=linewidth?linewidth:1;co.beginPath();co.strokeStyle=prop['chart.crosshairs.color'];if(prop['chart.crosshairs.snap']){var point=null;var dist=null;var len=null;if(obj.type=='line'){for(var i=0;i '+xCoord+'
'+prop['chart.crosshairs.coords.labels.y']+': '+yCoord;obj.canvas.addEventListener('mouseout',RG.hideCrosshairCoords,false);ca.__crosshairs_labels__=div;ca.__crosshairs_x__=xCoord;ca.__crosshairs_y__=yCoord;}else if(prop['chart.crosshairs.coords']){alert('[RGRAPH] Showing crosshair coordinates is only supported on the Scatter chart');} RG.fireCustomEvent(obj,'oncrosshairs');}else{RG.hideCrosshairCoords();}};RG.allowSegmentHighlight=function(opt) {var obj=opt.object,count=opt.count,fill=opt.fill,stroke=opt.stroke if(!RG.segmentHighlightFunction){RG.segmentHighlightFunction=function(e) {var mouseXY=RG.getMouseXY(e);var angle=RG.getAngleByXY(obj.centerx,obj.centery,mouseXY[0],mouseXY[1]);angle+=RG.HALFPI;if(angle>RG.TWOPI){angle-=RG.TWOPI;} RG.redraw();var start=0;var end=0;var a=(ma.PI*2)/count;var r=obj.radius;(function() {for(i=0;i').css({width:canvas.width+'px',height:canvas.height+'px',cssFloat:canvas.style.cssFloat,left:canvas.style.left,top:canvas.style.top,display:'inline-block'}).get(0);canvas.parentNode.insertBefore(div,canvas);canvas.parentNode.removeChild(canvas);div.appendChild(canvas);canvas.style.position='relative';canvas.style.left=(div.offsetWidth/2)+'px';canvas.style.top=(div.offsetHeight/2)+'px';canvas.style.cssFloat='';canvas.rgraph_wrapper=div;} var div=canvas.rgraph_wrapper;return div;};RG.Effects.Common.fadeIn=function() {var obj=this;var opt=arguments[0]||{};var frames=opt.frames||30;var duration=(frames/60)*1000;var frame=0;var callback=arguments[1]||function(){};obj.canvas.style.opacity=0;RG.redrawCanvas(obj.canvas);for(var i=1;i<=frames;++i){(function(index) {setTimeout(function() {obj.canvas.style.opacity=(index/frames);if(index>=frames){callback(obj);}},(index/frames)*duration);})(i)} return obj;};RG.Effects.Common.fadeOut=function() {var obj=this;var opt=arguments[0]||{};var frames=opt.frames||30;var duration=(frames/60)*1000;var frame=0;var callback=arguments[1]||function(){};for(var i=1;i<=frames;++i){(function(index) {setTimeout(function() {obj.canvas.style.opacity=1-(index/frames);if(index>=frames){callback(obj);}},(index/frames)*duration);})(i)} return this;};RG.Effects.Common.fadeSlideIn=function() {var obj=this,opt=arguments[0]||{},frames=opt.frames||30,frame=0,pc=-20,step=(120-pc)/frames,canvasXY=RG.getCanvasXY(obj.canvas),color=opt.color||'white',callback=arguments[1]||function(){};RG.redrawCanvas(obj.canvas);$('
').css({background:'linear-gradient(135deg, rgba(255,255,255,0) '+pc+'%, '+color+' '+(pc+20)+'%)',width:obj.canvas.width+'px',height:obj.canvas.height+'px',top:canvasXY[1]+'px',left:canvasXY[0]+'px',position:'absolute'}).appendTo($(obj.canvas.parentNode));function iterator() {if(pc<120){$('div#rgraph_fadeslide_cover_'+obj.id).css({background:'linear-gradient(135deg, rgba(255,255,255,0) '+pc+'%, '+color+' '+(pc+20)+'%)'});pc+=step;RG.Effects.updateCanvas(iterator);}else{$('div#rgraph_fadeslide_cover_'+obj.id).remove();callback(obj);}} iterator();};RG.Effects.Common.fadeSlideOut=function() {var obj=this;var opt=arguments[0]||{};var frames=opt.frames||30;var frame=0;var pc=-20;var step=(120-pc)/frames;var canvasXY=RG.getCanvasXY(obj.canvas);var color=opt.color||'white';var callback=arguments[1]||function(){};RG.redrawCanvas(obj.canvas);$('
').css({background:'linear-gradient(135deg, '+color+' '+pc+'%, rgba(255,255,255,0) '+(pc+20)+'%)',width:obj.canvas.width+'px',height:obj.canvas.height+'px',top:canvasXY[1]+'px',left:canvasXY[0]+'px',position:'absolute'}).appendTo($(obj.canvas.parentNode));function iterator() {if(pc<120){$('div#rgraph_fadeslide_cover_'+obj.id).css({background:'linear-gradient(135deg, '+color+' '+pc+'%, rgba(255,255,255,0) '+(pc+20)+'%)'});pc+=step;RG.Effects.updateCanvas(iterator);}else{RG.clear(obj.canvas,obj.get('clearto')) $('div#rgraph_fadeslide_cover_'+obj.id).remove();callback(obj);}} iterator();};RG.Effects.Common.fadeCircularInOutwards=function() {var obj=this;var opt=arguments[0]||{};var frames=opt.frames||120;var frame=0;var radius=0;var canvasXY=RG.getCanvasXY(obj.canvas);var color=opt.color||'white';var callback=arguments[1]||function(){};RG.redrawCanvas(obj.canvas);$('
').css({background:'radial-gradient(rgba(255,255,255,0) 0%, white '+radius+'%)',width:obj.canvas.width+'px',height:obj.canvas.height+'px',top:canvasXY[1],left:canvasXY[0],position:'absolute'}).appendTo($(obj.canvas.parentNode));function iterator() {if(frame').css({background:'radial-gradient(rgba(255,255,255,0) 0%, white 0%)',width:obj.canvas.width+'px',height:obj.canvas.height+'px',top:canvasXY[1],left:canvasXY[0],position:'absolute'}).appendTo($(obj.canvas.parentNode));function iterator() {if(frame').css({background:'radial-gradient(rgba(255,255,255,0) 100%, rgba(255,255,255,0) 0%)',width:obj.canvas.width+'px',height:obj.canvas.height+'px',top:canvasXY[1]+'px',left:canvasXY[0]+'px',position:'absolute'}).appendTo($(obj.canvas.parentNode));function iterator() {if(frame').css({background:'radial-gradient(rgba(255,255,255,0) 0%, rgba(255,255,255,0) 0%)',width:obj.canvas.width+'px',height:obj.canvas.height+'px',top:canvasXY[1],left:canvasXY[0],position:'absolute'}).appendTo($(obj.canvas.parentNode));function iterator() {if(frame0){RG.Effects.updateCanvas(iterator);}else{if(typeof callback==='function'){callback(obj);}}} iterator();}})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.common.key.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.HTML=RGraph.HTML||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math;RG.drawKey=RG.DrawKey=function(obj,key,colors) {if(!key){return;} var ca=obj.canvas,co=obj.context,prop=obj.properties,keypos=prop['chart.key.position'],textsize=prop['chart.text.size'],key_non_null=[],colors_non_null=[];co.lineWidth=1;co.beginPath();if(typeof(prop['chart.key.vpos'])=='number'){obj.Set('chart.key.position.y',prop['chart.key.vpos']*prop['chart.gutter.top']);} for(var i=0;i=0;i--){var j=Number(i)+1;if(typeof prop['chart.key.color.shape']==='object'&&typeof prop['chart.key.color.shape'][i]==='string'){var blob_shape=prop['chart.key.color.shape'][i];}else if(typeof prop['chart.key.color.shape']==='object'&&typeof prop['chart.key.color.shape'][i]==='function'){var blob_shape=prop['chart.key.color.shape'][i];}else if(typeof prop['chart.key.color.shape']==='string'){var blob_shape=prop['chart.key.color.shape'];}else if(typeof prop['chart.key.color.shape']==='function'){var blob_shape=prop['chart.key.color.shape'];}else{var blob_shape='rect';} if(blob_shape=='circle'){co.beginPath();co.fillStyle=colors[i];co.arc(hpos+5+(blob_size/2),vpos+(5*j)+(text_size*j)-text_size+(blob_size/2),blob_size/2,0,6.26,0);co.fill();}else if(blob_shape=='line'){co.beginPath();co.strokeStyle=colors[i];co.moveTo(hpos+5,vpos+(5*j)+(text_size*j)-text_size+(blob_size/2));co.lineTo(hpos+blob_size+5,vpos+(5*j)+(text_size*j)-text_size+(blob_size/2));co.stroke();}else if(blob_shape=='triangle'){co.beginPath();co.strokeStyle=colors[i];co.moveTo(hpos+5,vpos+(5*j)+(text_size*j)-text_size+blob_size);co.lineTo(hpos+(blob_size/2)+5,vpos+(5*j)+(text_size*j)-text_size);co.lineTo(hpos+blob_size+5,vpos+(5*j)+(text_size*j)-text_size+blob_size);co.closePath();co.fillStyle=colors[i];co.fill();}else if(typeof blob_shape==='function'){blob_shape({object:obj,color:colors[i],x:hpos+5,y:vpos+(5*j)+(text_size*j)-text_size,width:text_size,height:text_size+1});}else{co.fillStyle=colors[i];co.fillRect(hpos+5,vpos+(5*j)+(text_size*j)-text_size,text_size,text_size+1);} co.beginPath();co.fillStyle=typeof text_color=='object'?text_color[i]:text_color;ret=RG.text2(obj,{font:text_font,size:text_size,bold:text_bold,italic:text_italic,x:hpos+blob_size+5+5,y:vpos+(5*j)+(text_size*j)+3,text:key[i],accessible:textAccessible});obj.coords.key[i]=[ret.x,ret.y,ret.width,ret.height,key[i],colors[i],obj];} co.fill();} function DrawKey_gutter(obj,key,colors) {var text_size=typeof(prop['chart.key.text.size'])=='number'?prop['chart.key.text.size']:prop['chart.text.size'],text_bold=prop['chart.key.text.bold'],text_italic=prop['chart.key.text.italic'],text_font=prop['chart.key.text.font']||prop['chart.key.font']||prop['chart.text.font'],text_color=prop['chart.key.text.color'],gutterLeft=obj.gutterLeft,gutterRight=obj.gutterRight,gutterTop=obj.gutterTop,gutterBottom=obj.gutterBottom,hpos=((ca.width-gutterLeft-gutterRight)/2)+obj.gutterLeft,vpos=gutterTop-text_size-5,title=prop['chart.title'],blob_size=text_size,hmargin=8,vmargin=4,fillstyle=prop['chart.key.background'],strokestyle='#999',length=0;if(!obj.coords)obj.coords={};obj.coords.key=[];co.font=(obj.properties['chart.key.text.italic']?'italic ':'')+(obj.properties['chart.key.text.bold']?'bold ':'')+text_size+'pt '+text_font;for(i=0;i';for(var i=0;i
 
'+(prop.links&&prop.links[i]?'':'')+''+prop.labels[i]+''+(prop.links&&prop.links[i]?'':'')+'';} div.innerHTML+=(str+'');return doc.getElementById('rgraph_key_'+uid);};})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.common.resizing.js ================================================ RGraph=window.RGraph||{isRGraph:true};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math,active=null;RGraph.allowResizing=RGraph.AllowResizing=function(obj) {var ca=obj.canvas,co=obj.context,pa2=RG.path2;ca.resizing=ca.resizing||{};ca.resizing.placeHolders=ca.resizing.placeHolders||[];if(!ca.resizing.originalw){ca.resizing.originalw=ca.width;} if(!ca.resizing.originalh){ca.resizing.originalh=ca.height;} var resizeHandleSize=15;if(!ca.resizing.__rgraph_original_width__||!ca.resizing.__rgraph_original_height__||!ca.resizing.__adjustX||!ca.resizing.__adjustY){ca.resizing.__rgraph_original_width__=ca.width;ca.resizing.__rgraph_original_height__=ca.height;ca.resizing.adjustX=(typeof obj.get('chart.resize.handle.adjust')=='object'&&typeof obj.get('chart.resize.handle.adjust')[0]=='number'?obj.Get('chart.resize.handle.adjust')[0]:0);ca.resizing.adjustY=(typeof obj.get('chart.resize.handle.adjust')=='object'&&typeof obj.get('chart.resize.handle.adjust')[1]=='number'?obj.Get('chart.resize.handle.adjust')[1]:0);ca.resizing.bgcolor=obj.get('chart.resize.handle.background')||'rgba(0,0,0,0)';} pa2(co,'b m % % r % % % % f %',ca.width-resizeHandleSize-resizeHandleSize+ca.resizing.adjustX,ca.height-resizeHandleSize,ca.width-resizeHandleSize-resizeHandleSize+ca.resizing.adjustX,ca.height-resizeHandleSize+ca.resizing.adjustY,2*resizeHandleSize,resizeHandleSize,ca.resizing.bgcolor);pa2(co,'b lw 1 m % % l % % m % % l % % s gray f transparent',ma.round(ca.width-(resizeHandleSize/2)+ca.resizing.adjustX),ca.height-resizeHandleSize+ca.resizing.adjustY,ma.round(ca.width-(resizeHandleSize/2)+ca.resizing.adjustX),ca.height+ca.resizing.adjustY,ca.width+ca.resizing.adjustX,ma.round(ca.height-(resizeHandleSize/2)+ca.resizing.adjustY),ca.width-resizeHandleSize+ca.resizing.adjustX,ma.round(ca.height-(resizeHandleSize/2)+ca.resizing.adjustY));pa2(co,['b','m',ca.width-(resizeHandleSize/2)+ca.resizing.adjustX,ca.height-resizeHandleSize+ca.resizing.adjustY,'l',ca.width-(resizeHandleSize/2)+3+ca.resizing.adjustX,ca.height-resizeHandleSize+3+ca.resizing.adjustY,'l',ca.width-(resizeHandleSize/2)-3+ca.resizing.adjustX,ca.height-resizeHandleSize+3+ca.resizing.adjustY,'c','f','gray']);pa2(co,['b','m',ca.width-(resizeHandleSize/2)+ca.resizing.adjustX,ca.height+ca.resizing.adjustY,'l',ca.width-(resizeHandleSize/2)+3+ca.resizing.adjustX,ca.height-3+ca.resizing.adjustY,'l',ca.width-(resizeHandleSize/2)-3+ca.resizing.adjustX,ca.height-3+ca.resizing.adjustY,'c','f','gray']);pa2(co,['b','m',ca.width-resizeHandleSize+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)+ca.resizing.adjustY,'l',ca.width-resizeHandleSize+3+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)+3+ca.resizing.adjustY,'l',ca.width-resizeHandleSize+3+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)-3+ca.resizing.adjustY,'c','f','gray']);pa2(co,['b','m',ca.width+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)+ca.resizing.adjustY,'l',ca.width-3+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)+3+ca.resizing.adjustY,'l',ca.width-3+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)-3+ca.resizing.adjustY,'c','f','gray']);pa2(co,['b','m',ca.width+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)+ca.resizing.adjustY,'r',ca.width-(resizeHandleSize/2)-2+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)-2+ca.resizing.adjustY,4,4,'r',ca.width-(resizeHandleSize/2)-2+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)-2+ca.resizing.adjustY,4,4,'s','gray','f','white']);pa2(co,['b','m',ma.round(ca.width-resizeHandleSize-3+ca.resizing.adjustX),ca.height-resizeHandleSize/2+ca.resizing.adjustY,'l',ma.round(ca.width-resizeHandleSize-resizeHandleSize+ca.resizing.adjustX),ca.height-(resizeHandleSize/2)+ca.resizing.adjustY,'l',ca.width-resizeHandleSize-resizeHandleSize+2+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)-2+ca.resizing.adjustY,'l',ca.width-resizeHandleSize-resizeHandleSize+2+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)+2+ca.resizing.adjustY,'l',ca.width-resizeHandleSize-resizeHandleSize+ca.resizing.adjustX,ca.height-(resizeHandleSize/2)+ca.resizing.adjustY,'s','gray','f','gray']);pa2(co,['b','m',ma.round(ca.width-resizeHandleSize-resizeHandleSize-1+ca.resizing.adjustX),ca.height-(resizeHandleSize/2)-3+ca.resizing.adjustY,'l',ma.round(ca.width-resizeHandleSize-resizeHandleSize-1+ca.resizing.adjustX),ca.height-(resizeHandleSize/2)+3+ca.resizing.adjustY,'s','f']);if(obj.get('chart.resizable')&&!ca.rgraphResizewrapper){ca.rgraphResizewrapper=$('
').css({'float':ca.style.cssFloat,position:'relative'}).get(0);$(ca).wrap(ca.rgraphResizewrapper);ca.style.cssFloat='none';ca.style.top=0;ca.style.left=0;var window_onmousemove=function(e) {var ca=active,obj=ca?ca.__object__:null;if(ca){e=RG.fixEventObject(e);if(ca.resizing.mousedown){var newWidth=ca.width+(e.pageX-ca.resizing.originalx),newHeight=ca.height+(e.pageY-ca.resizing.originaly),minWidth=obj.get('resizableMinwidth'),minHeight=obj.get('resizableMinheight');if(newWidth>(ca.resizing.originalw/2)&&(typeof obj.get('resizableMaxwidth')==='number'?newWidthminWidth:true)){ca.resizing.div.style.width=newWidth+'px';} if(newHeight>(ca.resizing.originalh/2)&&(typeof obj.get('resizableMaxheight')==='number'?newHeightminHeight:true)){ca.resizing.div.style.height=newHeight+'px';} RG.fireCustomEvent(ca.__object__,'onresize');}}} if(typeof ca.rgraph_resize_window_mousemove_listener_installed!='boolean'){window.addEventListener('mousemove',window_onmousemove,false);ca.rgraph_resize_window_mousemove_listener_installed=true;} var MouseupFunc=function(e) {if(!ca.resizing||!ca.resizing.div||!ca.resizing.mousedown){return;} if(ca.resizing.div){var div=ca.resizing.div;var coords=RG.getCanvasXY(ca);var parentNode=ca.parentNode;if(ca.style.position!='absolute'){var placeHolderDIV=document.createElement('DIV');placeHolderDIV.style.width=ca.resizing.originalw+'px';placeHolderDIV.style.height=ca.resizing.originalh+'px';placeHolderDIV.style.display='inline-block';placeHolderDIV.style.position=ca.style.position;placeHolderDIV.style.left=ca.style.left;placeHolderDIV.style.top=ca.style.top;placeHolderDIV.style.cssFloat=ca.style.cssFloat;parentNode.insertBefore(placeHolderDIV,ca);} ca.style.backgroundColor='white';ca.style.position='absolute';ca.style.border='1px dashed gray';ca.style.boxShadow='2px 2px 5px #ddd';ca.style.left=0;ca.style.top=0;ca.width=parseInt(div.style.width);ca.height=parseInt(div.style.height);ca.getContext('2d').translate(0.5,0.5);var objects=RG.ObjectRegistry.getObjectsByCanvasID(ca.id);for(var i=0,len=objects.length;i(ca.width-resizeHandleSize)&&coords[0](ca.height-resizeHandleSize)&&coords[1](ca.width-resizeHandleSize-resizeHandleSize)&&coords[0](ca.height-resizeHandleSize)&&coords[1](ca.width-resizeHandleSize)&&coords[0](ca.height-resizeHandleSize)&&coords[1](ca.width-resizeHandleSize-resizeHandleSize)&&coords[0](ca.height-resizeHandleSize)&&coords[1]=0;i--){if(arr[i]||content){out.push(arr[i]);content=true;}} arr=out.reverse();return out;};})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.common.tooltips.js ================================================ RGraph=window.RGraph||{isRGraph:true};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math;RG.tooltips={};RG.tooltips.style={display:'inline-block',position:'absolute',padding:'6px',fontFamily:'Arial',fontSize:'10pt',fontWeight:'normal',textAlign:'center',left:0,top:0,backgroundColor:'rgb(255,255,239)',color:'black',visibility:'visible',zIndex:3,borderRadius:'5px',boxShadow:'rgba(96,96,96,0.5) 0 0 5px',opacity:0,lineHeight:'initial'};RG.tooltip=RG.Tooltip=function(obj,text,x,y,idx,e) {if(RG.trim(text).length===0){return;} RG.fireCustomEvent(obj,'onbeforetooltip');if(typeof(obj.get('chart.tooltips.override'))=='function'){return obj.get('chart.tooltips.override')(obj,text,x,y,idx);} var originalX=x;var originalY=y;text=RG.getTooltipTextFromDIV(text);var timers=RG.Registry.Get('chart.tooltip.timers');if(timers&&timers.length){for(i=0;i=obj.data[ds].length){idx-=obj.data[ds].length;}else{break;}} tooltipObj.__dataset__=ds;tooltipObj.__index2__=idx;} document.body.appendChild(tooltipObj);var width=tooltipObj.offsetWidth;var height=tooltipObj.offsetHeight;tooltipObj.style.width=width+'px';var mouseXY=RG.getMouseXY(e);var canvasXY=RG.getCanvasXY(obj.canvas);tooltipObj.style.left=e.pageX-(parseFloat(tooltipObj.style.paddingLeft)+(width/2))+'px';tooltipObj.style.top=e.pageY-height-10+'px';if(parseFloat(tooltipObj.style.left)<=5){tooltipObj.style.left='5px';} if(parseFloat(tooltipObj.style.left)+parseFloat(tooltipObj.style.width)>window.innerWidth){tooltipObj.style.left='' tooltipObj.style.right='5px'} if(RG.isFixed(obj.canvas)){var scrollTop=window.scrollY||document.documentElement.scrollTop;tooltipObj.style.position='fixed';tooltipObj.style.top=e.pageY-scrollTop-height-10+'px';} if(obj.get('chart.tooltips.effect')==='fade'){for(var i=1;i<=10;++i){(function(index) {setTimeout(function() {tooltipObj.style.opacity=index/10;},index*25);})(i);}}else{tooltipObj.style.opacity=1;} tooltipObj.onmousedown=function(e){e.stopPropagation();} tooltipObj.onmouseup=function(e){e.stopPropagation();} tooltipObj.onclick=function(e){if(e.button==0){e.stopPropagation();}} RG.Registry.Set('chart.tooltip',tooltipObj);RG.fireCustomEvent(obj,'ontooltip');};RG.getTooltipTextFromDIV=function(text) {var result=/^id:(.*)/.exec(text);if(result&&result[1]&&document.getElementById(result[1])){text=document.getElementById(result[1]).innerHTML;}else if(result&&result[1]){text='';} return text;};RG.getTooltipWidth=function(text,obj) {var div=document.createElement('DIV');div.className=obj.Get('chart.tooltips.css.class');div.style.paddingLeft=RG.tooltips.padding;div.style.paddingRight=RG.tooltips.padding;div.style.fontFamily=RG.tooltips.font_face;div.style.fontSize=RG.tooltips.font_size;div.style.visibility='hidden';div.style.position='absolute';div.style.top='300px';div.style.left=0;div.style.display='inline';div.innerHTML=RG.getTooltipTextFromDIV(text);document.body.appendChild(div);return div.offsetWidth;};RG.hideTooltip=RG.HideTooltip=function() {var tooltip=RG.Registry.Get('chart.tooltip');var uid=arguments[0]&&arguments[0].uid?arguments[0].uid:null;if(tooltip&&tooltip.parentNode&&(!uid||uid==tooltip.__canvas__.uid)){tooltip.parentNode.removeChild(tooltip);tooltip.style.display='none';tooltip.style.visibility='hidden';RG.Registry.Set('chart.tooltip',null);}};RG.preLoadTooltipImages=RG.PreLoadTooltipImages=function(obj) {var tooltips=obj.Get('chart.tooltips');if(RG.hasTooltips(obj)){if(obj.type=='rscatter'){tooltips=[];for(var i=0;ithis.max)this.value[i]=max;if(this.value[i]this.max)this.value=max;if(this.valueRG.TWOPI&&angle<(RG.PI+RG.HALFPI)){return null;} var value=((angle-(RG.PI+RG.HALFPI))/(RG.TWOPI-(RG.PI+RG.HALFPI)))*(this.max-this.min);value=value+this.min;if(valuethis.max){value=this.max} if(mouseX>this.centerx&&mouseY>this.centery){value=this.max;} return value;};this.getObjectByXY=function(e) {var mouseXY=RGraph.getMouseXY(e);if(mouseXY[0]>(this.centerx-5)&&mouseXY[0]<(this.centerx+this.radius)&&mouseXY[1]>(this.centery-this.radius)&&mouseXY[1]<(this.centery+5)&&RG.getHypLength(this.centerx,this.centery,mouseXY[0],mouseXY[1])<=this.radius){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){this.value=this.getValue(e);RG.Clear(ca);RG.RedrawCanvas(ca);RG.FireCustomEvent(this,'onadjust');}};this.getAngle=function(value) {if(valuethis.max){return null;} var angle=((value-this.min)/(this.max-this.min))*RG.HALFPI angle+=(RG.PI+RG.HALFPI);return angle;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors.ranges']=RG.array_clone(prop['chart.colors.ranges']);this.original_colors['chart.green.color']=RG.array_clone(prop['chart.green.color']);this.original_colors['chart.yellow.color']=RG.array_clone(prop['chart.yellow.color']);this.original_colors['chart.red.color']=RG.array_clone(prop['chart.red.color']);} if(!RG.is_null(prop['chart.colors.ranges'])){for(var i=0;iobj.max)obj.value=obj.max;if(obj.valuemax)obj.value[i]=max;if(obj.value[i]=this.gutterLeft&&mouseX<=(ca.width-this.gutterRight)&&mouseY>=this.gutterTop&&mouseY<=(ca.height-this.gutterBottom)){var tooltip=prop['chart.tooltips']?prop['chart.tooltips'][0]:null return{0:this,1:0,2:tooltip,'object':this,'index':0,'tooltip':tooltip};} return null;};this.highlight=this.Highlight=function(shape) {if(prop['chart.tooltips.highlight']){if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{pa2(co,'b r % % % % f % s %',prop['chart.gutter.left'],prop['chart.gutter.top'],ca.width-prop['chart.gutter.left']-prop['chart.gutter.right'],ca.height-prop['chart.gutter.top']-prop['chart.gutter.bottom'],prop['chart.highlight.fill'],prop['chart.highlight.stroke']);}}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.background.grid.color']=RG.arrayClone(prop['chart.background.grid.color']);this.original_colors['chart.strokestyle']=RG.arrayClone(prop['chart.strokestyle']);this.original_colors['chart.highlight.stroke']=RG.arrayClone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.arrayClone(prop['chart.highlight.fill']);} prop['chart.background.grid.color']=this.parseSingleColorForGradient(prop['chart.background.grid.color']);prop['chart.strokestyle']=this.parseSingleColorForGradient(prop['chart.strokestyle']);prop['chart.highlight.stroke']=this.parseSingleColorForGradient(prop['chart.highlight.stroke']);prop['chart.highlight.fill']=this.parseSingleColorForGradient(prop['chart.highlight.fill']);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':'),grad=co.createLinearGradient(this.gutterLeft,this.gutterTop,ca.width-this.gutterRight,ca.height-this.gutterRight),diff=1/(parts.length-1);for(var j=0;jborderRadius&&(prop['chart.height']/2)>borderRadius){borderRadius=ma.min((prop['chart.width']/2),(prop['chart.height']/2))} if(prop['chart.border.radius']=this.coords[0][0]&&mouseXY[0]<=(this.coords[0][0]+this.coords[0][2])&&mouseXY[1]>=this.coords[0][1]&&mouseXY[1]<=(this.coords[0][1]+this.coords[0][3])){return{0:this,1:this.coords[0][0],2:this.coords[0][1],3:this.coords[0][2],4:this.coords[0][3],5:0,'object':this,'x':this.coords[0][0],'y':this.coords[0][1],'width':this.coords[0][2],'height':this.coords[0][3],'index':0,'tooltip':prop['chart.tooltips']?prop['chart.tooltips'][0]:null};} return null;};this.highlight=this.Highlight=function(shape) {if(prop['chart.tooltips.highlight']){if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{pa2(co,['b','r',this.coords[0][0],this.coords[0][1],this.coords[0][2],this.coords[0][3],'f',prop['chart.highlight.fill'],'s',prop['chart.highlight.stroke']]);}}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);} prop['chart.highlight.stroke']=this.parseSingleColorForGradient(prop['chart.highlight.stroke']);prop['chart.highlight.fill']=this.parseSingleColorForGradient(prop['chart.highlight.fill']);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':'),grad=co.createLinearGradient(this.x,this.y,this.x+this.img.width,this.y),diff=1/(parts.length-1);grad.addColorStop(0,RG.trim(parts[0]));for(var j=1;j=ca.width){this.alignRight=true;} if(!this.colorsParsed){this.parseColors();this.colorsParsed=true;} var x=this.alignRight?this.x-this.metrics[0]-6:this.x,y=this.y-6-prop['chart.voffset']-this.metrics[1],width=this.metrics[0]+6,height=this.metrics[1]+6;this.coords[0]=[x,y,width,height];this.coordsText=[];co.lineWidth=prop['chart.linewidth'];if(prop['chart.shadow']){RG.setShadow(this,prop['chart.shadow.color'],prop['chart.shadow.offsetx'],prop['chart.shadow.offsety'],prop['chart.shadow.blur']);} co.strokeStyle=prop['chart.strokestyle'];co.fillStyle=prop['chart.fillstyle'];co.strokeRect(x+(this.alignRight?width:0),y,0,height+prop['chart.voffset']-6);co.strokeRect(x,y,width,height);co.fillRect(x,y,width,height);RG.noShadow(this);co.fillStyle=prop['chart.text.color'];RG.text2(this,{font:prop['chart.text.font'],size:prop['chart.text.size'],x:ma.round(this.x)-(this.alignRight?this.metrics[0]+3:-3),y:this.y-3-prop['chart.voffset'],text:this.text,valign:'bottom',halign:'left',tag:'labels'});this.coords[0].push([x,y,width,height]);RG.noShadow(this);co.textBaseline='alphabetic';RG.installEventListeners(this);if(this.firstDraw){this.firstDraw=false;RG.fireCustomEvent(this,'onfirstdraw');this.firstDrawFunc();} RG.fireCustomEvent(this,'ondraw');return this;};this.exec=function(func) {func(this);return this;};this.getObjectByXY=function(e) {if(this.getShape(e)){return this;}};this.getShape=function(e) {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1];if(mouseX>=this.coords[0][0]&&mouseX<=(this.coords[0][0]+this.coords[0][2])){if(mouseY>=this.coords[0][1]&&mouseY<=(this.coords[0][1]+this.coords[0][3])){return{0:this,1:this.coords[0][0],2:this.coords[0][1],3:this.coords[0][2],4:this.coords[0][3],5:0,'object':this,'x':this.coords[0][0],'y':this.coords[0][1],'width':this.coords[0][2],'height':this.coords[0][3],'index':0,'tooltip':prop['chart.tooltips']?prop['chart.tooltips'][0]:null};}} return null;};this.highlight=this.Highlight=function(shape) {if(prop['chart.tooltips.highlight']){if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{pa2(co,['b','r',this.coords[0][0],this.coords[0][1],this.coords[0][2],this.coords[0][3],'f',prop['chart.highlight.fill'],'s',prop['chart.highlight.stroke']]);}}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.fillstyle']=RG.array_clone(prop['chart.fillstyle']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.text.color']=RG.array_clone(prop['chart.text.color']);} prop['chart.fillstyle']=this.parseSingleColorForGradient(prop['chart.fillstyle']);prop['chart.strokestyle']=this.parseSingleColorForGradient(prop['chart.strokestyle']);prop['chart.highlight.stroke']=this.parseSingleColorForGradient(prop['chart.highlight.stroke']);prop['chart.highlight.fill']=this.parseSingleColorForGradient(prop['chart.highlight.fill']);prop['chart.text.color']=this.parseSingleColorForGradient(prop['chart.text.color']);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':'),grad=co.createLinearGradient(this.x,this.y,this.x+this.metrics[0],this.y),diff=1/(parts.length-1);grad.addColorStop(0,RG.trim(parts[0]));for(var j=1;j=this.radius){this.actualRadius=0;this.alpha=1;} if(!this.TIMER){var obj=this;setInterval(function() {RG.redrawCanvas(ca);},prop['chart.delay']);this.TIMER=true;} RG.installEventListeners(this);if(this.firstDraw){this.firstDraw=false;RG.fireCustomEvent(this,'onfirstdraw');this.firstDrawFunc();} RG.fireCustomEvent(this,'ondraw');return this;};this.exec=function(func) {func(this);return this;};this.getObjectByXY=function(e) {if(this.getShape(e)){return this;}};this.getShape=function(e) {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1];if(RG.getHypLength(this.centerx,this.centery,mouseXY[0],mouseXY[1])<=this.radius){return{0:this,1:this.centerx,2:this.centery,3:this.radius,4:null,5:0,'object':this,'x':this.centerx,'y':this.centery,'radius':this.radius,'index':0,'tooltip':prop['chart.tooltips']?prop['chart.tooltips'][0]:null};} return null;};this.highlight=this.Highlight=function(shape) {if(prop['chart.tooltips.highlight']){if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{pa2(co,['b','r',this.coords[0][0],this.coords[0][1],this.coords[0][2],this.coords[0][3],'f',prop['chart.highlight.fill'],'s',prop['chart.highlight.stroke']]);}}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.fillstyle']=RG.arrayClone(prop['chart.fillstyle']);this.original_colors['chart.highlight.fill']=RG.arrayClone(prop['chart.highlight.fill']);} prop['chart.fillstyle']=this.parseSingleColorForGradient(prop['chart.fillstyle']);prop['chart.highlight.fill']=this.parseSingleColorForGradient(prop['chart.highlight.fill']);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':'),grad=co.createRadialGradient(this.centerx,this.centery,0,this.centerx,this.centery,this.radius),diff=1/(parts.length-1);for(var j=0;j=left&&mouseX<=(left+width)&&mouseY>=top&&mouseY<=(top+height)){return{0:this,1:left,2:top,3:width,4:height,5:0,'object':this,'x':left,'y':top,'width':width,'height':height,'index':0,'tooltip':prop['chart.tooltips']?prop['chart.tooltips'][0]:null};}} return null;};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{RG.Highlight.rect(this,shape);}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.fillstyle']=RG.array_clone(prop['chart.fillstyle']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);} prop['chart.fillstyle']=this.parseSingleColorForGradient(prop['chart.fillstyle']);prop['chart.strokestyle']=this.parseSingleColorForGradient(prop['chart.strokestyle']);prop['chart.highlight.stroke']=this.parseSingleColorForGradient(prop['chart.highlight.stroke']);prop['chart.highlight.fill']=this.parseSingleColorForGradient(prop['chart.highlight.fill']);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':'),grad=co.createLinearGradient(0,0,ca.width,0),diff=1/(parts.length-1);grad.addColorStop(0,RG.trim(parts[0]));for(var j=1,len=parts.length;j=left&&mouseX<=(left+width)&&mouseY>=top&&mouseY<=(top+height)){return{0:this,1:left,2:top,3:width,4:height,5:0,'object':this,'x':left,'y':top,'width':width,'height':height,'index':0,'tooltip':prop['chart.tooltips']?prop['chart.tooltips'][0]:null};}} return null;};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{RG.Highlight.Rect(this,shape);}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors'])[0];this.original_colors['chart.fillstyle']=RG.array_clone(prop['chart.fillstyle']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);} prop['chart.colors'][0]=this.parseSingleColorForGradient(prop['chart.colors'][0]);prop['chart.fillstyle']=this.parseSingleColorForGradient(prop['chart.fillstyle']);prop['chart.strokestyle']=this.parseSingleColorForGradient(prop['chart.strokestyle']);prop['chart.highlight.stroke']=this.parseSingleColorForGradient(prop['chart.highlight.stroke']);prop['chart.highlight.fill']=this.parseSingleColorForGradient(prop['chart.highlight.fill']);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':');var grad=co.createLinearGradient(0,0,ca.width,0);var diff=1/(parts.length-1);grad.addColorStop(0,RGraph.trim(parts[0]));for(var j=1,len=parts.length;j=this.gutterLeft&&mouseX<=(ca.width-this.gutterRight)&&mouseY>=this.y-(prop['chart.align']=='top'?(prop['chart.text.size']*1.5)+5:0)&&mouseY<=(this.y+(prop['chart.align']=='top'?0:(prop['chart.text.size']*1.5)+5))){var x=this.gutterLeft;var y=this.y;var w=ca.width-this.gutterLeft-this.gutterRight;var h=15;return{0:this,1:x,2:y,3:w,4:h,5:0,'object':this,'x':x,'y':y,'width':w,'height':h,'index':0,'tooltip':prop['chart.tooltips']?prop['chart.tooltips'][0]:null};} return null;};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);} prop['chart.colors'][0]=this.parseSingleColorForGradient(prop['chart.colors'][0]);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':');var grad=co.createLinearGradient(prop['chart.gutter.left'],0,ca.width-prop['chart.gutter.right'],0);var diff=1/(parts.length-1);grad.addColorStop(0,RG.trim(parts[0]));for(var j=1,len=parts.length;j=this.x-(prop['chart.align']=='right'?0:this.getWidth())&&mouseX<=this.x+(prop['chart.align']=='right'?this.getWidth():0)&&mouseY>=this.gutterTop&&mouseY<=(ca.height-this.gutterBottom)){var x=this.x;var y=this.gutterTop;var w=15;;var h=ca.height-this.gutterTop-this.gutterBottom;return{0:this,1:x,2:y,3:w,4:h,5:0,'object':this,'x':x,'y':y,'width':w,'height':h,'index':0,'tooltip':prop['chart.tooltips']?prop['chart.tooltips'][0]:null};} return null;};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);} prop['chart.colors'][0]=this.parseSingleColorForGradient(prop['chart.colors'][0]);};this.reset=function() {};this.parseSingleColorForGradient=function(color) {if(!color){return color;} if(typeof color==='string'&&color.match(/^gradient\((.*)\)$/i)){if(color.match(/^gradient\(({.*})\)$/i)){return RGraph.parseJSONGradient({object:this,def:RegExp.$1});} var parts=RegExp.$1.split(':');var grad=co.createLinearGradient(0,prop['chart.gutter.top'],0,ca.height-this.gutterBottom);var diff=1/(parts.length-1);grad.addColorStop(0,RG.trim(parts[0]));for(var j=1;j0?(height/(len-1)):0;if(xaxispos=='center'){gap/=2;} RG.text2(this,{'font':font,'size':size,'x':x-(align=='right'?-5:5),'y':(i*gap)+this.gutterTop,'text':labels_specific[i],'valign':'center','halign':align=='right'?'left':'right','tag':'scale'});this.maxLabelLength=ma.max(this.maxLabelLength,co.measureText(labels_specific[i]).width);} if(xaxispos=='center'){for(var i=(labels_specific.length-2);i>=0;--i){RG.text2(this,{'font':font,'size':size,'x':x-(align=='right'?-5:5),'y':ca.height-this.gutterBottom-(i*gap),'text':labels_specific[i],'valign':'center','halign':align=='right'?'left':'right','tag':'scale'});}}}else{for(var i=0;i<=numlabels;++i){var original=((max-min)*((numlabels-i)/numlabels))+min;if(original==0&&prop['chart.scale.zerostart']==false){continue;} var text=RG.numberFormat(this,original.toFixed(original===0?0:decimals),units_pre,units_post);var text=String(typeof(formatter)=='function'?formatter(this,original):text);var text_len=ma.max(text_len,co.measureText(text).width);this.maxLabelLength=text_len;if(invert){var y=height-((height/numlabels)*i);}else{var y=(height/numlabels)*i;} if(prop['chart.xaxispos']=='center'){y=y/2;} text=text.replace(/^-,([0-9])/,'-$1');RG.text2(this,{'font':font,'size':size,'x':x-(align=='right'?-5:5),'y':y+this.gutterTop,'text':text,'valign':'center','halign':align=='right'?'left':'right','tag':'scale'});if(prop['chart.xaxispos']=='center'&&ithis.max)this.value=this.max;if(this.value0){grad=co.createLinearGradient(cx+10,cy-10,cx-10,cy+10);grad.addColorStop(1,'#666');grad.addColorStop(0.5,'#ccc');} co.beginPath();co.fillStyle=grad;co.moveTo(this.centerx,this.centery);co.arc(this.centerx,this.centery,20,0,RG.TWOPI,0);co.fill();};this.drawScale=this.DrawScale=function() {var a,x,y;co.beginPath();co.strokeStyle='black';co.fillStyle='white';co.arc(this.centerx,this.centery,this.radius,this.angles.start,this.angles.end,false);co.arc(this.centerx,this.centery,this.radius-10,this.angles.end,this.angles.start,true);co.closePath();co.stroke();co.fill();var start=this.angles.start;var end=this.angles.needle;co.beginPath();co.fillStyle=prop['chart.colors'][0];co.arc(this.centerx,this.centery,this.radius,start,end,false);co.arc(this.centerx,this.centery,this.radius-10,end,start,true);co.closePath();co.fill();for(a=this.angles.start;a<=this.angles.end+0.01;a+=((this.angles.end-this.angles.start)/5)){co.beginPath();co.arc(this.centerx,this.centery,this.radius-10,a,a+0.0001,false);co.arc(this.centerx,this.centery,this.radius-15,a+0.0001,a,true);co.stroke();} if(prop['chart.scale.visible']){co.fillStyle=prop['chart.text.color'];var numLabels=prop['chart.labels.count'];var decimals=prop['chart.scale.decimals'];var font=prop['chart.text.font'];var size=prop['chart.text.size'];var units_post=prop['chart.units.post'];var units_pre=prop['chart.units.pre'];for(var i=0;i<=numLabels;++i){a=((this.angles.end-this.angles.start)*(i/numLabels))+this.angles.start;y=this.centery-Math.sin(a-RG.PI)*(this.radius-25);x=this.centerx-Math.cos(a-RG.PI)*(this.radius-25);RG.Text2(this,{'font':font,'size':size,'x':x,'y':y,'text':RG.number_format(this,(this.min+((this.max-this.min)*(i/numLabels))).toFixed(decimals),units_pre,units_post),'halign':'center','valign':'center','tag':'scale'});}}};this.getShape=function(e){};this.getValue=function(e) {var mouseXY=RG.getMouseXY(e);var angle=RG.getAngleByXY(this.centerx,this.centery,mouseXY[0],mouseXY[1]);if(angle>=this.angles.end){return this.max;}else if(angle<=this.angles.start){return this.min;} var value=(angle-this.angles.start)/(this.angles.end-this.angles.start);value=value*(this.max-this.min);value=value+this.min;return value;};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);var angle=RG.getAngleByXY(this.centerx,this.centery,mouseXY[0],mouseXY[1]);var accuracy=15;var leftMin=this.centerx-this.radius;var rightMax=this.centerx+this.radius;var topMin=this.centery-this.radius;var bottomMax=this.centery+this.radius;if(mouseXY[0]>leftMin&&mouseXY[0]topMin&&mouseXY[1]this.max){return null;} var angle=(((value-this.min)/(this.max-this.min))*(this.angles.end-this.angles.start))+this.angles.start;return angle;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.needle.color']=RG.array_clone(prop['chart.needle.color']);} var props=this.properties;var colors=props['chart.colors'];for(var i=0;iobj.max)obj.value=obj.max;if(obj.value0){var font=prop['chart.text.font'];var size=prop['chart.text.size'];var color=prop['chart.text.color'];var labels=prop['chart.labels'];var halign=prop['chart.text.halign']=='left'?'left':'center';var bgcolor=prop['chart.text.boxed']?'white':null;if(typeof prop['chart.labels.x']=='number'){var x=prop['chart.labels.x'];}else{var x=halign=='left'?(this.gutterLeft-15):((ca.width-this.gutterLeft-this.gutterRight)/2)+this.gutterLeft;} for(var j=0;jprop['chart.gutter.left']&&mouseXY[0]<(ca.width-prop['chart.gutter.right'])&&mouseXY[1]>prop['chart.gutter.top']&&mouseXY[1]<(ca.height-prop['chart.gutter.bottom'])){return this;}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.key.colors']=RG.array_clone(prop['chart.key.colors']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);} var colors=prop['chart.colors'];for(var i=0;iprop['chart.xmax']){prop['chart.vbars'][i][1]=364-prop['chart.vbars'][i][0];} var barX=this.gutterLeft+(((prop['chart.vbars'][i][0]-prop['chart.xmin'])/(prop['chart.xmax']-prop['chart.xmin']))*this.graphArea),barY=this.gutterTop,width=(this.graphArea/(prop['chart.xmax']-prop['chart.xmin']))*prop['chart.vbars'][i][1],height=ca.height-this.gutterTop-this.gutterBottom;if((barX+width)>(ca.width-this.gutterRight)){width=ca.width-this.gutterRight-barX;} co.fillStyle=prop['chart.vbars'][i][2];co.fillRect(barX,barY,width,height);}} if(prop['chart.hbars']){for(i=0,len=prop['chart.hbars'].length;i=left&&mouseX<=(left+width)&&mouseY>=top&&mouseY<=(top+height)){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],i);var ret={0:this,object:this,1:left,x:left,2:top,y:top,3:width,width:width,4:height,height:height,5:i,index:this.coords[i][4].index,subindex:(this.coords[i][4]&&typeof this.coords[i][4].subindex==='number'?this.coords[i][4].subindex:null),sequentialIndex:this.coords[i][5],tooltip:tooltip};return ret;}}};this.drawSingleEvent=this.DrawSingleEvent=function(ev,index,sequentialIndex) {ev.index=index;if(typeof arguments[3]==='number'){ev.subindex=arguments[3]} var min=prop['chart.xmin'];co.beginPath();co.strokeStyle='black';co.fillStyle=ev.color?ev.color:prop['chart.defaultcolor'];var barStartX=this.gutterLeft+(((ev.start-min)/(prop['chart.xmax']-min))*this.graphArea),barStartY=this.gutterTop+(index*this.barHeight),barWidth=(ev.duration/(prop['chart.xmax']-min))*this.graphArea;if((barStartX+barWidth)>(ca.width-this.gutterRight)){barWidth=ca.width-this.gutterRight-barStartX;} this.coords.push([barStartX,barStartY+prop['chart.vmargin'],barWidth,this.barHeight-(2*prop['chart.vmargin']),ev,sequentialIndex,]);if(prop['chart.borders']||typeof ev.border==='number'){co.strokeStyle=typeof(ev.border)==='string'?ev.border:'black';co.lineWidth=(typeof(ev.linewidth)==='number'?ev.linewidth:1);if(ev.linewidth!==0){co.strokeRect(barStartX,barStartY+prop['chart.vmargin'],barWidth,this.barHeight-(2*prop['chart.vmargin']));}} if(RG.isNull(ev.complete)){co.fillStyle=ev.color?ev.color:prop['chart.defaultcolor'];}else{co.fillStyle=ev.background?ev.background:prop['chart.defaultcolor'];} co.fillRect(barStartX,barStartY+prop['chart.vmargin'],barWidth,this.barHeight-(2*prop['chart.vmargin']));var complete=(ev.complete/100)*barWidth;if(typeof(ev.complete)==='number'){co.fillStyle=ev.color?ev.color:'#0c0';co.fillRect(barStartX,barStartY+prop['chart.vmargin'],(ev.complete/100)*barWidth,this.barHeight-(2*prop['chart.vmargin']));if(prop['chart.labels.percent']){co.beginPath();co.fillStyle=prop['chart.text.color'];RG.text2(this,{font:prop['chart.text.font'],size:prop['chart.text.size'],x:barStartX+barWidth+5,y:barStartY+this.halfBarHeight,text:String(ev.complete)+'%',valign:'center',tag:'labels.complete'});}} if(prop['chart.labels.inbar']&&prop['chart.labels.inbar'][sequentialIndex]){var label=String(prop['chart.labels.inbar'][sequentialIndex]),halign=prop['chart.labels.inbar.align']=='left'?'left':'center';halign=prop['chart.labels.inbar.align']=='right'?'right':halign;if(halign=='right'){var x=(barStartX+barWidth)-5;}else if(halign=='center'){var x=barStartX+(barWidth/2);}else{var x=barStartX+5;} if(prop['chart.labels.inbar.above']){x=barStartX+barWidth+5;halign='left';} co.fillStyle=prop['chart.labels.inbar.color'];RG.text2(this,{font:prop['chart.labels.inbar.font'],size:prop['chart.labels.inbar.size'],x:x,y:barStartY+this.halfBarHeight,text:label,valign:'center',halign:halign,bounding:typeof(prop['chart.labels.inbar.bgcolor'])=='string',boundingFill:typeof(prop['chart.labels.inbar.bgcolor'])=='string'?prop['chart.labels.inbar.bgcolor']:null,tag:'labels.inbar'});}};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{RG.Highlight.Rect(this,shape);}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if(mouseXY[0]>this.gutterLeft&&mouseXY[0]<(ca.width-this.gutterRight)&&mouseXY[1]>this.gutterTop&&mouseXY[1]<(ca.height-this.gutterBottom)){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){var bar=RG.Registry.get('chart.adjusting.gantt');if(bar){var mouseXY=RG.getMouseXY(e),obj=RG.Registry.get('chart.adjusting.gantt')['object'],index=bar['index'],subindex=bar['subindex'],diff=((mouseXY[0]-RG.Registry.get('chart.adjusting.gantt')['mousex'])/(ca.width-obj.gutterLeft-obj.gutterRight))*prop['chart.xmax'],eventStart=RG.Registry.get('chart.adjusting.gantt')['event_start'],duration=RG.Registry.get('chart.adjusting.gantt')['event_duration'],event=typeof subindex==='number'?obj.data[index][subindex]:obj.data[index] if(bar['mode']==='move'){diff=ma.round(diff);if(RG.isNull(subindex)){event.start=eventStart+diff;if(eventStart+diff<0){obj.data[index].start=0;}else if((eventStart+diff+obj.data[index].duration)>prop['chart.xmax']){obj.data[index].start=prop['chart.xmax']-obj.data[index].duration;}}else{var index=RG.Registry.get('chart.adjusting.gantt').index,subindex=RG.Registry.get('chart.adjusting.gantt').subindex,event=this.data[index][subindex];event.start=eventStart+diff;if((eventStart+diff)<0){event.start=0;}else if((eventStart+diff+event.duration)>prop['chart.xmax']){event.start=prop['chart.xmax']-event.duration;}}}else if(bar['mode']=='resize'){if(mouseXY[0]>(ca.width-obj.gutterRight)){mouseXY[0]=ca.width-obj.gutterRight;} var diff=((mouseXY[0]-RG.Registry.get('chart.adjusting.gantt')['mousex'])/(ca.width-obj.gutterLeft-obj.gutterRight))*prop['chart.xmax'];diff=ma.round(diff);if(RG.isNull(subindex)){obj.data[index].duration=duration+diff;if(obj.data[index].duration<0){obj.data[index].duration=1;}}else{obj.data[index][subindex].duration=duration+diff;if(obj.data[index][subindex].duration<0){obj.data[index][subindex].duration=1;}}} RG.resetColorsToOriginalValues(this);RG.redrawCanvas(ca);RG.fireCustomEvent(obj,'onadjust');}}};this.getXCoord=function(value) {var min=prop['chart.xmin'],max=prop['chart.xmax'],graphArea=ca.width-this.gutterLeft-this.gutterRight;if(value>max||valueprop['chart.xmax']){value=null;} return value;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['data']=RG.arrayClone(this.data);this.original_colors['chart.background.barcolor1']=RG.arrayClone(prop['chart.background.barcolor1']);this.original_colors['chart.background.barcolor2']=RG.arrayClone(prop['chart.background.barcolor2']);this.original_colors['chart.background.grid.color']=RG.arrayClone(prop['chart.background.grid.color']);this.original_colors['chart.defaultcolor']=RG.arrayClone(prop['chart.defaultcolor']);this.original_colors['chart.highlight.stroke']=RG.arrayClone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.arrayClone(prop['chart.highlight.fill']);} for(var i=0,sequentialIndex=0;iprop['chart.xmax']?prop['chart.xmax']:(opts.start+opts.duration);var grad=co.createLinearGradient(typeof opts.start==='number'?this.getXCoord(opts.start):this.gutterLeft,0,typeof opts.start==='number'?this.getXCoord(value):ca.width-this.gutterRight,0);var diff=1/(parts.length-1);grad.addColorStop(0,RG.trim(parts[0]));for(var j=1;jthis.max)this.value[i]=max;if(this.value[i]this.max)this.value=max;if(this.valuethis.startAngle&&athis.centerx?'right':'left';var vAlign=y>this.centery?'bottom':'top';if(a==RG.HALFPI){vAlign='center';}else if(a==RG.PI){hAlign='center';}else if(a==(RG.HALFPI+RG.PI)){vAlign='center';} if(prop['chart.labels.centered']){hAlign='center';vAlign='center';} var value=(((this.max-this.min)*(i/num))+this.min);RG.text2(this,{font:font,size:size,x:x+offsetx,y:y+offsety,text:prop['chart.labels.specific']?prop['chart.labels.specific'][i]:RG.numberFormat(this,value.toFixed(prop['chart.scale.decimals']),prop['chart.units.pre'],prop['chart.units.post']),halign:hAlign,valign:vAlign,tag:prop['chart.labels.specific']?'labels.specific':'labels'});}} co.fill();if(prop['chart.value.text']){var x=this.centerx,y=this.centery+(prop['chart.value.text.y.pos']*this.radius),units_pre=typeof(prop['chart.value.text.units.pre'])=='string'?prop['chart.value.text.units.pre']:prop['chart.units.pre'],units_post=typeof(prop['chart.value.text.units.post'])=='string'?prop['chart.value.text.units.post']:prop['chart.units.post'],bounding=prop['chart.value.text.bounding'],boundingFill=prop['chart.value.text.bounding.fill'],boundingStroke=prop['chart.value.text.bounding.stroke'],color=typeof prop['chart.value.text.color']==='string'?prop['chart.value.text.color']:prop['chart.text.color'],font=typeof prop['chart.value.text.font']==='string'?prop['chart.value.text.font']:prop['chart.text.font'],size=typeof prop['chart.value.text.size']==='number'?RG.stringsToNumbers(prop['chart.value.text.size']):prop['chart.text.size']+4,italic=typeof prop['chart.value.text.italic']==='boolean'?prop['chart.value.text.italic']:false,bold=typeof prop['chart.value.text.bold']==='boolean'?prop['chart.value.text.bold']:false,decimals=typeof prop['chart.value.text.decimals']==='number'?prop['chart.value.text.decimals']:prop['chart.scale.decimals'];co.fillStyle=color;if(typeof this.value==='number'){var text=RG.numberFormat(this,(prop['chart.value.text.actual']?this.valueOriginal:this.value).toFixed(decimals),units_pre,units_post);}else{var text=[];for(var i=0;i=0&&angle<=RG.HALFPI){angle+=RG.TWOPI;} var value=((angle-this.startAngle)/(this.endAngle-this.startAngle))*(this.max-this.min);value=value+this.min;if(valuethis.max){value=this.max} return value;};this.getObjectByXY=function(e) {var mouseXY=RGraph.getMouseXY(e);if(mouseXY[0]>(this.centerx-this.radius)&&mouseXY[0]<(this.centerx+this.radius)&&mouseXY[1]>(this.centery-this.radius)&&mouseXY[1]<(this.centery+this.radius)&&RG.getHypLength(this.centerx,this.centery,mouseXY[0],mouseXY[1])<=this.radius){return this;}};this.drawGradient=this.DrawGradient=function() {if(prop['chart.border.gradient']){co.beginPath();var grad=co.createRadialGradient(this.centerx,this.centery,this.radius,this.centerx,this.centery,this.radius-15);grad.addColorStop(0,'gray');grad.addColorStop(1,'white');co.fillStyle=grad;co.arc(this.centerx,this.centery,this.radius,0,RG.TWOPI,false) co.arc(this.centerx,this.centery,this.radius-15,RG.TWOPI,0,true) co.fill();}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){this.value=this.getValue(e);RG.redrawCanvas(this.canvas);RG.fireCustomEvent(this,'onadjust');}};this.getAngle=function(value) {if(value>this.max||valueobj.max)obj.value=obj.max;if(obj.valueobj.max)obj.value[i]=obj.max;if(obj.value[i]0&&prop['chart.grouping']=='stacked'){alert('[HBAR] Using chart.xmin is not supported with stacked charts, resetting chart.xmin to zero');this.Set('chart.xmin',0);} this.graphwidth=ca.width-this.gutterLeft-this.gutterRight;this.graphheight=ca.height-this.gutterTop-this.gutterBottom;this.halfgrapharea=this.grapharea/2;this.halfTextHeight=prop['chart.text.size']/2;this.halfway=ma.round((this.graphwidth/2)+this.gutterLeft) RG.Background.draw(this);this.drawbars();this.drawAxes();this.drawLabels();if(prop['chart.key']&&prop['chart.key'].length){RG.DrawKey(this,prop['chart.key'],prop['chart.colors']);} if(prop['chart.contextmenu']){RG.ShowContext(this);} RG.DrawInGraphLabels(this);if(prop['chart.resizable']){RG.AllowResizing(this);} RG.InstallEventListeners(this);if(this.firstDraw){this.firstDraw=false;RG.fireCustomEvent(this,'onfirstdraw');this.firstDrawFunc();} RG.FireCustomEvent(this,'ondraw');return this;};this.exec=function(func) {func(this);return this;};this.drawAxes=this.DrawAxes=function() {var halfway=this.halfway co.beginPath();co.lineWidth=prop['chart.axis.linewidth']?prop['chart.axis.linewidth']+0.001:1.001;co.strokeStyle=prop['chart.axis.color'];if(prop['chart.noyaxis']==false&&prop['chart.noaxes']==false){if(prop['chart.yaxispos']=='center'){co.moveTo(halfway,this.gutterTop);co.lineTo(halfway,ca.height-this.gutterBottom);}else if(prop['chart.yaxispos']=='right'){co.moveTo(ca.width-this.gutterRight,this.gutterTop);co.lineTo(ca.width-this.gutterRight,ca.height-this.gutterBottom);}else{co.moveTo(this.gutterLeft,this.gutterTop);co.lineTo(this.gutterLeft,ca.height-this.gutterBottom);}} if(prop['chart.noxaxis']==false&&prop['chart.noaxes']==false){co.moveTo(this.gutterLeft+0.001,ca.height-this.gutterBottom+0.001);co.lineTo(ca.width-this.gutterRight+0.001,ca.height-this.gutterBottom+0.001);} if(prop['chart.noytickmarks']==false&&prop['chart.noyaxis']==false&&prop['chart.numyticks']>0&&prop['chart.noaxes']==false){var yTickGap=(ca.height-this.gutterTop-this.gutterBottom)/(prop['chart.numyticks']>0?prop['chart.numyticks']:this.data.length);for(y=this.gutterTop;y<(ca.height-this.gutterBottom-1);y+=yTickGap){if(prop['chart.yaxispos']=='center'){co.moveTo(halfway+3,ma.round(y));co.lineTo(halfway-3,ma.round(y));}else if(prop['chart.yaxispos']=='right'){co.moveTo(ca.width-this.gutterRight,ma.round(y));co.lineTo(ca.width-this.gutterRight+3,ma.round(y));}else{co.moveTo(this.gutterLeft,ma.round(y));co.lineTo(this.gutterLeft-3,ma.round(y));}} if(prop['chart.noxaxis']==true){if(prop['chart.yaxispos']=='center'){co.moveTo(halfway+3,ma.round(y));co.lineTo(halfway-3,ma.round(y));}else if(prop['chart.yaxispos']=='right'){co.moveTo(ca.width-this.gutterRight,ma.round(y));co.lineTo(ca.width-this.gutterRight+3,ma.round(y));}else{co.moveTo(this.gutterLeft,ma.round(y));co.lineTo(this.gutterLeft-3,ma.round(y));}}} if(prop['chart.noxtickmarks']==false&&prop['chart.noxaxis']==false&&prop['chart.numxticks']>0&&prop['chart.noaxes']==false){xTickGap=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.numxticks'];yStart=ca.height-this.gutterBottom;yEnd=(ca.height-this.gutterBottom)+3;var i=prop['chart.numxticks'] while(i--){var x=ca.width-this.gutterRight-(i*xTickGap);if(prop['chart.yaxispos']==='right'){x-=xTickGap;} co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);} if(prop['chart.yaxispos']==='center'){var i=5;while(i--){var x=this.gutterLeft+(xTickGap*i);co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);}} if(prop['chart.noyaxis']==true){co.moveTo(this.gutterLeft,ma.round(yStart));co.lineTo(this.gutterLeft,ma.round(yEnd));}} co.stroke();co.lineWidth=1;};this.drawLabels=this.DrawLabels=function() {var units_pre=prop['chart.units.pre'],units_post=prop['chart.units.post'],text_size=prop['chart.text.size'],font=prop['chart.text.font'],offsetx=prop['chart.xlabels.offsetx'],offsety=prop['chart.xlabels.offsety'] if(prop['chart.units.ingraph']){units_pre='';units_post='';} if(prop['chart.xlabels']){if(RG.isArray(prop['chart.xlabels.specific'])){if(prop['chart.yaxispos']=='center'){var halfGraphWidth=this.graphwidth/2;var labels=prop['chart.xlabels.specific'];var interval=(this.graphwidth/2)/(labels.length-1);co.fillStyle=prop['chart.text.color'];for(var i=0;i0;i-=1){RG.Text2(this,{'font':font,'size':text_size,'x':this.gutterLeft+(interval*(labels.length-i-1))+offsetx,'y':ca.height-this.gutterBottom+offsety,'text':labels[i],'valign':'top','halign':prop['chart.text.angle']!==0?'right':'center','tag':'scale',angle:-1*prop['chart.text.angle']});}}else if(prop['chart.yaxispos']=='right'){var labels=prop['chart.xlabels.specific'];var interval=this.graphwidth/(labels.length-1);co.fillStyle=prop['chart.text.color'];for(var i=0;i0||prop['chart.noyaxis']==true||prop['chart.scale.zerostart']||prop['chart.noaxes']){var x=prop['chart.yaxispos']=='center'?this.gutterLeft+(this.graphwidth/2):this.gutterLeft;if(prop['chart.yaxispos']==='right'){var x=ca.width-this.gutterRight;} RG.text2(this,{'font':font,'size':text_size,'x':x+offsetx,'y':this.gutterTop+this.halfTextHeight+this.graphheight+gap+offsety,'text':RG.numberFormat(this,prop['chart.xmin'].toFixed(prop['chart.xmin']===0?0:prop['chart.scale.decimals']),units_pre,units_post),'valign':'center',halign:prop['chart.text.angle']!==0?'right':'center','tag':'scale',angle:-1*prop['chart.text.angle']});} co.fill();co.stroke();}} if(typeof prop['chart.labels']=='object'){var xOffset=prop['chart.variant']==='3d'&&prop['chart.yaxispos']==='right'?15:5,font=prop['chart.text.font'],color=prop['chart.labels.color']||prop['chart.text.color'],bold=prop['chart.labels.bold'],offsetx=prop['chart.labels.offsetx'],offsety=prop['chart.labels.offsety'] co.fillStyle=color;var barHeight=(ca.height-this.gutterTop-this.gutterBottom)/prop['chart.labels'].length;yTickGap=(ca.height-this.gutterTop-this.gutterBottom)/prop['chart.labels'].length if(prop['chart.yaxispos']==='right'){var x=ca.width-this.gutterRight+xOffset;var halign='left'}else{var x=this.gutterLeft-xOffset;var halign='right'} var i=0;for(y=this.gutterTop+(yTickGap/2);y<=ca.height-this.gutterBottom;y+=yTickGap){RG.text2(this,{'font':font,'size':prop['chart.text.size'],'bold':bold,'x':x+offsetx,'y':y+offsety,'text':String(prop['chart.labels'][i++]),'halign':halign,'valign':'center','tag':'labels'});}}};this.drawbars=this.Drawbars=function() {co.lineWidth=prop['chart.linewidth'];co.strokeStyle=prop['chart.strokestyle'];co.fillStyle=prop['chart.colors'][0];var prevX=0,prevY=0;if(prop['chart.xmax']){this.scale2=RG.getScale2(this,{'max':prop['chart.xmax'],'min':prop['chart.xmin'],'scale.decimals':Number(prop['chart.scale.decimals']),'scale.point':prop['chart.scale.point'],'scale.thousand':prop['chart.scale.thousand'],'scale.round':prop['chart.scale.round'],'units.pre':prop['chart.units.pre'],'units.post':prop['chart.units.post'],'ylabels.count':prop['chart.xlabels.count'],'strict':true});this.max=this.scale2.max;}else{var grouping=prop['chart.grouping'];for(i=0;i=0;--i){var width=ma.abs((this.data[i]/this.max)*graphwidth);var height=this.graphheight/this.data.length;var orig_height=height;var x=this.gutterLeft;var y=this.gutterTop+(i*height);var vmargin=prop['chart.vmargin'];if(prop['chart.yaxispos']==='right'){x=ca.width-this.gutterRight-ma.abs(width);} if(width<0){x-=width;width=ma.abs(width);} if(prop['chart.shadow']){co.shadowColor=prop['chart.shadow.color'];co.shadowBlur=prop['chart.shadow.blur'];co.shadowOffsetX=prop['chart.shadow.offsetx'];co.shadowOffsetY=prop['chart.shadow.offsety'];} co.beginPath();if(typeof this.data[i]=='number'||RG.isNull(this.data[i])){var barHeight=height-(2*vmargin),barWidth=((this.data[i]-prop['chart.xmin'])/(this.max-prop['chart.xmin']))*this.graphwidth,barX=this.gutterLeft;if(prop['chart.yaxispos']=='center'){barWidth/=2;barX+=halfwidth;if(this.data[i]<0){barWidth=(ma.abs(this.data[i])-prop['chart.xmin'])/(this.max-prop['chart.xmin']);barWidth=barWidth*(this.graphwidth/2);barX=((this.graphwidth/2)+this.gutterLeft)-barWidth;}}else if(prop['chart.yaxispos']=='right'){barWidth=ma.abs(barWidth);barX=ca.width-this.gutterRight-barWidth;} co.strokeStyle=prop['chart.strokestyle'];co.fillStyle=prop['chart.colors'][0];++colorIdx;if(prop['chart.colors.sequential']&&typeof colorIdx==='number'){if(prop['chart.colors'][this.numbars-colorIdx]){co.fillStyle=prop['chart.colors'][this.numbars-colorIdx];}else{co.fillStyle=prop['chart.colors'][prop['chart.colors'].length-1];}} co.strokeRect(barX,this.gutterTop+(i*height)+prop['chart.vmargin'],barWidth,barHeight);co.fillRect(barX,this.gutterTop+(i*height)+prop['chart.vmargin'],barWidth,barHeight);this.coords.push([barX,y+vmargin,barWidth,height-(2*vmargin),co.fillStyle,this.data[i],true]);if(prop['chart.variant']==='3d'&&typeof this.data[i]=='number'){var prevStrokeStyle=co.strokeStyle,prevFillStyle=co.fillStyle;RG.noShadow(this);var barX=barX,barY=y+vmargin,barW=barWidth,barH=height-(2*vmargin),offsetX=prop['chart.variant.threed.offsetx'],offsetY=prop['chart.variant.threed.offsety'],value=this.data[i];pa2(co,['b','m',barX,barY,'l',barX+offsetX-(prop['chart.yaxispos']=='left'&&value<0?offsetX:0),barY-offsetY,'l',barX+barW+offsetX-(prop['chart.yaxispos']=='center'&&value<0?offsetX:0),barY-offsetY,'l',barX+barW,barY,'c','s',co.strokeStyle,'f',co.fillStyle,'f','rgba(255,255,255,0.6)']);if(prop['chart.yaxispos']!=='right'&&!(prop['chart.yaxispos']==='center'&&value<0)&&value>=0&&!RG.isNull(value)){pa2(co,['b','fs',prevFillStyle,'m',barX+barW,barY,'l',barX+barW+offsetX,barY-offsetY,'l',barX+barW+offsetX,barY-offsetY+barH,'l',barX+barW,barY+barH,'c','s',co.strokeStyle,'f',prevFillStyle,'f','rgba(0,0,0,0.25)']);}}}else if(typeof(this.data[i])=='object'&&prop['chart.grouping']=='stacked'){if(prop['chart.yaxispos']=='center'){alert('[HBAR] You can\'t have a stacked chart with the Y axis in the center, change it to grouped');}else if(prop['chart.yaxispos']=='right'){var x=ca.width-this.gutterRight} var barHeight=height-(2*vmargin);if(typeof this.coords2[i]=='undefined'){this.coords2[i]=[];} for(j=0;j=0;--j){if(prop['chart.shadow']){RG.setShadow(this,prop['chart.shadow.color'],prop['chart.shadow.offsetx'],prop['chart.shadow.offsety'],prop['chart.shadow.blur']);} co.strokeStyle=prop['chart.strokestyle'];++colorIdx;if(prop['chart.colors.sequential']&&typeof colorIdx==='number'){if(prop['chart.colors'][this.numbars-colorIdx]){co.fillStyle=prop['chart.colors'][this.numbars-colorIdx];}else{co.fillStyle=prop['chart.colors'][prop['chart.colors'].length-1];}}else if(prop['chart.colors'][j]){co.fillStyle=prop['chart.colors'][j];} var startY=this.gutterTop+(height*i)+(individualBarHeight*j)+vmargin+(vmarginGrouped*j);var width=((this.data[i][j]-prop['chart.xmin'])/(this.max-prop['chart.xmin']))*(ca.width-this.gutterLeft-this.gutterRight);var startX=this.gutterLeft;if(prop['chart.yaxispos']=='center'){width/=2;startX+=halfwidth;}else if(prop['chart.yaxispos']=='right'){width=ma.abs(width);startX=ca.width-this.gutterRight-ma.abs(width);;} if(width<0){startX+=width;width*=-1;} co.strokeRect(startX,startY,width,individualBarHeight);co.fillRect(startX,startY,width,individualBarHeight);this.coords.push([startX,startY,width,individualBarHeight,co.fillStyle,this.data[i][j],true]);this.coords2[i].push([startX,startY,width,individualBarHeight,co.fillStyle,this.data[i][j],true]);if(prop['chart.variant']==='3d'){RG.noShadow(this);var prevStrokeStyle=co.strokeStyle,prevFillStyle=co.fillStyle;var barX=startX,barY=startY,barW=width,barH=individualBarHeight,offsetX=prop['chart.variant.threed.offsetx'],offsetY=prop['chart.variant.threed.offsety'],value=this.data[i][j];pa2(co,['b','m',barX,barY,'l',barX+offsetX,barY-offsetY,'l',barX+barW+offsetX-(value<0?offsetX:0),barY-offsetY,'l',barX+barW,barY,'c','s',co.strokeStyle,'f',co.fillStyle,'f','rgba(255,255,255,0.6)']);if(prop['chart.yaxispos']!=='right'&&!(prop['chart.yaxispos']==='center'&&value<0)&&value>=0&&!RG.isNull(value)){pa2(co,['fs',prevFillStyle,'b','m',barX+barW,barY,'l',barX+barW+offsetX,barY-offsetY,'l',barX+barW+offsetX,barY-offsetY+barH,'l',barX+barW,barY+barH,'c','s',co.strokeStyle,'f',prevFillStyle,'f','rgba(0,0,0,0.25)']);} co.beginPath();co.strokeStyle=prevStrokeStyle;co.fillStyle=prevFillStyle;}} startY+=vmargin;} co.closePath();} co.stroke();co.fill();if(prop['chart,yaxispos']==='right'){pa2(co,'cr % % % %',ca.width-this.gutterRight+prop['chart.variant.threed.offsetx'],'0',this.gutterRight,ca.height);} if(prop['chart.yaxispos']==='right'&&prop['chart.variant']==='3d'){RG.draw3DYAxis(this);} RG.noShadow(this);this.coords=RG.arrayReverse(this.coords);if(prop['chart.grouping']==='grouped'){for(var i=0;ica.width?true:false,text=RG.numberFormat(this,(this.coords[i][5]).toFixed(prop['chart.labels.above.decimals']),prop['chart.labels.above.units.pre'],prop['chart.labels.above.units.post']);RG.noShadow(this);if(typeof prop['chart.labels.above.specific']==='object'&&prop['chart.labels.above.specific']&&prop['chart.labels.above.specific'][i]){text=prop['chart.labels.above.specific'][i];} var x=coords[i][0]+coords[i][2]+5;var y=coords[i][1]+(coords[i][3]/2);if(prop['chart.yaxispos']==='right'){x=coords[i][0]-5;halign='right';}else if(prop['chart.yaxispos']==='center'&&this.data_arr[i]<0){x=coords[i][0]-5;halign='right';} RG.text2(this,{font:typeof prop['chart.labels.above.font']==='string'?prop['chart.labels.above.font']:font,size:typeof prop['chart.labels.above.size']==='number'?prop['chart.labels.above.size']:size,color:typeof prop['chart.labels.above.color']==='string'?prop['chart.labels.above.color']:color,x:x,y:y,bold:prop['chart.labels.above.bold'],italic:prop['chart.labels.above.italic'],text:text,valign:'center',halign:halign,tag:'labels.above'});}}};this.getShape=this.getBar=function(e) {var mouseXY=RG.getMouseXY(e);for(var i=0,len=this.coords.length;i(ca.height-this.gutterBottom)||mouseX(ca.width-this.gutterRight)){return null;} if(prop['chart.yaxispos']=='center'){var value=((mouseX-this.gutterLeft)/(this.graphwidth/2))*(this.max-prop['chart.xmin']);value=value-this.max if(prop['chart.xmin']>0){value=((mouseX-this.gutterLeft-(this.graphwidth/2))/(this.graphwidth/2))*(this.max-prop['chart.xmin']);value+=prop['chart.xmin'];if(mouseX<(this.gutterLeft+(this.graphwidth/2))){value-=(2*prop['chart.xmin']);}}}else if(prop['chart.yaxispos']=='right'){var value=((mouseX-this.gutterLeft)/this.graphwidth)*(this.scale2.max-prop['chart.xmin']);value=this.scale2.max-value;}else{var value=((mouseX-this.gutterLeft)/this.graphwidth)*(this.scale2.max-prop['chart.xmin']);value+=prop['chart.xmin'];} return value;};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{RG.Highlight.Rect(this,shape);}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if(prop['chart.variant']==='3d'){var adjustment=prop['chart.variant.threed.angle']*mouseXY[0];mouseXY[1]-=adjustment;} if(mouseXY[0]>=this.gutterLeft&&mouseXY[0]<=(ca.width-this.gutterRight)&&mouseXY[1]>=this.gutterTop&&mouseXY[1]<=(ca.height-this.gutterBottom)){return this;}};this.getXCoord=function(value) {if(prop['chart.yaxispos']=='center'){if(value>this.max||value<(-1*this.max)){return null;} var width=(ca.width-prop['chart.gutter.left']-prop['chart.gutter.right'])/2;var coord=(((value-prop['chart.xmin'])/(this.max-prop['chart.xmin']))*width)+width;coord=prop['chart.gutter.left']+coord;}else{if(value>this.max||value<0){return null;} var width=ca.width-prop['chart.gutter.left']-prop['chart.gutter.right'];var coord=((value-prop['chart.xmin'])/(this.max-prop['chart.xmin']))*width;coord=prop['chart.gutter.left']+coord;} return coord;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.background.grid.color']=RG.array_clone(prop['chart.background.grid.color']);this.original_colors['chart.background.color']=RG.array_clone(prop['chart.background.color']);this.original_colors['chart.background.barcolor1']=RG.array_clone(prop['chart.background.barcolor1']);this.original_colors['chart.background.barcolor2']=RG.array_clone(prop['chart.background.barcolor2']);this.original_colors['chart.text.color']=RG.array_clone(prop['chart.text.color']);this.original_colors['chart.labels.colors']=RG.array_clone(prop['chart.labels.colors']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);this.original_colors['chart.axis.color']=RG.array_clone(prop['chart.axis.color']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);} var colors=prop['chart.colors'];for(var i=0;i=top&&mouseY<=(top+height)){if(prop['chart.tooltips']){var tooltip=RG.parseTooltipText?RG.parseTooltipText(prop['chart.tooltips'],i):prop['chart.tooltips'][i];} return{0:obj,object:obj,1:left,x:left,2:top,y:top,3:width,width:width,4:height,height:height,5:i,index:i,tooltip:tooltip};}} return null;};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.get('chart.adjusting')&&RG.Registry.get('chart.adjusting').uid==this.uid){var value=Number(this.getValue(e)),shape=RG.Registry.get('chart.adjusting.shape');if(shape){RG.Registry.Set('chart.adjusting.shape',shape);if(this.stackedOrGrouped&&prop['chart.grouping']=='grouped'){var indexes=RG.sequentialIndexToGrouped(shape['index'],this.data);if(typeof this.data[indexes[0]]=='number'){this.data[indexes[0]]=Number(value);}else if(!RG.is_null(this.data[indexes[0]])){this.data[indexes[0]][indexes[1]]=Number(value);}}else if(typeof this.data[shape['index']]=='number'){this.data[shape['index']]=Number(value);} RG.redrawCanvas(e.target);RG.fireCustomEvent(this,'onadjust');}}};this.grow=function() {var obj=this,opt=arguments[0]||{},frames=opt.frames||30,frame=0,callback=arguments[1]||function(){},labelsAbove=prop['chart.labels.above'];this.set('labelsAbove',false);obj.original_data=RG.arrayClone(obj.data);if(prop['chart.xmax']==0){var xmax=0;for(var i=0;iopt.startFrames[i]){if(typeof obj.data[i]==='number'){obj.data[i]=ma.min(ma.abs(original[i]),ma.abs(original[i]*((opt.counters[i]++)/framesperbar)));if(original[i]<0){obj.data[i]*=-1;}}else if(!RG.isNull(obj.data[i])){for(var j=0,len2=obj.data[i].length;j=opt.frames){if(labelsAbove){obj.set('labelsAbove',true);RG.redrawCanvas(obj.canvas);} callback(obj);}else{RG.redrawCanvas(obj.canvas);RG.Effects.updateCanvas(iterator);}} iterator();return this;};this.isAdjustable=function(shape) {if(RG.isNull(prop['chart.adjustable.only'])){return true;} if(RG.isArray(prop['chart.adjustable.only'])&&prop['chart.adjustable.only'][shape.index]){return true;} return false;};RG.Register(this);if(parseConfObjectForOptions){RG.parseObjectStyleConfig(this,conf.options);}}; ================================================ FILE: docs/RGraph/libraries/RGraph.hprogress.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.HProgress=function(conf) {if(typeof conf==='object'&&typeof conf.value!=='undefined'&&typeof conf.id==='string'){var id=conf.id,canvas=document.getElementById(id),min=conf.min,max=conf.max,value=conf.value,parseConfObjectForOptions=true;}else{var id=conf,canvas=document.getElementById(id),min=arguments[1],max=arguments[2],value=arguments[3];} this.id=id;this.canvas=canvas;this.context=this.canvas.getContext('2d');this.canvas.__object__=this;this.min=RGraph.stringsToNumbers(min);this.max=RGraph.stringsToNumbers(max);this.value=RGraph.stringsToNumbers(value);this.type='hprogress';this.coords=[];this.isRGraph=true;this.currentValue=null;this.uid=RGraph.CreateUID();this.canvas.uid=this.canvas.uid?this.canvas.uid:RGraph.CreateUID();this.colorsParsed=false;this.coordsText=[];this.original_colors=[];this.firstDraw=true;this.properties={'chart.colors':['Gradient(white:#0c0)','Gradient(white:red)','Gradient(white:green)','yellow','pink','cyan','black','white','gray'],'chart.strokestyle.inner':'#999','chart.strokestyle.outer':'#999','chart.tickmarks':true,'chart.tickmarks.color':'#999','chart.tickmarks.inner':false,'chart.tickmarks.zerostart':true,'chart.gutter.left':25,'chart.gutter.right':25,'chart.gutter.top':25,'chart.gutter.bottom':25,'chart.numticks':10,'chart.numticks.inner':50,'chart.background.color':'Gradient(#ccc:#eee:#efefef)','chart.shadow':false,'chart.shadow.color':'rgba(0,0,0,0.5)','chart.shadow.blur':3,'chart.shadow.offsetx':3,'chart.shadow.offsety':3,'chart.title':'','chart.title.background':null,'chart.title.bold':true,'chart.title.font':null,'chart.title.x':null,'chart.title.y':null,'chart.title.halign':null,'chart.title.valign':null,'chart.text.size':12,'chart.text.color':'black','chart.text.font':'Arial, Verdana, sans-serif','chart.text.accessible':true,'chart.text.accessible.overflow':'visible','chart.text.accessible.pointerevents':false,'chart.contextmenu':null,'chart.units.pre':'','chart.units.post':'','chart.tooltips':null,'chart.tooltips.effect':'fade','chart.tooltips.css.class':'RGraph_tooltip','chart.tooltips.highlight':true,'chart.tooltips.event':'onclick','chart.highlight.stroke':'rgba(0,0,0,0)','chart.highlight.fill':'rgba(255,255,255,0.7)','chart.annotatable':false,'chart.annotate.color':'black','chart.zoom.factor':1.5,'chart.zoom.fade.in':true,'chart.zoom.fade.out':true,'chart.zoom.hdir':'right','chart.zoom.vdir':'down','chart.zoom.frames':25,'chart.zoom.delay':16.666,'chart.zoom.shadow':true,'chart.zoom.background':true,'chart.arrows':false,'chart.margin':0,'chart.resizable':false,'chart.resize.handle.adjust':[0,0],'chart.resize.handle.background':null,'chart.labels.specific':null,'chart.labels.count':10,'chart.labels.offsetx':0,'chart.labels.offsety':0,'chart.adjustable':false,'chart.scale.decimals':0,'chart.scale.point':'.','chart.scale.thousand':',','chart.key':null,'chart.key.background':'white','chart.key.position':'gutter','chart.key.halign':'right','chart.key.shadow':false,'chart.key.shadow.color':'#666','chart.key.shadow.blur':3,'chart.key.shadow.offsetx':2,'chart.key.shadow.offsety':2,'chart.key.position.gutter.boxed':false,'chart.key.position.x':null,'chart.key.position.y':null,'chart.key.color.shape':'square','chart.key.rounded':true,'chart.key.linewidth':1,'chart.key.colors':null,'chart.key.color.shape':'square','chart.key.interactive':false,'chart.key.interactive.highlight.chart.stroke':'black','chart.key.interactive.highlight.chart.fill':'rgba(255,255,255,0.7)','chart.key.interactive.highlight.label':'rgba(255,0,0,0.2)','chart.key.text.color':'black','chart.labels.position':'bottom','chart.events.mousemove':null,'chart.events.click':null,'chart.border.inner':true,'chart.clearto':'rgba(0,0,0,0)'} if(!this.canvas){alert('[HPROGRESS] No canvas support');return;} var linear_data=RGraph.array_linearize(value);for(var i=0;i0?prop['chart.scale.decimals']:0)+prop['chart.units.post'],'valign':'bottom','halign':'center','tag':'scale'});}else{RG.text2(this,{'font':font,'size':size,'x':this.gutterLeft+offsetx,'y':ca.height-this.gutterBottom+5+offsety,'text':prop['chart.units.pre']+Number(this.min).toFixed(this.min>0?prop['chart.scale.decimals']:0)+prop['chart.units.post'],'valign':'top','halign':'center','tag':'scale'});}}};this.getShape=this.getBar=function(e) {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1];for(var i=0,len=this.coords.length;i(ca.width-this.gutterRight)){value=this.max} return value;};this.highlight=this.Highlight=function(shape) {var last=shape.index===this.coords.length-1;if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{this.drawCurvedBar({x:shape.x,y:shape.y,width:shape.width,height:shape.height,stroke:prop['chart.highlight.stroke'],fill:prop['chart.highlight.fill']});}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if(mouseXY[0]>this.gutterLeft&&mouseXY[0]<(ca.width-this.gutterRight)&&mouseXY[1]>this.gutterTop&&mouseXY[1]<(ca.height-this.gutterBottom)){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){var mouseXY=RG.getMouseXY(e);var value=this.getValue(e);if(typeof(value)=='number'){this.value=Number(value.toFixed(prop['chart.scale.decimals']));RG.redrawCanvas(ca);RG.fireCustomEvent(this,'onadjust');}}};this.drawSpecificLabels=this.DrawSpecificLabels=function() {var labels=prop['chart.labels.specific'];if(labels){var font=prop['chart.text.font'],size=prop['chart.text.size'],valign=(prop['chart.labels.position']=='top'?'bottom':'top'),step=this.width/(labels.length-1),offsetx=prop['chart.labels.offsetx'],offsety=prop['chart.labels.offsety'] co.beginPath();co.fillStyle=prop['chart.text.color'];for(var i=0;ithis.max){return null;} var barWidth=ca.width-this.gutterLeft-this.gutterRight;var coord=((value-min)/(this.max-min))*barWidth;coord=this.gutterLeft+coord;return coord;};this.overChartArea=function(e) {var mouseXY=RGraph.getMouseXY(e);var mouseX=mouseXY[0];var mouseY=mouseXY[1];if(mouseX>=this.gutterLeft&&mouseX<=(ca.width-this.gutterRight)&&mouseY>=this.gutterTop&&mouseY<=(ca.height-this.gutterBottom)){return true;} return false;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.tickmarks.color']=RG.array_clone(prop['chart.tickmarks.color']);this.original_colors['chart.strokestyle.inner']=RG.array_clone(prop['chart.strokestyle.inner']);this.original_colors['chart.strokestyle.outer']=RG.array_clone(prop['chart.strokestyle.outer']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.color']=RG.array_clone(prop['chart.highlight.color']);} var colors=prop['chart.colors'];for(var i=0;i1&&prop['chart.filled.accumulative']){var accumulation=[];for(var set=0;set0){RG.DrawBars(this);} if(prop['chart.axesontop']==false){this.DrawAxes();} co.save() co.beginPath();if(prop['chart.animation.trace.center']){co.rect((ca.width/2)*(1-prop['chart.animation.trace.clip']),0,ca.width*prop['chart.animation.trace.clip'],ca.height);}else{co.rect(0,0,ca.width*prop['chart.animation.trace.clip'],ca.height);} co.clip();for(var i=0,j=0,len=this.data.length;i0){var fill=prop['chart.fillstyle'];}else if(typeof(prop['chart.fillstyle'])=='string'){var fill=prop['chart.fillstyle'];}}else if(prop['chart.filled']){var fill=prop['chart.colors'][j];}else{var fill=null;} if(prop['chart.tickmarks']&&typeof(prop['chart.tickmarks'])=='object'){var tickmarks=prop['chart.tickmarks'][i];}else if(prop['chart.tickmarks']&&typeof(prop['chart.tickmarks'])=='string'){var tickmarks=prop['chart.tickmarks'];}else if(prop['chart.tickmarks']&&typeof(prop['chart.tickmarks'])=='function'){var tickmarks=prop['chart.tickmarks'];}else{var tickmarks=null;} if(prop['chart.outofbounds.clip']){pa2(co,'sa b r % % % % cl b',0,this.gutterTop,ca.width,ca.height-this.gutterTop-this.gutterBottom);} this.drawLine(this.data[i],prop['chart.colors'][j],fill,this.getLineWidth(j),tickmarks,i);if(prop['chart.outofbounds.clip']){co.restore();} co.stroke();} if(prop['chart.outofbounds.clip']){pa2(co,'sa b r % % % % cl b',0,this.gutterTop,ca.width,ca.height-this.gutterTop-this.gutterBottom);} if(prop['chart.filled']&&prop['chart.filled.accumulative']&&!prop['chart.curvy']){for(var i=0;i=len;--i){if(!RG.is_null(this.coords[i][1])){if(i==(this.coords.length-1)){co.moveTo(this.coords[i][0],this.coords[i][1]);}else{co.lineTo(this.coords[i][0],this.coords[i][1]);}}} co.stroke();}else if(prop['chart.filled']&&prop['chart.filled.range']){alert('[LINE] You must have only two sets of data for a filled range chart');} if(prop['chart.resizable']){RG.AllowResizing(this);} RG.InstallEventListeners(this);if(this.firstDraw){this.firstDraw=false;RG.fireCustomEvent(this,'onfirstdraw');this.firstDrawFunc();} RG.FireCustomEvent(this,'ondraw');return this;};this.exec=function(func) {func(this);return this;};this.drawAxes=this.DrawAxes=function() {if(prop['chart.noaxes']){return;} RG.noShadow(this);co.lineWidth=prop['chart.axis.linewidth']+0.001;co.lineCap='square';co.lineJoin='miter';co.strokeStyle=prop['chart.axis.color'];coords={xaxis:{},yaxis:{}};co.beginPath();if(prop['chart.noxaxis']==false){if(prop['chart.xaxispos']=='center'){coords.xaxis=[this.gutterLeft,ma.round((this.grapharea/2)+this.gutterTop),ca.width-this.gutterRight,ma.round((this.grapharea/2)+this.gutterTop)];}else if(prop['chart.xaxispos']==='top'){coords.xaxis=[this.gutterLeft,this.gutterTop,ca.width-this.gutterRight,this.gutterTop];}else{var y=ma.round(this.getYCoord(prop['chart.ymin']!=0?prop['chart.ymin']:0));if(prop['chart.scale.invert']&&prop['chart.ymin']===0){y=this.getYCoord(this.scale2.max);}else if(prop['chart.scale.invert']||prop['chart.ymin']<0){y=this.getYCoord(0);} coords.xaxis=[this.gutterLeft,y,ca.width-this.gutterRight,y];} co.moveTo(coords.xaxis[0],coords.xaxis[1]);co.lineTo(coords.xaxis[2],coords.xaxis[3]);this.coordsAxes=coords;} if(prop['chart.noyaxis']==false){if(prop['chart.yaxispos']=='left'){co.moveTo(this.gutterLeft,this.gutterTop);co.lineTo(this.gutterLeft,ca.height-this.gutterBottom);}else{co.moveTo(ca.width-this.gutterRight,this.gutterTop);co.lineTo(ca.width-this.gutterRight,ca.height-this.gutterBottom);}} if(prop['chart.noxaxis']==false&&prop['chart.numxticks']>0){var xTickInterval=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.numxticks'];if(!xTickInterval||xTickInterval<=0){xTickInterval=(ca.width-this.gutterLeft-this.gutterRight)/(prop['chart.labels']&&prop['chart.labels'].length?prop['chart.labels'].length-1:10);} for(x=this.gutterLeft+(prop['chart.yaxispos']=='left'?xTickInterval:0);x<=(ca.width-this.gutterRight+1);x+=xTickInterval){if(prop['chart.yaxispos']=='right'&&x>=(ca.width-this.gutterRight-1)){break;} if(prop['chart.noendxtick']){if(prop['chart.yaxispos']=='left'&&x>=(ca.width-this.gutterRight-1)){break;}else if(prop['chart.yaxispos']=='right'&&x==this.gutterLeft){continue;}} var yStart=prop['chart.xaxispos']==='center'?(this.gutterTop+(this.grapharea/2))-3:ca.height-this.gutterBottom;var yEnd=prop['chart.xaxispos']==='center'?yStart+6:ca.height-this.gutterBottom-(x%60==0?prop['chart.largexticks']*prop['chart.tickdirection']:prop['chart.smallxticks']*prop['chart.tickdirection']);if(prop['chart.ymin']>=0&&prop['chart.xaxispos']==='bottom'){var yStart=this.getYCoord(prop['chart.ymin'])-(prop['chart.ymin']>=0?0:3),yEnd=this.getYCoord(prop['chart.ymin'])+3;if(prop['chart.scale.invert']){yStart=ca.height-prop['chart.gutter.bottom'];yEnd=yStart+3;}}else if(prop['chart.xaxispos']=='center'){var yStart=Math.round((this.gutterTop+(this.grapharea/2)))-3,yEnd=yStart+6;}else if(prop['chart.xaxispos']=='bottom'){var yStart=this.getYCoord(0)-(prop['chart.ymin']!==0?3:0),yEnd=this.getYCoord(0)-(x%60==0?prop['chart.largexticks']*prop['chart.tickdirection']:prop['chart.smallxticks']*prop['chart.tickdirection']);yEnd+=0;}else if(prop['chart.xaxispos']=='top'){yStart=this.gutterTop-3;yEnd=this.gutterTop;} co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);}}else if(prop['chart.noyaxis']==false&&prop['chart.numyticks']>0){if(!prop['chart.noendytick']){if(prop['chart.yaxispos']=='left'){co.moveTo(this.gutterLeft,Math.round(ca.height-this.gutterBottom));co.lineTo(this.gutterLeft-prop['chart.smallyticks'],Math.round(ca.height-this.gutterBottom));}else{co.moveTo(ca.width-this.gutterRight,Math.round(ca.height-this.gutterBottom));co.lineTo(ca.width-this.gutterRight+prop['chart.smallyticks'],Math.round(ca.height-this.gutterBottom));}}} var numyticks=prop['chart.numyticks'];if(prop['chart.noyaxis']==false&&numyticks>0){var counter=0,adjustment=0;if(prop['chart.yaxispos']=='right'){adjustment=(ca.width-this.gutterLeft-this.gutterRight);} if(prop['chart.xaxispos']=='center'){var interval=(this.grapharea/numyticks);var lineto=(prop['chart.yaxispos']=='left'?this.gutterLeft:ca.width-this.gutterRight+prop['chart.smallyticks']);for(y=this.gutterTop;y<(this.grapharea/2)+this.gutterTop;y+=interval){if(y<(this.grapharea/2)+this.gutterTop){co.moveTo((prop['chart.yaxispos']=='left'?this.gutterLeft-prop['chart.smallyticks']:ca.width-this.gutterRight),Math.round(y));co.lineTo(lineto,Math.round(y));}} for(y=this.gutterTop+(this.halfgrapharea)+interval;y<=this.grapharea+this.gutterTop;y+=interval){co.moveTo((prop['chart.yaxispos']=='left'?this.gutterLeft-prop['chart.smallyticks']:ca.width-this.gutterRight),Math.round(y));co.lineTo(lineto,Math.round(y));}}else if(prop['chart.xaxispos']=='top'){var interval=(this.grapharea/numyticks);var lineto=(prop['chart.yaxispos']=='left'?this.gutterLeft:ca.width-this.gutterRight+prop['chart.smallyticks']);for(y=this.gutterTop+interval;y<=this.grapharea+this.gutterBottom;y+=interval){co.moveTo((prop['chart.yaxispos']=='left'?this.gutterLeft-prop['chart.smallyticks']:ca.width-this.gutterRight),Math.round(y));co.lineTo(lineto,Math.round(y));} if(prop['chart.noxaxis']&&prop['chart.noendytick']==false){co.moveTo((prop['chart.yaxispos']=='left'?this.gutterLeft-prop['chart.smallyticks']:ca.width-this.gutterRight),this.gutterTop);co.lineTo(lineto,this.gutterTop);}}else{var lineto=(prop['chart.yaxispos']=='left'?this.gutterLeft-prop['chart.smallyticks']:ca.width-this.gutterRight+prop['chart.smallyticks']);for(y=this.gutterTop;y<(ca.height-this.gutterBottom)&&counter0){if(prop['chart.yaxispos']=='left'){co.moveTo(this.gutterLeft,prop['chart.xaxispos']=='top'?this.gutterTop:ca.height-this.gutterBottom);co.lineTo(this.gutterLeft,prop['chart.xaxispos']=='top'?this.gutterTop-prop['chart.smallxticks']:ca.height-this.gutterBottom+prop['chart.smallxticks']);}else{co.moveTo(ca.width-this.gutterRight,ca.height-this.gutterBottom);co.lineTo(ca.width-this.gutterRight,ca.height-this.gutterBottom+prop['chart.smallxticks']);}} co.stroke();co.beginPath();};this.drawLabels=this.DrawLabels=function() {co.strokeStyle='black';co.fillStyle=prop['chart.text.color'];co.lineWidth=1;RG.NoShadow(this);var font=prop['chart.text.font'];var text_size=prop['chart.text.size'];var decimals=prop['chart.scale.decimals'];var context=co;var canvas=ca;var ymin=prop['chart.ymin'];if(prop['chart.ylabels']&&prop['chart.ylabels.specific']==null){var units_pre=prop['chart.units.pre'];var units_post=prop['chart.units.post'];var xpos=prop['chart.yaxispos']=='left'?this.gutterLeft-5:ca.width-this.gutterRight+5;var align=prop['chart.yaxispos']=='left'?'right':'left';var numYLabels=this.scale2.labels.length;var bounding=false;var bgcolor=prop['chart.ylabels.inside']?prop['chart.ylabels.inside.color']:null;var offsetx=prop['chart.ylabels.offsetx'];var offsety=prop['chart.ylabels.offsety'];if(prop['chart.ylabels.inside']==true&&align=='left'){xpos-=10;align='right';bounding=true;}else if(prop['chart.ylabels.inside']==true&&align=='right'){xpos+=10;align='left';bounding=true;} if(prop['chart.xaxispos']=='center'){var half=this.grapharea/2;for(var i=0;i0){var y=((this.grapharea/2)/(prop['chart.ylabels.specific'].length-(ymin?1:0)))*i;y+=this.gutterTop;} RG.text2(this,{'font':font,'size':text_size,'x':x+offsetx,'y':y+offsety,'text':String(prop['chart.ylabels.specific'][i]),'valign':'center','halign':halign,'bounding':bounding,'boundingFill':bgcolor,'tag':'ylabels.specific'});} var reversed_labels=RG.array_reverse(prop['chart.ylabels.specific']);for(var i=0;i0){var yOffset=5,bordered=false,bgcolor=null co.fillStyle=prop['chart.labels.color']||prop['chart.text.color'];var angle=0,valign='top',halign='center',bold=prop['chart.labels.bold'] if(prop['chart.xlabels.inside']){yOffset=-5;bordered=true;bgcolor=prop['chart.xlabels.inside.color'];valign='bottom';} if(prop['chart.xaxispos']=='top'){valign='bottom';yOffset+=2;} if(typeof(prop['chart.text.angle'])=='number'&&prop['chart.text.angle']>0){angle=-1*prop['chart.text.angle'];valign='center';halign='right';yOffset=10;if(prop['chart.xaxispos']=='top'){yOffset=10;}} var numLabels=prop['chart.labels'].length,offsetx=prop['chart.labels.offsetx'],offsety=prop['chart.labels.offsety'];for(i=0;i0){halign='left';} if(prop['chart.text.angle']!=0){halign='right';} RG.Text2(this,{'font':font,'size':text_size,'bold':bold,'x':labelX+offsetx,'y':(prop['chart.xaxispos']=='top')?this.gutterTop-yOffset-(prop['chart.xlabels.inside']?-22:0)+offsety:(ca.height-this.gutterBottom)+yOffset+offsety,'text':String(prop['chart.labels'][i]),'valign':valign,'halign':halign,'bounding':bordered,'boundingFill':bgcolor,'angle':angle,'tag':'labels'});}}} co.stroke();co.fill();} this.drawLine=this.DrawLine=function(lineData,color,fill,linewidth,tickmarks,index) {if(prop['chart.animation.unfold.y']&&prop['chart.animation.factor']!=1){for(var i=0;i0){var prevLineCoords=this.coords2[index-1];} var xInterval=(ca.width-(2*prop['chart.hmargin'])-this.gutterLeft-this.gutterRight)/(lineData.length-1);for(i=0,len=lineData.length;ithis.max)&&!prop['chart.outofbounds'])){yPos=null;} co.lineCap='round';co.lineJoin='round';if(i>0){xPos=xPos+xInterval;}else{xPos=prop['chart.hmargin']+this.gutterLeft;} if(prop['chart.animation.unfold.x']){xPos*=prop['chart.animation.factor'];if(xPos(ca.height-this.gutterBottom))){penUp=true;} if(i==0||penUp||!yPos||!prevY||prevY0){co.lineTo(xPos,lineCoords[i-1][1]);} co.lineTo(xPos,yPos);}else{if(RG.ISOLD&&yPos==null){}else{co.moveTo(xPos+1,yPos);}} if(yPos==null){penUp=true;}else{penUp=false;}}else{if(isStepped){co.lineTo(xPos,lineCoords[i-1][1]);} if((yPos>=this.gutterTop&&yPos<=(ca.height-this.gutterBottom))||prop['chart.outofbounds']){if(isLast&&prop['chart.filled']&&!prop['chart.filled.range']&&prop['chart.yaxispos']=='right'){xPos-=1;} if(!isStepped||!isLast){co.lineTo(xPos,yPos);if(isFilled&&lineCoords[i+1]&&lineCoords[i+1][1]==null){co.lineTo(xPos,xAxisPos);}}else if(isStepped&&isLast){co.lineTo(xPos,yPos);} penUp=false;}else{penUp=true;}}} if(prop['chart.filled']&&!prop['chart.filled.range']&&!prop['chart.curvy']){var fillStyle=prop['chart.fillstyle'];if(index>0&&prop['chart.filled.accumulative']){co.lineTo(xPos,prevLineCoords?prevLineCoords[i-1][1]:(ca.height-this.gutterBottom-1+(prop['chart.xaxispos']=='center'?(ca.height-this.gutterTop-this.gutterBottom)/2:0)));for(var k=(i-1);k>=0;--k){co.lineTo(k==0?prevLineCoords[k][0]+1:prevLineCoords[k][0],prevLineCoords[k][1]);}}else{if(prop['chart.xaxispos']=='top'){co.lineTo(xPos,prop['chart.gutter.top']+1);co.lineTo(lineCoords[0][0],prop['chart.gutter.top']+1);}else if(typeof(lineCoords[i-1][1])=='number'){var yPosition=this.getYCoord(0);co.lineTo(xPos,yPosition);co.lineTo(lineCoords[0][0],yPosition);}} co.fillStyle=!this.hidden(index)?fill:'rgba(0,0,0,0)';co.fill();co.beginPath();} co.stroke();if(prop['chart.backdrop']){this.DrawBackdrop(lineCoords,color);} co.save();co.beginPath();if(prop['chart.animation.trace.center']){co.rect((ca.width/2)*(1-prop['chart.animation.trace.clip']),0,ca.width*prop['chart.animation.trace.clip'],ca.height);}else{co.rect(0,0,ca.width*prop['chart.animation.trace.clip'],ca.height);} co.clip();if(typeof prop['chart.errorbars']!=='null'){this.drawErrorbars();} this.SetShadow(index);this.redrawLine(lineCoords,color,linewidth,index);co.stroke();RG.NoShadow(this);for(var i=0;i(ca.height-this.gutterBottom))&&!prop['chart.outofbounds']){return;}else if((yPos=len;--i){if(RG.is_null(this.coords[i][1])){co.moveTo(this.coords[i][0],this.coords[i][1])}else{co.lineTo(this.coords[i][0],this.coords[i][1])}} co.fill();co.restore();}}};this.redrawLine=this.RedrawLine=function(coords,color,linewidth,index) {if(prop['chart.noredraw']||prop['chart.filled.range']){return;} co.strokeStyle=(typeof(color)=='object'&&color&&color.toString().indexOf('CanvasGradient')==-1?color[0]:color);co.lineWidth=linewidth;if(prop['chart.dashed']){co.setLineDash([2,6])}else if(prop['chart.dotted']){co.setLineDash([1,5])} if(this.hidden(index)){co.strokeStyle='rgba(0,0,0,0)';} if(!RG.ISOLD&&(prop['chart.curvy']||prop['chart.spline'])){this.DrawCurvyLine(coords,this.hidden(index)?'rgba(0,0,0,0)':color,linewidth,index);return;} co.beginPath();var len=coords.length;var width=ca.width var height=ca.height;var penUp=false;for(var i=0;i0){var prevX=coords[i-1][0];var prevY=coords[i-1][1];} if(((i==0&&coords[i])||(yPos(height-this.gutterBottom))||(i>0&&prevX>(width-this.gutterRight))||(i>0&&prevY>(height-this.gutterBottom))||prevY==null||penUp==true)&&(!prop['chart.outofbounds']||yPos==null||prevY==null)){if(RG.ISOLD&&yPos==null){}else{co.moveTo(coords[i][0],coords[i][1]);} penUp=false;}else{if(prop['chart.stepped']&&i>0){co.lineTo(coords[i][0],coords[i-1][1]);} co.lineTo(coords[i][0],coords[i][1]);penUp=false;}} if(prop['chart.colors.alternate']&&typeof(color)=='object'&&color[0]&&color[1]){for(var i=1;i=(x-prop['chart.tooltips.hotspot.size'])&&mouseY<=(y+prop['chart.tooltips.hotspot.size'])&&mouseY>=(y-prop['chart.tooltips.hotspot.size'])){if(RG.parseTooltipText){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],i);} var dataset=0,idx=i;while((idx+1)>this.data[dataset].length){idx-=this.data[dataset].length;dataset++;} if(this.hidden(dataset)){continue;} return{0:obj,object:obj,1:x,x:x,2:y,y:y,3:i,index:i,tooltip:tooltip,dataset:dataset,index_adjusted:idx};}else if(prop['chart.tooltips.hotspot.xonly']==true&&mouseX<=(x+prop['chart.tooltips.hotspot.size'])&&mouseX>=(x-prop['chart.tooltips.hotspot.size'])){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],i);return{0:obj,object:obj,1:x,x:x,2:y,y:y,3:i,index:i,tooltip:tooltip};}}};this.drawAboveLabels=this.DrawAboveLabels=function() {var size=prop['chart.labels.above.size'],font=prop['chart.labels.above.font']||prop['chart.text.font'],units_pre=prop['chart.labels.above.units.pre'],units_post=prop['chart.labels.above.units.post'],decimals=prop['chart.labels.above.decimals'],color=prop['chart.labels.above.color']||prop['chart.text.color'],bgcolor=prop['chart.labels.above.background']||'white',border=((typeof prop['chart.labels.above.border']==='boolean'||typeof prop['chart.labels.above.border']==='number')?prop['chart.labels.above.border']:true),offsety=prop['chart.labels.above.offsety']+size,specific=prop['chart.labels.above.specific'];co.beginPath();for(var i=0,len=this.coords.length;i0){for(var i=(this.coordsSpline[index-1].length-1);i>=0;i-=1){co.lineTo(this.coordsSpline[index-1][i][0],this.coordsSpline[index-1][i][1]);}}else{co.lineTo(coords[coords.length-1][0],xaxisY);} co.fill();} co.beginPath();this.DrawSpline(co,yCoords,color,index);co.stroke();};this.getValue=function(arg) {if(arg.length==2){var mouseX=arg[0];var mouseY=arg[1];}else{var mouseCoords=RG.getMouseXY(arg);var mouseX=mouseCoords[0];var mouseY=mouseCoords[1];} var obj=this;var xaxispos=prop['chart.xaxispos'];if(mouseY(ca.height-prop['chart.gutter.bottom'])){return xaxispos=='bottom'?this.min:this.max;} if(prop['chart.xaxispos']=='center'){var value=(((obj.grapharea/2)-(mouseY-prop['chart.gutter.top']))/obj.grapharea)*(obj.max-obj.min);value*=2;value>0?value+=this.min:value-=this.min;return value;}else if(prop['chart.xaxispos']=='top'){var value=((obj.grapharea-(mouseY-prop['chart.gutter.top']))/obj.grapharea)*(obj.max-obj.min);value=Math.abs(obj.max-value)* -1;return value;}else{var value=((obj.grapharea-(mouseY-prop['chart.gutter.top']))/obj.grapharea)*(obj.max-obj.min) value+=obj.min;return value;}};this.highlight=this.Highlight=function(shape) {if(prop['chart.tooltips.highlight']){if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else if(prop['chart.highlight.style']==='halo'){var obj=shape.object,color=prop['chart.colors'][shape.dataset];RG.path2(obj.context,'b a % % 13 0 6.2830 false f rgba(255,255,255,0.75)',shape.x,shape.y);RG.path2(obj.context,'ga 0.15 b a % % 13 0 6.2830 false f % ga 1',shape.x,shape.y,color);RG.path2(obj.context,'b a % % 7 0 6.2830 false f white',shape.x,shape.y);RG.path2(obj.context,'b a % % 5 0 6.2830 false f %',shape.x,shape.y,color);}else{RG.Highlight.Point(this,shape);}}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if((mouseXY[0]>prop['chart.gutter.left']-5)&&mouseXY[0]<(ca.width-prop['chart.gutter.right']+5)&&mouseXY[1]>(prop['chart.gutter.top']-5)&&mouseXY[1]<(ca.height-prop['chart.gutter.bottom']+5)){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){var value=Number(this.getValue(e));var shape=RG.Registry.Get('chart.adjusting.shape');if(shape){RG.Registry.Set('chart.adjusting.shape',shape);this.original_data[shape['dataset']][shape['index_adjusted']]=Number(value);RG.redrawCanvas(e.target);RG.fireCustomEvent(this,'onadjust');}}};this.getYCoord=function(value) {if(typeof(value)!='number'){return null;} var y;var xaxispos=prop['chart.xaxispos'];if(xaxispos=='top'){y=((value-this.min)/(this.max-this.min))*this.grapharea;if(prop['chart.scale.invert']){y=this.grapharea-y;} y=y+this.gutterTop}else if(xaxispos=='center'){y=((value-this.min)/(this.max-this.min))*(this.grapharea/2);y=(this.grapharea/2)-y;y+=this.gutterTop;}else{if((valuethis.max)&&prop['chart.outofbounds']==false){return null;} y=((value-this.min)/(this.max-this.min))*this.grapharea;if(prop['chart.scale.invert']){y=this.grapharea-y;} y=ca.height-this.gutterBottom-y;} return y;};this.drawSpline=this.DrawSpline=function(context,coords,color,index) {this.coordsSpline[index]=[];var xCoords=[];var gutterLeft=prop['chart.gutter.left'];var gutterRight=prop['chart.gutter.right'];var hmargin=prop['chart.hmargin'];var interval=(ca.width-(gutterLeft+gutterRight)-(2*hmargin))/(coords.length-1);co.strokeStyle=color;for(var i=0,len=coords.length;icenter_value){dataset[j]=original_data[i][j]-((original_data[i][j]-center_value)*(frame/frames));}else{dataset[j]=original_data[i][j]+(((center_value-original_data[i][j])/frames)*frame);}}}} RG.clear(obj.canvas);RG.redrawCanvas(obj.canvas) if(frame++0)?0:half;}} RG.clear(obj.canvas);obj.trace2({frames:frames/2},unfoldCallback);return obj;};this.unfoldFromCenter=function() {var obj=this;var opt=arguments[0]||{};var frames=opt.frames||30;var frame=0;var callback=arguments[1]||function(){};obj.canvas.style.visibility='hidden';obj.Draw();var max=obj.scale2.max;RG.clear(obj.canvas);obj.canvas.style.visibility='visible';var center_value=obj.Get('chart.xaxispos')==='center'?prop['chart.ymin']:((obj.max-obj.min)/2)+obj.min;var original_data=RG.array_clone(obj.original_data);var steps=null;obj.Set('chart.ymax',max);if(!steps){steps=[];for(var dataset=0,len=original_data.length;dataset0){steps[dataset][i]=original_data[dataset][i]/frames;obj.original_data[dataset][i]=center_value;}else{steps[dataset][i]=(original_data[dataset][i]-center_value)/frames;obj.original_data[dataset][i]=center_value;}}}} function unfoldFromCenter() {for(var dataset=0;dataset0){RG.Effects.updateCanvas(unfoldFromCenter);}else{obj.original_data=RG.array_clone(original_data);RG.clear(obj.canvas);RG.redrawCanvas(obj.canvas);callback(obj);}} unfoldFromCenter();return this;};this.isAdjustable=function(shape) {if(RG.isNull(prop['chart.adjustable.only'])){return true;} if(RG.isArray(prop['chart.adjustable.only'])&&prop['chart.adjustable.only'][shape.index]){return true;} return false;};RG.Register(this);if(parseConfObjectForOptions){RG.parseObjectStyleConfig(this,conf.options);} for(var i=0;ithis.max)this.value=this.max;if(this.value40?40:(this.radius*0.06);co.arc(this.centerx,this.centery,r,0,RG.TWOPI,0);co.fill();RG.NoShadow(this);} if(prop['chart.tickmarks.small.num']){for(var i=0;i<(prop['chart.angles.end']-prop['chart.angles.start']);i+=(RG.PI/prop['chart.tickmarks.small.num'])){co.beginPath();co.strokeStyle=prop['chart.tickmarks.small.color'];co.arc(this.centerx,this.centery,this.radius,prop['chart.angles.start']+i,prop['chart.angles.start']+i+0.00001,0);co.arc(this.centerx,this.centery,this.radius-5,prop['chart.angles.start']+i,prop['chart.angles.start']+i+0.00001,0);co.stroke();} co.beginPath();co.fillStyle=prop['chart.background.color'];co.arc(this.centerx,this.centery,this.radius-4,prop['chart.angles.start'],prop['chart.angles.end'],false);co.closePath();co.fill();} if(prop['chart.tickmarks.big.num']){var colors=['white','white',prop['chart.tickmarks.big.color']];for(var j=0;j0){co.arc(this.centerx,this.centery,prop['chart.segment.radius.start'],(((ranges[i][1]-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],(((ranges[i][0]-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],true);}else{co.lineTo(this.centerx,this.centery);} co.closePath();co.stroke();co.fill();} co.beginPath();}else{co.lineWidth=prop['chart.linewidth'];co.strokeStyle=prop['chart.strokestyle']?prop['chart.strokestyle']:prop['chart.green.color'];co.fillStyle=prop['chart.green.color'];co.lineWidth=prop['chart.linewidth.segments'];co.beginPath();co.arc(this.centerx,this.centery,this.radius*0.85,(((prop['chart.green.start']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-this.properties['chart.angles.start']))+prop['chart.angles.start'],(((prop['chart.green.end']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],false);if(prop['chart.segment.radius.start']>0){co.arc(this.centerx,this.centery,prop['chart.segment.radius.start'],(((prop['chart.green.end']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],(((prop['chart.green.start']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],true);}else{co.lineTo(this.centerx,this.centery);} co.closePath();co.stroke();co.fill();co.strokeStyle=prop['chart.strokestyle']?prop['chart.strokestyle']:prop['chart.yellow.color'];co.fillStyle=prop['chart.yellow.color'];co.lineWidth=prop['chart.linewidth.segments'];co.beginPath();co.arc(this.centerx,this.centery,this.radius*0.85,(((prop['chart.yellow.start']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],(((prop['chart.yellow.end']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],false);if(prop['chart.segment.radius.start']>0){co.arc(this.centerx,this.centery,prop['chart.segment.radius.start'],(((prop['chart.yellow.end']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],(((prop['chart.yellow.start']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],true);}else{co.lineTo(this.centerx,this.centery);} co.closePath();co.stroke();co.fill();co.strokeStyle=prop['chart.strokestyle']?prop['chart.strokestyle']:prop['chart.red.color'];co.fillStyle=prop['chart.red.color'];co.lineWidth=prop['chart.linewidth.segments'];co.beginPath();co.arc(this.centerx,this.centery,this.radius*0.85,(((prop['chart.red.start']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],(((prop['chart.red.end']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],false);if(prop['chart.segment.radius.start']>0){co.arc(this.centerx,this.centery,prop['chart.segment.radius.start'],(((prop['chart.red.end']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],(((prop['chart.red.start']-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'],true);}else{co.lineTo(this.centerx,this.centery);} co.closePath();co.stroke();co.fill();co.lineWidth=1;} if(prop['chart.border']){co.strokeStyle=prop['chart.border.color'];co.lineWidth=prop['chart.linewidth'];co.beginPath();co.moveTo(this.centerx,this.centery);co.arc(this.centerx,this.centery,this.radius,prop['chart.angles.start'],prop['chart.angles.end'],false);co.closePath();} co.stroke();co.lineWidth=1;};this.drawNeedle=this.DrawNeedle=function() {var a=(((this.value-this.min)/(this.max-this.min))*(prop['chart.angles.end']-prop['chart.angles.start']))+prop['chart.angles.start'];if(typeof prop['chart.needle.image.url']==='string'&&!this.__needle_image__){var img=new Image();this.__needle_image__=img;img.src=prop['chart.needle.image.url'];img.onload=function() {co.save();RG.rotateCanvas(ca,this.centerx,this.centery,a);co.drawImage(this,this.centerx+prop['chart.needle.image.offsetx'],this.centery+prop['chart.needle.image.offsety']);co.restore();RG.redraw();}}else if(this.__needle_image__){co.save();RG.rotateCanvas(ca,this.centerx,this.centery,a);co.drawImage(this.__needle_image__,this.centerx+prop['chart.needle.image.offsetx'],this.centery+prop['chart.needle.image.offsety']);co.restore();} var needleRadius=typeof(prop['chart.needle.radius'])=='number'?prop['chart.needle.radius']:this.radius*0.7;if(prop['chart.needle.type']==='pointer'){var r=(this.radius*0.06)>40?40:(this.radius*0.06);co.beginPath();co.fillStyle=prop['chart.needle.color'];co.moveTo(this.centerx,this.centery);co.arc(this.centerx,this.centery,r,0,RG.TWOPI,false);co.fill();co.beginPath();co.arc(this.centerx,this.centery,r,a+RG.HALFPI,a+RG.HALFPI+0.0001,false);co.arc(this.centerx,this.centery,needleRadius,a,a+0.001,false);co.arc(this.centerx,this.centery,r,a-RG.HALFPI,a-RG.HALFPI+0.001,false);co.fill();}else{co.fillStyle='black';co.lineWidth=this.radius>=200?7:3;co.lineCap='round';co.beginPath();co.strokeStyle=prop['chart.needle.color'];if(typeof(prop['chart.needle.linewidth'])=='number')co.lineWidth=prop['chart.needle.linewidth'];co.arc(this.centerx,this.centery,needleRadius,a,a+0.001,false);co.lineTo(this.centerx,this.centery);co.stroke();if(prop['chart.needle.head']){co.fillStyle=prop['chart.needle.color'];co.beginPath();co.lineWidth=1;co.arc(this.centerx,this.centery,needleRadius+15,a,a+0.001,0);co.arc(this.centerx,this.centery,needleRadius-15,a+0.087,a+0.087999,0);co.arc(this.centerx,this.centery,needleRadius-15,a-0.087,a-0.087999,1);co.fill();} if(prop['chart.needle.tail']){co.beginPath();co.strokeStyle=prop['chart.needle.color'];if(typeof(prop['chart.needle.linewidth'])=='number')co.lineWidth=prop['chart.needle.linewidth'];var a=((this.value-this.min)/(this.max-this.min)*(this.properties['chart.angles.end']-this.properties['chart.angles.start']))+this.properties['chart.angles.start']+RG.PI;co.arc(this.centerx,this.centery,25,a,a+0.001,false);co.lineTo(this.centerx,this.centery);co.stroke();} var r=(this.radius*0.06)>40?40:(this.radius*0.06);co.beginPath();co.fillStyle=prop['chart.centerpin.stroke'];co.arc(this.centerx,this.centery,r,0+0.001,RG.TWOPI,0);co.fill();co.fillStyle=prop['chart.centerpin.fill'];co.beginPath();co.arc(this.centerx,this.centery,r-2,0+0.001,RG.TWOPI,0);co.fill();}};this.drawLabels=this.DrawLabels=function() {if(!prop['chart.labels']){return;} var radius=this.radius,text_size=prop['chart.text.size'],text_font=prop['chart.text.font'],units_post=prop['chart.units.post'],units_pre=prop['chart.units.pre'],centerx=this.centerx,centery=this.centery,min=this.min,max=this.max,decimals=prop['chart.scale.decimals'],numLabels=prop['chart.labels.count'],offset=prop['chart.labels.radius.offset'],specific=prop['chart.labels.specific'];if(specific){for(var i=0;ithis.radius){return null;} if(angle(this.centerx-this.radius)&&mouseXY[0]<(this.centerx+this.radius)&&mouseXY[1]>(this.centery-this.radius)&&mouseXY[1]<(this.centery+this.radius)&&radius<=this.radius){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){this.value=this.getValue(e);RG.clear(this.canvas);RG.redrawCanvas(this.canvas);RG.fireCustomEvent(this,'onadjust');}};this.getAngle=function(value) {if(value>this.max||value0);}};ModalDialog.show=ModalDialog.Show;ModalDialog.draw=ModalDialog.Show;ModalDialog.Hide=ModalDialog.Close;ModalDialog.hide=ModalDialog.Close;ModalDialog.close=ModalDialog.Close;for(i in ModalDialog){if(typeof ModalDialog[i]==='function'){ModalDialog[i.toLowerCase()]=ModalDialog[i]}} ================================================ FILE: docs/RGraph/libraries/RGraph.odo.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.Odometer=function(conf) {if(typeof conf==='object'&&typeof conf.value!=='undefined'&&typeof conf.id==='string'){var id=conf.id var canvas=document.getElementById(id);var min=conf.min;var max=conf.max;var value=conf.value;var parseConfObjectForOptions=true;}else{var id=conf;var canvas=document.getElementById(id);var min=arguments[1];var max=arguments[2];var value=arguments[3];} this.id=id;this.canvas=canvas;this.context=this.canvas.getContext?this.canvas.getContext("2d",{alpha:(typeof id==='object'&&id.alpha===false)?false:true}):null;this.canvas.__object__=this;this.type='odo';this.isRGraph=true;this.min=RGraph.stringsToNumbers(min);this.max=RGraph.stringsToNumbers(max);this.value=RGraph.stringsToNumbers(value);this.currentValue=null;this.uid=RGraph.CreateUID();this.canvas.uid=this.canvas.uid?this.canvas.uid:RGraph.CreateUID();this.colorsParsed=false;this.coordsText=[];this.original_colors=[];this.firstDraw=true;this.properties={'chart.background.border':'black','chart.background.color':'#eee','chart.background.lines.color':'#ddd','chart.centerx':null,'chart.centery':null,'chart.radius':null,'chart.value.text':false,'chart.value.text.decimals':0,'chart.needle.color':'black','chart.needle.width':2,'chart.needle.head':true,'chart.needle.tail':true,'chart.needle.type':'pointer','chart.needle.extra':[],'chart.needle.triangle.border':'#aaa','chart.text.size':12,'chart.text.color':'black','chart.text.font':'Arial, Verdana, sans-serif','chart.text.accessible':false,'chart.text.accessible.overflow':'visible','chart.text.accessible.pointerevents':false,'chart.green.max':max*0.75,'chart.red.min':max*0.9,'chart.green.color':'Gradient(white:#0c0)','chart.yellow.color':'Gradient(white:#ff0)','chart.red.color':'Gradient(white:#f00)','chart.label.area':35,'chart.gutter.left':25,'chart.gutter.right':25,'chart.gutter.top':25,'chart.gutter.bottom':25,'chart.title':'','chart.title.background':null,'chart.title.hpos':null,'chart.title.vpos':null,'chart.title.font':null,'chart.title.bold':true,'chart.title.x':null,'chart.title.y':null,'chart.title.halign':null,'chart.title.valign':null,'chart.contextmenu':null,'chart.linewidth':1,'chart.shadow.inner':false,'chart.shadow.inner.color':'black','chart.shadow.inner.offsetx':3,'chart.shadow.inner.offsety':3,'chart.shadow.inner.blur':6,'chart.shadow.outer':false,'chart.shadow.outer.color':'black','chart.shadow.outer.offsetx':3,'chart.shadow.outer.offsety':3,'chart.shadow.outer.blur':6,'chart.annotatable':false,'chart.annotate.color':'black','chart.scale.decimals':0,'chart.scale.point':'.','chart.scale.thousand':',','chart.zoom.factor':1.5,'chart.zoom.fade.in':true,'chart.zoom.fade.out':true,'chart.zoom.hdir':'right','chart.zoom.vdir':'down','chart.zoom.frames':25,'chart.zoom.delay':16.666,'chart.zoom.shadow':true,'chart.zoom.background':true,'chart.zoom.action':'zoom','chart.resizable':false,'chart.resize.handle.adjust':[0,0],'chart.resize.handle.background':null,'chart.units.pre':'','chart.units.post':'','chart.border':false,'chart.border.color1':'#BEBCB0','chart.border.color2':'#F0EFEA','chart.border.color3':'#BEBCB0','chart.tickmarks':true,'chart.tickmarks.highlighted':false,'chart.tickmarks.big.color':'#999','chart.zerostart':false,'chart.labels':null,'chart.units.pre':'','chart.units.post':'','chart.value.units.pre':'','chart.value.units.post':'','chart.key':null,'chart.key.background':'white','chart.key.position':'graph','chart.key.shadow':false,'chart.key.shadow.color':'#666','chart.key.shadow.blur':3,'chart.key.shadow.offsetx':2,'chart.key.shadow.offsety':2,'chart.key.position.gutter.boxed':false,'chart.key.position.x':null,'chart.key.position.y':null,'chart.key.halign':'right','chart.key.color.shape':'square','chart.key.rounded':true,'chart.key.text.size':10,'chart.key.colors':null,'chart.key.text.color':'black','chart.adjustable':false,'chart.clearto':'rgba(0,0,0,0)'} if(!this.canvas.__rgraph_aa_translated__){this.context.translate(0.5,0.5);this.canvas.__rgraph_aa_translated__=true;} var RG=RGraph,ca=this.canvas,co=ca.getContext('2d'),prop=this.properties,pa2=RG.path2,win=window,doc=document,ma=Math if(RG.Effects&&typeof RG.Effects.decorate==='function'){RG.Effects.decorate(this);} this.set=this.Set=function(name,value) {var value=arguments[1]||null;if(arguments.length===1&&typeof name==='object'){RG.parseObjectStyleConfig(this,name);return this;} if(name.substr(0,6)!='chart.'){name='chart.'+name;} while(name.match(/([A-Z])/)){name=name.replace(/([A-Z])/,'.'+RegExp.$1.toLowerCase());} if(name=='chart.needle.style'){alert('[RGRAPH] The RGraph property chart.needle.style has changed to chart.needle.color');} if(name=='chart.needle.thickness'){name='chart.needle.width';} if(name=='chart.value'){this.value=value;return;} prop[name]=value;return this;};this.get=this.Get=function(name) {if(name.substr(0,6)!='chart.'){name='chart.'+name;} while(name.match(/([A-Z])/)){name=name.replace(/([A-Z])/,'.'+RegExp.$1.toLowerCase());} if(name=='chart.value'){return this.value;} return prop[name.toLowerCase()];};this.draw=this.Draw=function() {RG.FireCustomEvent(this,'onbeforedraw');this.currentValue=this.value;if(this.value>this.max){this.value=this.max;} if(this.value0&&ca.width>ca.height)this.centerx=5+this.radius;if(typeof(prop['chart.centerx'])=='number')this.centerx=prop['chart.centerx'];if(typeof(prop['chart.centery'])=='number')this.centery=prop['chart.centery'];if(typeof(prop['chart.radius'])=='number'){this.radius=prop['chart.radius'];if(prop['chart.border']){this.radius-=25;}} if(!this.colorsParsed){this.parseColors();this.colorsParsed=true;} co.lineWidth=prop['chart.linewidth'];this.DrawBackground();this.DrawLabels();this.DrawNeedle(this.value,prop['chart.needle.color']);if(prop['chart.needle.extra'].length>0){for(var i=0;i0){var colors=[prop['chart.needle.color']];if(prop['chart.needle.extra'].length>0){for(var i=0;i=this.centerx&&mouseXY[1]<=this.centery){angle-=RG.TWOPI;} var value=((angle/RG.TWOPI)*(this.max-this.min))+this.min;return value;};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);var radius=RG.getHypLength(this.centerx,this.centery,mouseXY[0],mouseXY[1]);if(mouseXY[0]>(this.centerx-this.radius)&&mouseXY[0]<(this.centerx+this.radius)&&mouseXY[1]>(this.centery-this.radius)&&mouseXY[1]<(this.centery+this.radius)&&radius<=this.radius){return this;}};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){this.value=this.getValue(e);RG.clear(ca);RG.redrawCanvas(ca);RG.fireCustomEvent(this,'onadjust');}};this.getAngle=function(value) {if(value>this.max||value0){return this.draw3d();} RG.DrawTitle(this,prop['chart.title'],(ca.height/2)-this.radius-5,this.centerx,prop['chart.title.size']?prop['chart.title.size']:prop['chart.text.size']+2);this.total=RG.array_sum(this.data);var tot=this.total;var data=this.data;for(var i=0,len=this.data.length;i0){this.DrawBorders();} var len=this.angles.length;var r=this.radius;for(var action=0;action<2;action+=1){for(var i=0;i0)||typeof(prop['chart.exploded'])=='number'){var explosion=typeof(prop['chart.exploded'])=='number'?prop['chart.exploded']:prop['chart.exploded'][index];var x=0;var y=0;var h=explosion;var t=subTotal+(radians/2);var x=(Math.cos(t)*explosion);var y=(Math.sin(t)*explosion);var r=this.radius;co.moveTo(this.centerx+x,this.centery+y);}else{var x=0;var y=0;var r=this.radius;} var startAngle=subTotal;var endAngle=((subTotal+radians));co.arc(this.centerx+x,this.centery+y,r,startAngle,endAngle,0);if(prop['chart.variant']=='donut'){co.arc(this.centerx+x,this.centery+y,typeof(prop['chart.variant.donut.width'])=='number'?r-prop['chart.variant.donut.width']:r/2,endAngle,startAngle,true);}else{co.lineTo(this.centerx+x,this.centery+y);} co.closePath();this.angles.push([subTotal,subTotal+radians,this.centerx+x,this.centery+y]);co.fill();this.subTotal+=radians;};this.drawLabels=this.DrawLabels=function() {if(prop['chart.labels'].length&&prop['chart.labels.sticks.list']){return this.drawLabelsList();} var hAlignment='left',vAlignment='center',labels=prop['chart.labels'],context=co,font=prop['chart.text.font'],bold=prop['chart.labels.bold'],text_size=prop['chart.text.size'],cx=this.centerx,cy=this.centery,r=this.radius;RG.noShadow(this);co.fillStyle='black';co.beginPath();if(labels&&labels.length){for(i=0;i(RG.TWOPI+RG.HALFPI)?2:-2):0),y=cy+explosion_offsety+(((r+10)*Math.sin(a)));if(this.coordsSticks&&this.coordsSticks[i]){var x=this.coordsSticks[i][4][0]+(x(-1*RG.HALFPI)&&angle=0;y+=vspace_left,i--){if(labels_left[i][2]){var x=this.centerx-this.radius-offset,idx=labels_left[i][0],explosionX=labels_left[i][6][0]?labels_left[i][6][1]:0,explosionY=labels_left[i][6][0]?labels_left[i][6][2]:0 var ret=RG.text2(this,{font:text_font,size:text_size,x:x+explosionX,y:y+explosionY,text:labels_left[i][2],valign:'center',halign:'right',tag:'labels',color:labels_left[i][5]});if(ret&&ret.node){ret.node.__index__=labels_left[i][0];} pa2(co,'lw % b m % % qc % % % % s %',prop['chart.labels.sticks.linewidth'],labels_left[i][3][0]+explosionX,labels_left[i][3][1]+explosionY,this.centerx-this.radius-25+explosionX,ma.round(labels_left[i][4][1]+explosionY),ret.x+5+ret.width,ret.y+(ret.height/2),labels_left[i][5]);}}};this.drawSticks=this.DrawSticks=function() {var offset=prop['chart.linewidth']/2,exploded=prop['chart.exploded'],sticks=prop['chart.labels.sticks'],colors=prop['chart.colors'],cx=this.centerx,cy=this.centery,radius=this.radius,points=[],linewidth=prop['chart.labels.sticks.linewidth'] for(var i=0,len=this.angles.length;icx?5:-5);points[4]=[points[2][0]+(points[2][0]>cx?5+prop['chart.labels.sticks.hlength']:-5-prop['chart.labels.sticks.hlength']),points[2][1]];co.moveTo(points[0][0],points[0][1]);co.quadraticCurveTo(points[2][0],points[2][1],points[4][0],points[4][1]);co.stroke();this.coordsSticks[i]=[points[0],points[1],points[2],points[3],points[4]];}};this.getShape=this.getSegment=function(e) {RG.FixEventObject(e);var accuracy=arguments[1]?arguments[1]:0;var canvas=ca;var context=co;var mouseCoords=RG.getMouseXY(e);var mouseX=mouseCoords[0];var mouseY=mouseCoords[1];var r=this.radius;var angles=this.angles;var ret=[];for(var i=0,len=angles.length;iRG.TWOPI)ret[4]-=RG.TWOPI;var tooltip=RG.parseTooltipText?RG.parseTooltipText(prop['chart.tooltips'],ret[5]):null;ret['object']=this;ret['x']=ret[0];ret['y']=ret[1];ret['radius']=ret[2];ret['angle.start']=ret[3];ret['angle.end']=ret[4];ret['index']=ret[5];ret['tooltip']=tooltip;return ret;} return null;};this.drawBorders=this.DrawBorders=function() {if(prop['chart.linewidth']>0){co.lineWidth=prop['chart.linewidth'];co.strokeStyle=prop['chart.strokestyle'];var r=this.radius;for(var i=0,len=this.angles.length;i-1){co.arc(shape['x'],shape['y'],shape['radius'],shape['angle.start'],shape['angle.end'],false);co.arc(shape['x'],shape['y'],typeof(prop['chart.variant.donut.width'])=='number'?this.radius-prop['chart.variant.donut.width']:shape['radius']/2,shape['angle.end'],shape['angle.start'],true);}else{co.arc(shape['x'],shape['y'],shape['radius']+1,shape['angle.start'],shape['angle.end'],false);co.lineTo(shape['x'],shape['y']);} co.closePath();co.stroke();co.fill();}}};this.getObjectByXY=function(e) {if(this.getShape(e)){return this;}};this.drawCenterpin=this.DrawCenterpin=function() {if(typeof(prop['chart.centerpin'])=='number'&&prop['chart.centerpin']>0){var cx=this.centerx;var cy=this.centery;co.beginPath();co.strokeStyle=prop['chart.centerpin.stroke']?prop['chart.centerpin.stroke']:prop['chart.strokestyle'];co.fillStyle=prop['chart.centerpin.fill']?prop['chart.centerpin.fill']:prop['chart.strokestyle'];co.moveTo(cx,cy);co.arc(cx,cy,prop['chart.centerpin'],0,RG.TWOPI,false);co.stroke();co.fill();}};this.drawInGraphLabels=this.DrawInGraphLabels=function() {var context=co;var cx=this.centerx;var cy=this.centery;var radius=prop['chart.labels.ingraph.radius'];if(radius<=2&&radius>0){radiusFactor=radius;}else{radiusFactor=0.5;} if(prop['chart.variant']=='donut'){var r=this.radius*(0.5+(radiusFactor*0.5));if(typeof(prop['chart.variant.donut.width'])=='number'){var r=(this.radius-prop['chart.variant.donut.width'])+(prop['chart.variant.donut.width']/2);}}else{var r=this.radius*radiusFactor;} if(radius>2){r=radius;} for(var i=0,len=this.angles.length;ithis.total){return null;} var angle=(value/this.total)*RG.TWOPI;angle+=prop['chart.origin'];return angle;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.arrayClone(prop['chart.colors']);this.original_colors['chart.key.colors']=RG.arrayClone(prop['chart.key.colors']);this.original_colors['chart.strokestyle']=RG.arrayClone(prop['chart.strokestyle']);this.original_colors['chart.highlight.stroke']=RG.arrayClone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.style.twod.fill']=RG.arrayClone(prop['chart.highlight.style.twod.fill']);this.original_colors['chart.highlight.style.twod.stroke']=RG.arrayClone(prop['chart.highlight.style.twod.stroke']);this.original_colors['chart.ingraph.bounding.fill']=RG.arrayClone(prop['chart.ingraph.bounding.fill']);this.original_colors['chart.ingraph.color']=RG.arrayClone(prop['chart.ingraph.color']);} for(var i=0;i0;i-=1){this.set({centeryAdjust:i});if(i===parseInt(depth/2)){this.set({labels:prop_labels,labelsSticks:prop_labelsSticks});} if(i===0){this.set({shadow:prop_shadow});} this.draw();this.set('shadow',false);if(i<=parseInt(depth/2)){this.set({labels:[],labelsSticks:false});} if(i>1){if(prop['chart.variant'].indexOf('donut')!==-1){for(var j=0;j0){co.lineTo(coords_dataset[0][0],coords_dataset[0][1]);co.moveTo(last_coords[0][0],last_coords[0][1]);for(var i=coords_dataset.length-1;i>=0;--i){co.lineTo(last_coords[i][0],last_coords[i][1]);}} var last_coords=coords_dataset;co.closePath();co.stroke();co.fill();} if(typeof(alpha)=='number'){co.globalAlpha=oldAlpha;}};this.getCoordinates=this.GetCoordinates=function(dataset,index) {var len=this.data[dataset].length;var mag=(this.data[dataset][index]/this.max)*this.radius;var angle=(RG.TWOPI/len)*index;angle-=RG.HALFPI;var x=Math.cos(angle)*mag;var y=Math.sin(angle)*mag;x=this.centerx+x;y=this.centery+y;return[x,y];};this.drawLabels=this.DrawLabels=function() {var labels=prop['chart.labels'];if(labels&&labels.length>0){co.lineWidth=1;co.strokeStyle='gray';co.fillStyle=prop['chart.labels.color']||prop['chart.text.color'];var bgFill=prop['chart.labels.background.fill'],bold=prop['chart.labels.bold'],bgBoxed=prop['chart.labels.boxed'],offset=prop['chart.labels.offset'],font=prop['chart.text.font'],size=prop['chart.text.size'],radius=this.radius,color=prop['chart.labels.color']||prop['chart.text.color'] for(var i=0;i-1){for(var i=0;i-1){for(var i=0;i-1){for(var i=0;i-1){for(var i=0;i-1)RG.Text2(this,{'tag':'labels.specific','bold':reversed_bold[i],'font':font,'size':size,'x':this.centerx,'y':this.centery-this.radius+((this.radius/labels.length)*i),'text':reversed_labels[i],'valign':'center','halign':'center','bounding':reversed_boxed[i],'boundingFill':'white'});if(axes.indexOf('s')>-1)RG.Text2(this,{'tag':'labels.specific','bold':bold[i],'font':font,'size':size,'x':this.centerx,'y':this.centery+((this.radius/labels.length)*(i+1)),'text':labels[i],'valign':'center','halign':'center','bounding':boxed[i],'boundingFill':'white'});if(axes.indexOf('w')>-1)RG.Text2(this,{'tag':'labels.specific','bold':reversed_bold[i],'font':font,'size':size,'x':this.centerx-this.radius+((this.radius/labels.length)*i),'y':this.centery,'text':reversed_labels[i],'valign':'center','halign':'center','bounding':reversed_boxed[i],'boundingFill':'white'});if(axes.indexOf('e')>-1)RG.Text2(this,{'tag':'labels.specific','bold':bold[i],'font':font,'size':size,'x':this.centerx+((this.radius/labels.length)*(i+1)),'y':this.centery,'text':labels[i],'valign':'center','halign':'center','bounding':boxed[i],'boundingFill':'white'});}};this.getShape=this.getPoint=function(e) {for(var i=0;i(x-5)&&mouseY>(y-5)&&mouseY<(y+5)){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],index);return{0:this,'object':this,1:x,'x':x,2:y,'y':y,3:null,'dataset':null,4:index,'index':i,'tooltip':tooltip}}}};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{RG.Highlight.Point(this,shape);}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if(mouseXY[0]>(this.centerx-this.radius)&&mouseXY[0]<(this.centerx+this.radius)&&mouseXY[1]>(this.centery-this.radius)&&mouseXY[1]<(this.centery+this.radius)){return this;}};this.drawHighlights=this.DrawHighlights=function() {if(prop['chart.highlights']){var sequentialIdx=0;var dataset=0;var index=0;var radius=prop['chart.highlights.radius'];for(var dataset=0;datasetthis.max){return null;} var radius=(value/this.max)*this.radius;return radius;};this.getAngle=function(numitems,index) {var angle=(RG.TWOPI/numitems)*index;angle-=RG.HALFPI;return angle;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.arrayClone(prop['chart.colors']);this.original_colors['chart.key.colors']=RG.arrayClone(prop['chart.key.colors']);this.original_colors['chart.title.color']=RG.arrayClone(prop['chart.title.color']);this.original_colors['chart.text.color']=RG.arrayClone(prop['chart.text.color']);this.original_colors['chart.highlight.stroke']=RG.arrayClone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.arrayClone(prop['chart.highlight.fill']);this.original_colors['chart.circle.fill']=RG.arrayClone(prop['chart.circle.fill']);this.original_colors['chart.circle.stroke']=RG.arrayClone(prop['chart.circle.stroke']);this.original_colors['chart.strokestyle']=RG.arrayClone(prop['chart.strokestyle']);} for(var i=0;i=0;--dataset){co.beginPath();co.moveTo(obj.coords2[dataset][0][0],obj.coords2[dataset][0][1]);for(var j=0;j0){co.lineTo(obj.coords2[dataset-1][0][0],obj.coords2[dataset-1][0][1]);for(var j=(obj.coords2[dataset-1].length-1);j>=0;--j){co.lineTo(obj.coords2[dataset-1][j][0],obj.coords2[dataset-1][j][1]);}} co.closePath();if(co.isPointInPath(mouseXY[0],mouseXY[1])){var inPath=true;break;}} if(inPath){var fillTooltips=prop['chart.fill.tooltips'];if(e.type=='click'){if(prop['chart.fill.click']){prop['chart.fill.click'](e,dataset);} if(prop['chart.fill.tooltips']&&prop['chart.fill.tooltips'][dataset]){obj.DatasetTooltip(e,dataset);}} if(e.type=='mousemove'){if(prop['chart.fill.mousemove']){prop['chart.fill.mousemove'](e,dataset);} if(!RG.is_null(fillTooltips)){e.target.style.cursor='pointer';} if(prop['chart.fill.tooltips']&&prop['chart.fill.tooltips'][dataset]){e.target.style.cursor='pointer';}} e.stopPropagation();}else if(e.type=='mousemove'){ca.style.cursor='default';}};if(prop['chart.fill.click']||!RG.is_null(prop['chart.fill.tooltips'])){ca.addEventListener('click',func,false);} if(prop['chart.fill.mousemove']||!RG.is_null(prop['chart.fill.tooltips'])){ca.addEventListener('mousemove',func,false);}};this.highlightDataset=this.HighlightDataset=function(dataset) {co.beginPath();for(var j=0;j0){co.lineTo(this.coords2[dataset-1][0][0],this.coords2[dataset-1][0][1]);for(var j=(this.coords2[dataset-1].length-1);j>=0;--j){co.lineTo(this.coords2[dataset-1][j][0],this.coords2[dataset-1][j][1]);}} co.strokeStyle=prop['chart.fill.highlight.stroke'];co.fillStyle=prop['chart.fill.highlight.fill'];co.stroke();co.fill();};this.datasetTooltip=this.DatasetTooltip=function(e,dataset) {this.HighlightDataset(dataset);var text=prop['chart.fill.tooltips'][dataset];var x=0;var y=this.coords2[dataset][0][1]+RG.getCanvasXY(ca)[1];RG.Tooltip(this,text,x,y,0,e);};this.interactiveKeyHighlight=function(index) {var coords=this.coords2[index];if(coords){var pre_linewidth=co.lineWidth;var pre_linecap=co.lineCap;co.lineWidth=prop['chart.linewidth']+10;co.lineCap='round';co.strokeStyle=prop['chart.key.interactive.highlight.chart.stroke'];co.beginPath();for(var i=0,len=coords.length;i0&&prop['chart.key'].length>=3){this.centerx=this.centerx-this.gutterRight+5;} if(typeof prop['chart.centerx']=='number')this.centerx=prop['chart.centerx'];if(typeof prop['chart.centery']=='number')this.centery=prop['chart.centery'];if(typeof prop['chart.radius']=='number')this.radius=prop['chart.radius'];if(!this.colorsParsed){this.parseColors();this.colorsParsed=true;} if(prop['chart.variant'].indexOf('3d')!==-1){var scaleX=1.5;this.context.setTransform(scaleX,0,0,1,(ca.width*scaleX-ca.width)* -0.5,0);} this.drawBackground();if(prop['chart.variant'].indexOf('3d')!==-1){RG.setShadow(this,'rgba(0,0,0,0.35)',0,15,25);for(var i=prop['chart.variant.threed.depth'];i>0;i-=1){this.centery-=1;this.drawRose({storeAngles:false});RG.setShadow(this,'rgba(0,0,0,0)',0,0,0);for(var j=0,len=this.angles.length;j-1){if(prop['chart.background.axes']){var offset=-10;var halign='right';}else{var offset=0;var halign='center';} for(var i=0;i-1){if(prop['chart.background.axes']){var offset=-10;var halign='right';}else{var offset=0;var halign='center';} for(var i=0;i-1){for(var i=0;i-1){for(var i=0;i0){RG.Text2(this,{'font':font,'size':size,'x':centerx,'y':centery,'text':typeof prop['chart.ymin']==='number'?RG.numberFormat(this,Number(prop['chart.ymin']).toFixed(prop['chart.ymin']===0?'0':prop['chart.scale.decimals']),units_pre,units_post):'0','valign':'center','halign':'center','bounding':true,'bounding.fill':color,'bounding.stroke':prop['chart.labels.boxed']?'black':'rgba(0,0,0,0)','tag':'scale'});}};this.drawCircularLabels=this.DrawCircularLabels=function(co,labels,font,size,radius) {var variant=prop['chart.variant'],position=prop['chart.labels.position'],radius=radius+5+prop['chart.labels.offset'],centerx=this.centerx,centery=this.centery+(prop['chart.variant'].indexOf('3d')!==-1?prop['chart.variant.threed.depth']:0),labelsColor=prop['chart.labels.color']||prop['chart.text.color'],angles=this.angles for(var i=0;icenterx){halign='left';}else if(Math.round(x)==centerx){halign='center';}else{halign='right';} RG.text2(this,{'color':labelsColor,'font':font,'size':size,'x':x,'y':y,'text':String(labels[i]),'halign':halign,'valign':'center','tag':'labels'});}};this.getShape=this.getSegment=function(e) {RG.fixEventObject(e);var angles=this.angles;var ret=[];var opt=arguments[1]?arguments[1]:{radius:true};for(var i=0;i0){co.arc(shape['x'],shape['y'],shape['radius.start'],shape['angle.end'],shape['angle.start'],true);}else{co.lineTo(shape['x'],shape['y']);} co.closePath();co.stroke();co.fill();}};this.getObjectByXY=function(e) {var mouseXY=RGraph.getMouseXY(e);var radius=RG.getHypLength(this.centerx,this.centery,mouseXY[0],mouseXY[1]);if(prop['chart.variant'].indexOf('3d')!==-1){radius/=-1;} if(mouseXY[0]>(this.centerx-this.radius)&&mouseXY[0]<(this.centerx+this.radius)&&mouseXY[1]>(this.centery-this.radius)&&mouseXY[1]<(this.centery+this.radius)&&radius<=this.radius){return this;}};this.getRadius=function(value) {if(value<0||value>this.max){return null;} var r=(value/this.max)*this.radius;return r;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.key.colors']=RG.array_clone(prop['chart.key.colors']);this.original_colors['chart.text.color']=RG.array_clone(prop['chart.text.color']);this.original_colors['chart.title.color']=RG.array_clone(prop['chart.title.color']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);} for(var i=0;i0&&prop['chart.key'].length>=3){this.centerx=this.centerx-prop['chart.gutter.right']+5;} if(typeof(prop['chart.key'])=='object'&&RG.is_array(prop['chart.key'])&&prop['chart.key'][0]){prop['chart.colors']=[];for(var i=0;i-1)RG.text2(this,{'tag':'scale','font':font,'size':size,'x':centerx-offset,'y':centery-(r*((i+1)/len)),'text':this.scale2.labels[i],'valign':'center','halign':centered?'center':'right',bounding:true,boundingFill:prop['chart.labels.axes.background'],boundingStroke:'rgba(0,0,0,0)',bold:bold,italic:italic});if(axes.indexOf('s')>-1)RG.text2(this,{'tag':'scale','font':font,'size':size,'x':centerx-offset,'y':centery+(r*((i+1)/len)),'text':this.scale2.labels[i],'valign':'center','halign':centered?'center':'right',bounding:true,boundingFill:prop['chart.labels.axes.background'],boundingStroke:'rgba(0,0,0,0)',bold:bold,italic:italic});if(axes.indexOf('e')>-1)RG.text2(this,{'tag':'scale','font':font,'size':size,'x':centerx+(r*((i+1)/len)),'y':centery+offset,'text':this.scale2.labels[i],'valign':centered?'center':'top','halign':'center',bounding:true,boundingFill:prop['chart.labels.axes.background'],boundingStroke:'rgba(0,0,0,0)',bold:bold,italic:italic});if(axes.indexOf('w')>-1)RG.text2(this,{'tag':'scale','font':font,'size':size,'x':centerx-(r*((i+1)/len)),'y':centery+offset,'text':this.scale2.labels[i],'valign':centered?'center':'top','halign':'center',bounding:true,boundingFill:prop['chart.labels.axes.background'],boundingStroke:'rgba(0,0,0,0)',bold:bold,italic:italic});} if(prop['chart.labels.axes'].length>0&&prop['chart.scale.zerostart']){RG.text2(this,{'font':font,'size':size,'x':centerx,'y':centery,'text':RG.numberFormat(this,Number(this.scale2.min).toFixed(this.scale2.decimals),this.scale2.units_pre,this.scale2.units_post),'valign':'center','halign':'center','bounding':true,'boundingFill':prop['chart.labels.axes.background'],'boundingStroke':'rgba(0,0,0,0)','tag':'scale',italic:italic,bold:bold});}};this.drawCircularLabels=this.DrawCircularLabels=function(context,labels,font_face,font_size,r) {var r=r+10,color=prop['chart.labels.color'];for(var i=0;ithis.centerx)?'left':'right','tag':'labels'});}};this.drawTick=this.DrawTick=function(x,y,color) {var tickmarks=prop['chart.tickmarks'];var ticksize=prop['chart.ticksize'];co.strokeStyle=color;co.fillStyle=color;var prevLinewidth=co.lineWidth;co.lineWidth=1;if(tickmarks=='cross'){co.beginPath();co.moveTo(x+ticksize,y+ticksize);co.lineTo(x-ticksize,y-ticksize);co.stroke();co.beginPath();co.moveTo(x-ticksize,y+ticksize);co.lineTo(x+ticksize,y-ticksize);co.stroke();}else if(tickmarks=='circle'){co.beginPath();co.arc(x,y,ticksize,0,6.2830,false);co.fill();}else if(tickmarks=='square'){co.beginPath();co.fillRect(x-ticksize,y-ticksize,2*ticksize,2*ticksize);co.fill();}else if(tickmarks=='diamond'){co.beginPath();co.moveTo(x,y-ticksize);co.lineTo(x+ticksize,y);co.lineTo(x,y+ticksize);co.lineTo(x-ticksize,y);co.closePath();co.fill();}else if(tickmarks=='plus'){co.lineWidth=1;co.beginPath();co.moveTo(x,y-ticksize);co.lineTo(x,y+ticksize);co.moveTo(x-ticksize,y);co.lineTo(x+ticksize,y);co.stroke();} co.lineWidth=prevLinewidth;};this.getShape=this.getPoint=function(e) {var mouseXY=RG.getMouseXY(e);var mouseX=mouseXY[0];var mouseY=mouseXY[1];var overHotspot=false;var offset=prop['chart.tooltips.hotspot'];for(var i=0,len=this.coords.length;i(x-offset)&&mouseY<(y+offset)&&mouseY>(y-offset)){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],i);return{0:this,1:x,2:y,3:i,'object':this,'x':x,'y':y,'index':i,'tooltip':tooltip};}}};this.allowTooltips=this.AllowTooltips=function() {RG.PreLoadTooltipImages(this);RG.InstallWindowMousedownTooltipListener(this);RG.InstallCanvasMousemoveTooltipListener(this);RG.InstallCanvasMouseupTooltipListener(this);};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{RG.Highlight.Point(this,shape);}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);var mouseX=mouseXY[0];var mouseY=mouseXY[1];var centerx=this.centerx;var centery=this.centery;var radius=this.radius;if(mouseX>(centerx-radius)&&mouseX<(centerx+radius)&&mouseY>(centery-radius)&&mouseY<(centery+radius)){return this;}};this.getRadius=function(value) {var max=this.max;if(value<0||value>max){return null;} var r=(value/max)*this.radius;return r;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['data']=RG.array_clone(this.data);this.original_colors['chart.highlight.stroke']=RG.arrayClone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.arrayClone(prop['chart.highlight.fill']);this.original_colors['chart.colors.default']=RG.arrayClone(prop['chart.colors.default']);this.original_colors['chart.background.grid.color']=RG.arrayClone(prop['chart.background.grid.color']);this.original_colors['chart.background.color']=RG.arrayClone(prop['chart.background.color']);this.original_colors['chart.segment.highlight.stroke']=RG.arrayClone(prop['chart.segment.highlight.stroke']);this.original_colors['chart.segment.highlight.fill']=RG.arrayClone(prop['chart.segment.highlight.fill']);} for(var i=0;i0?this.scale2.min:0);co.moveTo(this.gutterLeft,y);co.lineTo(ca.width-this.gutterRight,y);}} if(prop['chart.noyaxis']===false){var numyticks=prop['chart.numyticks'];for(i=0;i0){if(prop['chart.xaxispos']=='center'&&prop['chart.yaxispos']=='left'){co.moveTo(this.gutterLeft,ma.round(ca.height-this.gutterBottom));co.lineTo(this.gutterLeft-3,ma.round(ca.height-this.gutterBottom));}else if(prop['chart.xaxispos']=='center'){co.moveTo(ca.width-this.gutterRight+3,ma.round(ca.height-this.gutterBottom));co.lineTo(ca.width-this.gutterRight,ma.round(ca.height-this.gutterBottom));}} if(prop['chart.xaxis']===false&&prop['chart.yaxispos']==='left'){co.moveTo(this.gutterLeft,ma.round(ca.height-this.gutterBottom));co.lineTo(this.gutterLeft-3,ma.round(ca.height-this.gutterBottom));}else if(prop['chart.xaxis']===false&&prop['chart.yaxispos']==='right'){co.moveTo(ca.width-this.gutterRight,ma.round(ca.height-this.gutterBottom));co.lineTo(ca.width-this.gutterRight+3,ma.round(ca.height-this.gutterBottom));} if(prop['chart.xaxispos']==='bottom'&&prop['chart.numyticks']>0){if(prop['chart.yaxispos']=='left'){co.moveTo(this.gutterLeft,ma.round(this.getYCoord(prop['chart.ymin'])));co.lineTo(this.gutterLeft-3,ma.round(this.getYCoord(prop['chart.ymin'])));}else{co.moveTo(ca.width-this.gutterRight+3,ma.round(this.getYCoord(prop['chart.ymin'])));co.lineTo(ca.width-this.gutterRight,ma.round(this.getYCoord(prop['chart.ymin'])));}}} if(prop['chart.numxticks']>0&&prop['chart.xaxis']){var x=0,y=this.getYCoord(prop['chart.ylabels.invert']?this.scale2.max:(this.scale2.max>0&&this.scale2.min>0?this.scale2.min:0))-3,size=3;if(prop['chart.ymin']===0&&prop['chart.xaxispos']==='bottom'){y+=3;} if(this.scale2.max>0&&this.scale2.min>0){y+=3;} this.xTickGap=(prop['chart.labels']&&prop['chart.labels'].length)?((ca.width-this.gutterLeft-this.gutterRight)/prop['chart.labels'].length):(ca.width-this.gutterLeft-this.gutterRight)/10;if(typeof(prop['chart.numxticks'])=='number'){this.xTickGap=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.numxticks'];} for(x=(this.gutterLeft+(prop['chart.yaxispos']=='left'&&prop['chart.noyaxis']==false?this.xTickGap:0));x<=(ca.width-this.gutterRight-(prop['chart.yaxispos']=='left'||prop['chart.noyaxis']==true?-1:1));x+=this.xTickGap){if(prop['chart.yaxispos']=='left'&&prop['chart.noendxtick']==true&&x==(ca.width-this.gutterRight)){continue;}else if(prop['chart.yaxispos']=='right'&&prop['chart.noendxtick']==true&&x==this.gutterLeft){continue;} co.moveTo(ma.round(x),y);co.lineTo(ma.round(x),y+(prop['chart.xaxispos']==='center'||prop['chart.ymin']<0?size*2:size));}} co.stroke();co.lineWidth=1;};this.drawLabels=this.DrawLabels=function() {co.fillStyle=prop['chart.text.color'];var font=prop['chart.text.font'],xMin=prop['chart.xmin'],xMax=prop['chart.xmax'],yMax=this.scale2.max,yMin=prop['chart.ymin']?prop['chart.ymin']:0,text_size=prop['chart.text.size'],units_pre=prop['chart.units.pre'],units_post=prop['chart.units.post'],numYLabels=prop['chart.ylabels.count'],invert=prop['chart.ylabels.invert'],inside=prop['chart.ylabels.inside'],context=co,canvas=ca,boxed=false,offsetx=prop['chart.ylabels.offsetx'],offsety=prop['chart.ylabels.offsety'] this.halfTextHeight=text_size/2;this.halfGraphHeight=(ca.height-this.gutterTop-this.gutterBottom)/2;if(prop['chart.ylabels']){var xPos=prop['chart.yaxispos']=='left'?this.gutterLeft-5:ca.width-this.gutterRight+5;var align=prop['chart.yaxispos']=='right'?'left':'right';if(inside){if(prop['chart.yaxispos']=='left'){xPos=prop['chart.gutter.left']+5;align='left';boxed=true;}else{xPos=ca.width-prop['chart.gutter.right']-5;align='right';boxed=true;}} if(prop['chart.xaxispos']=='center'){if(typeof(prop['chart.ylabels.specific'])=='object'&&prop['chart.ylabels.specific']!=null&&prop['chart.ylabels.specific'].length){var labels=prop['chart.ylabels.specific'];if(prop['chart.ymin']>0){labels=[];for(var i=0;i<(prop['chart.ylabels.specific'].length-1);++i){labels.push(prop['chart.ylabels.specific'][i]);}} for(var i=0;i0||prop['chart.scale.zerostart'])){RG.text2(this,{font:font,size:text_size,x:xPos+offsetx,y:this.gutterTop+this.halfGraphHeight+offsety,valign:'center',halign:align,bounding:boxed,boundingFill:'white',text:RG.numberFormat(this,yMin.toFixed(this.scale2.min===0?0:prop['chart.scale.decimals']),units_pre,units_post),tag:'scale'});} if(invert){RG.text2(this,{'font':font,'size':text_size,'x':xPos+offsetx,'y':this.gutterTop+offsety,'valign':'center','halign':align,'bounding':boxed,'boundingFill':'white','text':RG.number_format(this,yMin.toFixed(this.scale2.min===0?0:prop['chart.scale.decimals']),units_pre,units_post),'tag':'scale'});RG.text2(this,{'font':font,'size':text_size,'x':xPos+offsetx,'y':this.gutterTop+(this.halfGraphHeight*2)+offsety,'valign':'center','halign':align,'bounding':boxed,'boundingFill':'white','text':'-'+RG.numberFormat(this,yMin.toFixed(this.scale2.min===0?0:prop['chart.scale.decimals']),units_pre,units_post),'tag':'scale'});}}}else{var xPos=prop['chart.yaxispos']=='left'?this.gutterLeft-5:ca.width-this.gutterRight+5;var align=prop['chart.yaxispos']=='right'?'left':'right';if(inside){if(prop['chart.yaxispos']=='left'){xPos=prop['chart.gutter.left']+5;align='left';boxed=true;}else{xPos=ca.width-this.gutterRight-5;align='right';boxed=true;}} if(typeof prop['chart.ylabels.specific']=='object'&&prop['chart.ylabels.specific']){var labels=prop['chart.ylabels.specific'];if(prop['chart.ymin']>9999){labels=[];for(var i=0;i<(prop['chart.ylabels.specific'].length-1);++i){labels.push(prop['chart.ylabels.specific'][i]);}} for(var i=0,len=labels.length;i0){angle*=-1;valign='center';halign='right';y+=5;}else{valign='center';halign='center';} if(!prop['chart.xmax']){var xmax=0;var xmin=prop['chart.xmin'];for(var ds=0,len=this.data.length;ds0){angle=-1*prop['chart.text.angle'];valign='center';halign='right';yPos+=10;} for(i=0;i=2){if(prop['chart.line.dash']&&typeof co.setLineDash==='function'){co.setLineDash(prop['chart.line.dash']);} co.lineCap='round';co.lineJoin='round';co.lineWidth=this.getLineWidth(i);co.strokeStyle=prop['chart.line.colors'][i];co.beginPath();var prevY=null;var currY=null;for(var j=0,len=this.coords[i].length;j0)prevY=this.coords[i][j-1][1];currY=yPos;if(j==0||RG.is_null(prevY)||RG.is_null(currY)){co.moveTo(xPos,yPos);}else{var stepped=prop['chart.line.stepped'];if((typeof stepped=='boolean'&&stepped)||(typeof stepped=='object'&&stepped[i])){co.lineTo(this.coords[i][j][0],this.coords[i][j-1][1]);} co.lineTo(xPos,yPos);}} co.stroke();if(prop['chart.line.dash']&&typeof co.setLineDash==='function'){co.setLineDash([1,0]);}} co.lineWidth=1;};this.getLineWidth=this.GetLineWidth=function(i) {var linewidth=prop['chart.line.linewidth'];if(typeof linewidth=='number'){return linewidth;}else if(typeof linewidth=='object'){if(linewidth[i]){return linewidth[i];}else{return linewidth[0];} alert('[SCATTER] Error! chart.linewidth should be a single number or an array of one or more numbers');}};this.drawVBars=this.DrawVBars=function() {var vbars=prop['chart.background.vbars'];var graphWidth=ca.width-this.gutterLeft-this.gutterRight;if(vbars){var xmax=prop['chart.xmax'];var xmin=prop['chart.xmin'];for(var i=0,len=vbars.length;i0){var i=0;for(var set=0;set=(x-offset)&&mouseY<=(y+offset)&&mouseY>=(y-offset)){var tooltip=RG.parseTooltipText(this.data[set][i][3],0);var index_adjusted=i;for(var ds=(set-1);ds>=0;--ds){index_adjusted+=this.data[ds].length;} return{0:this,1:x,2:y,3:set,4:i,5:this.data[set][i][3],'object':this,'x':x,'y':y,'dataset':set,'index':i,'tooltip':tooltip,'index_adjusted':index_adjusted};}}else if(RG.is_null(y)){}else{var mark=this.data[set][i];var width=prop['chart.boxplot.width'];if(typeof(mark[1][7])=='number'){width=mark[1][7];} if(typeof(x)=='object'&&mouseX>x[0]&&mouseXy[3]){var tooltip=RG.parseTooltipText(this.data[set][i][3],0);return{0:this,1:x[0],2:x[1]-x[0],3:y[1],4:y[3]-y[1],5:set,6:i,7:this.data[set][i][3],'object':this,'x':x[0],'y':y[1],'width':x[1]-x[0],'height':y[3]-y[1],'dataset':set,'index':i,'tooltip':tooltip};}}}}};this.drawAboveLabels=this.DrawAboveLabels=function() {var size=prop['chart.labels.above.size'];var font=prop['chart.text.font'];var units_pre=prop['chart.units.pre'];var units_post=prop['chart.units.post'];for(var set=0,len=this.coords.length;set(ca.height-this.gutterBottom)||mouseX(ca.width-this.gutterRight)){return null;} if(prop['chart.xaxispos']=='center'){var value=(((this.grapharea/2)-(mouseY-this.gutterTop))/this.grapharea)*(this.max-this.min) value*=2;if(value>=0){value+=this.min if(prop['chart.ylabels.invert']){value-=this.min;value=this.max-value;}}else{value-=this.min;if(prop['chart.ylabels.invert']){value+=this.min;value=this.max+value;value*=-1;}}}else{var value=((this.grapharea-(mouseY-this.gutterTop))/this.grapharea)*(this.max-this.min) value+=this.min;if(prop['chart.ylabels.invert']){value-=this.min;value=this.max-value;}} return value;};this.getXValue=function(arg) {if(arg.length==2){var mouseX=arg[0];var mouseY=arg[1];}else{var mouseXY=RG.getMouseXY(arg);var mouseX=mouseXY[0];var mouseY=mouseXY[1];} var obj=this;if(mouseY(ca.height-this.gutterBottom)||mouseX(ca.width-this.gutterRight)){return null;} var width=(ca.width-this.gutterLeft-this.gutterRight);var value=((mouseX-this.gutterLeft)/width)*(prop['chart.xmax']-prop['chart.xmin']) value+=prop['chart.xmin'];return value;};this.highlight=this.Highlight=function(shape) {if(typeof prop['chart.highlight.style']==='function'){(prop['chart.highlight.style'])(shape);}else{if(shape['height']){RG.Highlight.Rect(this,shape);}else{RG.Highlight.Point(this,shape);}}};this.getObjectByXY=function(e) {var mouseXY=RG.getMouseXY(e);if(mouseXY[0]>(this.gutterLeft-3)&&mouseXY[0]<(ca.width-this.gutterRight+3)&&mouseXY[1]>(this.gutterTop-3)&&mouseXY[1]<((ca.height-this.gutterBottom)+3)){return this;}};this.getXCoord=function(value) {if(typeof value!='number'&&typeof value!='string'){return null;} if(typeof value==='string'){value=RG.parseDate(value);} var xmin=prop['chart.xmin'];var xmax=prop['chart.xmax'];var x;if(valuexmax)return null;var gutterRight=this.gutterRight;var gutterLeft=this.gutterLeft;if(prop['chart.yaxispos']=='right'){x=((value-xmin)/(xmax-xmin))*(ca.width-gutterLeft-gutterRight);x=(ca.width-gutterRight-x);}else{x=((value-xmin)/(xmax-xmin))*(ca.width-gutterLeft-gutterRight);x=x+gutterLeft;} return x;};this.getYCoord=this.getYCoordFromValue=function(value) {if(typeof(value)!='number'){return null;} var invert=prop['chart.ylabels.invert'];var xaxispos=prop['chart.xaxispos'];var graphHeight=ca.height-this.gutterTop-this.gutterBottom;var halfGraphHeight=graphHeight/2;var ymax=this.max;var ymin=prop['chart.ymin'];var coord=0;if(value>ymax||(prop['chart.xaxispos']=='bottom'&&value0&&value(-1*ymin))))){return null;} if(xaxispos=='center'){coord=((Math.abs(value)-ymin)/(ymax-ymin))*halfGraphHeight;if(invert){coord=halfGraphHeight-coord;} if(value<0){coord+=this.gutterTop;coord+=halfGraphHeight;}else{coord=halfGraphHeight-coord;coord+=this.gutterTop;}}else{coord=((value-ymin)/(ymax-ymin))*graphHeight;if(invert){coord=graphHeight-coord;} coord=graphHeight-coord;coord=this.gutterTop+coord;} return coord;};RG.Scatter.Bubble=function(scatter,min,max,width,data) {this.scatter=scatter;this.min=min;this.max=max;this.width=width;this.data=data;this.coords=[];this.type='scatter.bubble' this.set=this.Set=function(name,value) {this.scatter.set(name,value);return this;};this.get=this.Get=function(name) {this.scatter.get(name);};this.draw=this.Draw=function() {var bubble_min=this.min,bubble_max=this.max,bubble_data=this.data,bubble_max_width=this.width;var obj_bubble=this,obj_scatter=this.scatter;this.scatter.ondraw=function(obj) {for(var i=0;i=RGraph.PI){var halign='right';var valign='center';} var xy=RG.getRadiusEndPoint(this.centerx,this.centery,prop['chart.angles.start']+prop['chart.labels.min.offset.angle'],this.radius-(this.width/2));RG.text2(this,{font:prop['chart.labels.min.font']||prop['chart.text.font'],bold:prop['chart.labels.min.bold']||prop['chart.text.bold'],size:prop['chart.labels.min.size']||prop['chart.text.size'],x:xy[0]+prop['chart.labels.min.offsetx'],y:xy[1]+prop['chart.labels.min.offsety'],valign:valign,halign:halign,text:min,color:prop['chart.labels.min.color']||prop['chart.text.color'],italic:prop['chart.labels.min.italic']});if(prop['chart.angles.end']===RGraph.TWOPI){var halign='center';var valign='top';}else if(prop['chart.angles.end']>=RGraph.TWOPI){var halign='right';var valign='center';}else if(prop['chart.angles.end']<=RGraph.TWOPI){var halign='left';var valign='center';} var xy=RG.getRadiusEndPoint(this.centerx,this.centery,prop['chart.angles.end']+prop['chart.labels.max.offset.angle'],this.radius-(this.width/2));RG.text2(this,{font:prop['chart.labels.max.font']||prop['chart.text.font'],bold:prop['chart.labels.max.bold']||prop['chart.text.bold'],size:prop['chart.labels.max.size']||prop['chart.text.size'],x:xy[0]+prop['chart.labels.max.offsetx'],y:xy[1]+prop['chart.labels.max.offsety'],valign:valign,halign:halign,text:max,color:prop['chart.labels.max.color']||prop['chart.text.color'],italic:prop['chart.labels.max.italic']});if(prop['chart.labels.center']){var ret=RG.text2(this,{font:prop['chart.labels.center.font']||prop['chart.text.font'],size:prop['chart.labels.center.size']||50,bold:prop['chart.labels.center.bold'],italic:prop['chart.labels.center.italic'],x:this.centerx,y:this.centery,valign:prop['chart.labels.center.valign'],halign:'center',text:RG.numberFormat(this,this.value.toFixed(prop['chart.scale.decimals']),prop['chart.units.pre'],prop['chart.units.post']),color:prop['chart.labels.center.color']||prop['chart.text.color']});if(prop['chart.labels.center.fade']&&ret.node){ret.node.style.opacity=0;var delay=25,incr=0.1;for(var i=0;i<10;++i){(function(index) {setTimeout(function() {ret.node.style.opacity=incr*index;},delay*(index+1));})(i);}}} RG.drawTitle(this,prop['chart.title'],this.gutterTop,null,prop['chart.title.size']);};this.getShape=function(e) {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1] pa2(co,'b a % % % % % false a % % % % % true',this.coords[0][0],this.coords[0][1],this.coords[0][2],this.coords[0][3],this.coords[0][6],this.coords[0][0],this.coords[0][1],this.coords[0][2]-this.coords[0][5],this.coords[0][6],this.coords[0][3]);if(co.isPointInPath(mouseX,mouseY)){return{object:this,0:this,x:this.coords[0][0],1:this.coords[0][0],y:this.coords[0][1],2:this.coords[0][1],radius:this.coords[0][2],3:this.coords[0][2],width:this.coords[0][5],4:this.coords[0][5],start:this.coords[0][3],5:this.coords[0][3],end:this.coords[0][6],6:this.coords[0][6],index:0,tooltip:!RG.isNull(prop['chart.tooltips'])?prop['chart.tooltips'][0]:null};}};this.getValue=function(e) {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1],angle=RG.getAngleByXY(this.centerx,this.centery,mouseX,mouseY);if(angle&&mouseX>=this.centerx&&mouseY>this.centery){angle+=RGraph.TWOPI;} if(anglethis.centerx){angle=prop['chart.angles.end'];} if(anglethis.max||value=0&&this.scale.max>0){y=this.getYCoord(this.scale.min)-height;}else if(this.scale.min<0&&this.scale.max>0){height=(ma.abs(this.data[i])/(this.scale.max-this.scale.min))*this.graphHeight;y=this.getYCoord(0)-height;if(this.data[i]<0){y=this.getYCoord(0);}}else if(this.scale.min<0&&this.scale.max<0){height=(ma.abs(this.data[i])-ma.abs(this.scale.max))/(ma.abs(this.scale.min)-ma.abs(this.scale.max))*this.graphHeight;y=prop.gutterTop;} var rect=RG.SVG.create({svg:this.svg,type:'rect',parent:prop.variant==='3d'&&this.data[i]<0?this.threed_xaxis_group:this.svg.all,attr:{stroke:prop.strokestyle,fill:prop.colorsSequential?(prop.colors[sequentialIndex]?prop.colors[sequentialIndex]:prop.colors[prop.colors.length-1]):prop.colors[0],x:x,y:y,width:width<0?0:width,height:height,'stroke-width':prop.linewidth,'data-original-x':x,'data-original-y':y,'data-original-width':width,'data-original-height':height,'data-tooltip':(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips.length)?prop.tooltips[i]:'','data-index':i,'data-sequential-index':sequentialIndex,'data-value':this.data[i],filter:prop.shadow?'url(#dropShadow)':''}});this.drawErrorbar({object:this,element:rect,index:i,value:this.data[i],type:'normal'});this.coords.push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(!this.coords2[0]){this.coords2[0]=[];} this.coords2[0].push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(prop.variant==='3d'){this.drawTop3dFace({rect:rect,value:this.data[i]});this.drawSide3dFace({rect:rect,value:this.data[i]});} if(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips[sequentialIndex]){var obj=this;(function(idx,seq) {rect.addEventListener(prop.tooltipsEvent.replace(/^on/,''),function(e) {obj.removeHighlight();RG.SVG.tooltip({object:obj,index:idx,group:null,sequentialIndex:seq,text:prop.tooltips[seq],event:e});obj.highlight(e.target);},false);rect.addEventListener('mousemove',function(e) {e.target.style.cursor='pointer'},false);})(i,sequentialIndex);}}else if(RG.SVG.isArray(this.data[i])&&prop.grouping==='grouped'){var outerSegment=(this.graphWidth/this.data.length),innerSegment=outerSegment-(2*prop.hmargin);for(var j=0;jthis.scale.min){var height=((this.data[i][j]-this.scale.min)/(this.scale.max-this.scale.min))*this.graphHeight,y=this.getYCoord(0)-height;}else if(this.scale.max<=0&&this.scale.min0&&this.scale.min<0){var height=(ma.abs(this.data[i][j])/(this.scale.max-this.scale.min))*this.graphHeight,y=this.data[i][j]<0?this.getYCoord(0):this.getYCoord(this.data[i][j]);}else if(this.scale.min>0&&this.scale.max>this.scale.min){var height=(ma.abs(this.data[i][j]-this.scale.min)/(this.scale.max-this.scale.min))*this.graphHeight,y=this.getYCoord(this.scale.min)-height;} var rect=RG.SVG.create({svg:this.svg,parent:prop.variant==='3d'&&this.data[i][j]<0?this.threed_xaxis_group:this.svg.all,type:'rect',attr:{stroke:prop['strokestyle'],fill:(prop.colorsSequential&&prop.colors[sequentialIndex])?prop.colors[sequentialIndex]:prop.colors[j],x:x,y:y,width:width,height:height,'stroke-width':prop.linewidth,'data-original-x':x,'data-original-y':y,'data-original-width':width,'data-original-height':height,'data-index':i,'data-subindex':j,'data-sequential-index':sequentialIndex,'data-tooltip':(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips.length)?prop.tooltips[sequentialIndex]:'','data-value':this.data[i][j],filter:prop.shadow?'url(#dropShadow)':''}});this.drawErrorbar({object:this,element:rect,index:sequentialIndex,value:this.data[i][j],type:'grouped'});this.coords.push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(!this.coords2[i]){this.coords2[i]=[];} this.coords2[i].push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(prop.variant==='3d'){this.drawTop3dFace({rect:rect,value:this.data[i][j]});this.drawSide3dFace({rect:rect,value:this.data[i][j]});} if(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips[sequentialIndex]){var obj=this;(function(idx,seq) {obj.removeHighlight();var indexes=RG.SVG.sequentialIndexToGrouped(seq,obj.data);rect.addEventListener(prop.tooltipsEvent.replace(/^on/,''),function(e) {RG.SVG.tooltip({object:obj,group:idx,index:indexes[1],sequentialIndex:seq,text:prop.tooltips[seq],event:e});obj.highlight(e.target);},false);rect.addEventListener('mousemove',function(e) {e.target.style.cursor='pointer'},false);})(i,sequentialIndex);}} --sequentialIndex;}else if(RG.SVG.isArray(this.data[i])&&prop.grouping==='stacked'){var section=(this.graphWidth/this.data.length);var y=this.getYCoord(0);for(var j=0;jthis.scale.max){return null;} var y,xaxispos=prop.xaxispos;if(value=0){var y=parseFloat(this.coords[i].element.getAttribute('y'))-7+prop.labelsAboveOffsety;var valign=prop.labelsAboveValign;}else{var y=parseFloat(this.coords[i].element.getAttribute('y'))+parseFloat(this.coords[i].element.getAttribute('height'))+7-prop.labelsAboveOffsety;var valign=prop.labelsAboveValign==='top'?'bottom':'top';} RG.SVG.text({object:this,parent:this.svg.all,text:str,x:x,y:y,halign:prop.labelsAboveHalign,valign:valign,tag:'labels.above',font:prop.labelsAboveFont||prop.textFont,size:prop.labelsAboveSize||prop.textSize,bold:prop.labelsAboveBold||prop.textBold,italic:prop.labelsAboveItalic||prop.textItalic,color:prop.labelsAboveColor||prop.textColor,background:prop.labelsAboveBackground||null,padding:prop.labelsAboveBackgroundPadding||0});}}};this.on=function(type,func) {if(type.substr(0,2)!=='on'){type='on'+type;} RG.SVG.addCustomEventListener(this,type,func);return this;};this.exec=function(func) {func(this);return this;};this.removeHighlight=function() {var highlight=RG.SVG.REG.get('highlight');if(highlight&&highlight.parentNode){highlight.parentNode.removeChild(highlight);} RG.SVG.REG.set('highlight',null);};this.drawTop3dFace=function(opt) {var rect=opt.rect,arr=[parseInt(rect.getAttribute('fill')),'rgba(255,255,255,0.7)'],x=parseInt(rect.getAttribute('x')),y=parseInt(rect.getAttribute('y')),w=parseInt(rect.getAttribute('width')),h=parseInt(rect.getAttribute('height')),value=parseFloat(rect.getAttribute('data-value'));rect.rgraph_3d_top_face=[];for(var i=0;i<2;++i){var color=(i===0?rect.getAttribute('fill'):'rgba(255,255,255,0.7)');var face=RG.SVG.create({svg:this.svg,type:'path',parent:prop.variant==='3d'&&opt.value<0?this.threed_xaxis_group:this.svg.all,attr:{stroke:prop.strokestyle,fill:color,'stroke-width':prop.linewidth,d:'M {1} {2} L {3} {4} L {5} {6} L {7} {8}'.format(x,y,x+prop.variant3dOffsetx,y-prop.variant3dOffsety,x+w+prop.variant3dOffsetx,y-prop.variant3dOffsety,x+w,y)}});rect.rgraph_3d_top_face[i]=face}};this.drawSide3dFace=function(opt) {var rect=opt.rect,arr=[parseInt(rect.getAttribute('fill')),'rgba(0,0,0,0.3)'],x=parseInt(rect.getAttribute('x')),y=parseInt(rect.getAttribute('y')),w=parseInt(rect.getAttribute('width')),h=parseInt(rect.getAttribute('height'));rect.rgraph_3d_side_face=[];for(var i=0;i<2;++i){var color=(i===0?rect.getAttribute('fill'):'rgba(0,0,0,0.3)');var face=RG.SVG.create({svg:this.svg,type:'path',parent:prop.variant==='3d'&&opt.value<0?this.threed_xaxis_group:this.svg.all,attr:{stroke:prop.strokestyle,fill:color,'stroke-width':prop.linewidth,d:'M {1} {2} L {3} {4} L {5} {6} L {7} {8}'.format(x+w,y,x+w+prop.variant3dOffsetx,y-prop.variant3dOffsety,x+w+prop.variant3dOffsetx,y+h-prop.variant3dOffsety,x+w,y+h)}});rect.rgraph_3d_side_face[i]=face}};this.drawErrorbar=function(opt) {var prop=this.properties,index=opt.index,datapoint=opt.value,linewidth=RG.SVG.getErrorbarsLinewidth({object:this,index:index}),color=RG.SVG.getErrorbarsColor({object:this,index:index}),capwidth=RG.SVG.getErrorbarsCapWidth({object:this,index:index}),element=opt.element,type=opt.type;var max=RG.SVG.getErrorbarsMaxValue({object:this,index:index});var min=RG.SVG.getErrorbarsMinValue({object:this,index:index});if(!max&&!min){return;} if(type==='stacked'){datapoint=RG.SVG.arraySum(this.data[index]);} if(datapoint>=0){var x1=parseFloat(element.getAttribute('x'))+(parseFloat(element.getAttribute('width'))/2);var errorbarLine=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x1,y1:parseFloat(element.getAttribute('y')),x2:x1,y2:this.getYCoord(parseFloat(datapoint+max)),stroke:color,'stroke-width':linewidth}});var errorbarCap=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:parseFloat(errorbarLine.getAttribute('x1'))-(capwidth/2),y1:errorbarLine.getAttribute('y2'),x2:parseFloat(errorbarLine.getAttribute('x1'))+(capwidth/2),y2:errorbarLine.getAttribute('y2'),stroke:color,'stroke-width':linewidth}});if(typeof min==='number'){var errorbarLine=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x1,y1:parseFloat(element.getAttribute('y')),x2:x1,y2:this.getYCoord(parseFloat(datapoint-min)),stroke:color,'stroke-width':linewidth}});var errorbarCap=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:parseFloat(errorbarLine.getAttribute('x1'))-(capwidth/2),y1:errorbarLine.getAttribute('y2'),x2:parseFloat(errorbarLine.getAttribute('x1'))+(capwidth/2),y2:errorbarLine.getAttribute('y2'),stroke:color,'stroke-width':linewidth}});}}else if(datapoint<0){var x1=parseFloat(element.getAttribute('x'))+(parseFloat(element.getAttribute('width'))/2),y1=parseFloat(element.getAttribute('y'))+parseFloat(element.getAttribute('height')),y2=this.getYCoord(parseFloat(datapoint-ma.abs(max))) var errorbarLine=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x1,y1:y1,x2:x1,y2:y2,stroke:color,'stroke-width':linewidth}});var errorbarCap=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:parseFloat(errorbarLine.getAttribute('x1'))-(capwidth/2),y1:errorbarLine.getAttribute('y2'),x2:parseFloat(errorbarLine.getAttribute('x1'))+(capwidth/2),y2:errorbarLine.getAttribute('y2'),stroke:color,'stroke-width':linewidth}});if(typeof min==='number'){var x1=parseFloat(element.getAttribute('x'))+(parseFloat(element.getAttribute('width'))/2);var errorbarLine=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x1,y1:this.getYCoord(parseFloat(datapoint+min)),x2:x1,y2:this.getYCoord(parseFloat(datapoint)),stroke:color,'stroke-width':linewidth}});var errorbarCap=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:parseFloat(errorbarLine.getAttribute('x1'))-(capwidth/2),y1:errorbarLine.getAttribute('y1'),x2:parseFloat(errorbarLine.getAttribute('x1'))+(capwidth/2),y2:errorbarLine.getAttribute('y1'),stroke:color,'stroke-width':linewidth}});}}};this.grow=function() {var opt=arguments[0]||{},frames=opt.frames||30,frame=0,obj=this,data=[],height=null,seq=0;data=RG.SVG.arrayClone(this.data);this.draw();var iterate=function() {for(var i=0,seq=0,len=obj.coords.length;iopt.startFrames[i]){var originalHeight=obj.coords[i].element.getAttribute('data-original-height'),height,value=parseFloat(obj.coords[i].element.getAttribute('data-value'));var height=ma.min(((frame-opt.startFrames[i])/framesperbar)*originalHeight,originalHeight);obj.coords[i].element.setAttribute('height',height<0?0:height);obj.coords[i].element.setAttribute('y',value>=0?obj.getYCoord(0)-height:obj.getYCoord(0));if(prop.variant==='3d'){var parent=obj.coords[i].element.rgraph_3d_side_face[0].parentNode;if(parent)parent.removeChild(obj.coords[i].element.rgraph_3d_side_face[0]);if(parent)parent.removeChild(obj.coords[i].element.rgraph_3d_side_face[1]);var parent=obj.coords[i].element.rgraph_3d_top_face[0].parentNode;if(parent)parent.removeChild(obj.coords[i].element.rgraph_3d_top_face[0]);if(parent)parent.removeChild(obj.coords[i].element.rgraph_3d_top_face[1]);if(obj.coords[i].element.parentNode){var parent=obj.coords[i].element.parentNode;var node=parent.removeChild(obj.coords[i].element);parent.appendChild(node);}} if(prop.grouping==='stacked'){var seq=obj.coords[i].element.getAttribute('data-sequential-index');var indexes=RG.SVG.sequentialIndexToGrouped(seq,obj.data);if(indexes[1]>0){obj.coords[i].element.setAttribute('y',parseInt(obj.coords[i-1].element.getAttribute('y'))-height);}} if(prop.variant==='3d'){obj.drawSide3dFace({rect:obj.coords[i].element,value:obj.coords[i].element.getAttribute('data-value')});if(prop.grouping==='grouped'||(prop.grouping==='stacked'&&(indexes[1]+1)===obj.data[indexes[0]].length)){obj.drawTop3dFace({rect:obj.coords[i].element,value:obj.coords[i].element.getAttribute('data-value')});}}}} if(frame>=opt.frames){callback(obj);}else{RG.SVG.FX.update(iterator);}} iterator();return this;};for(i in conf.options){if(typeof i==='string'){this.set(i,conf.options[i]);}}};return this;})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.bipolar.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.SVG=RGraph.SVG||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math,win=window,doc=document;RG.SVG.Bipolar=function(conf) {this.set=function(name,value) {if(arguments.length===1&&typeof name==='object'){for(i in arguments[0]){if(typeof i==='string'){var ret=RG.SVG.commonSetter({object:this,name:i,value:arguments[0][i]});name=ret.name;value=ret.value;this.set(name,value);}}}else{var ret=RG.SVG.commonSetter({object:this,name:name,value:value});name=ret.name;value=ret.value;this.properties[name]=value;if(name==='colors'){this.originalColors=RG.SVG.arrayClone(value);this.colorsParsed=false;}} return this;};this.id=conf.id;this.uid=RG.SVG.createUID();this.container=document.getElementById(this.id);this.layers={};this.svg=RG.SVG.createSVG({object:this,container:this.container});this.isRGraph=true;this.data=[conf.left,conf.right];this.left=conf.left;this.right=conf.right;this.type='bipolar';this.coords=[];this.coordsLeft=[];this.coordsRight=[];this.coords2=[];this.coords2Left=[];this.coords2Right=[];this.stackedBackfacesLeft=[];this.stackedBackfacesRight=[];this.originalColors={};this.gradientCounter=1;this.sequentialIndex=0;RG.SVG.OR.add(this);this.container.style.display='inline-block';this.properties={gutterLeft:35,gutterRight:35,gutterTop:35,gutterBottom:35,gutterCenter:null,backgroundColor:null,backgroundGrid:true,backgroundGridColor:'#ddd',backgroundGridLinewidth:1,backgroundGridHlines:true,backgroundGridHlinesCount:null,backgroundGridVlines:true,backgroundGridVlinesCount:null,backgroundGridBorder:true,backgroundGridDashed:false,backgroundGridDotted:false,backgroundGridDashArray:null,xaxis:true,xaxisLinewidth:1,xaxisTickmarks:true,xaxisTickmarksLength:5,xaxisLabelsCount:5,xaxisLabelsPositionEdgeTickmarksCount:5,xaxisColor:'black',xaxisLabelsOffsetx:0,xaxisLabelsOffsety:0,xaxisUnitsPre:'',xaxisUnitsPost:'',xaxisStrict:false,xaxisDecimals:0,xaxisPoint:'.',xaxisThousand:',',xaxisRound:false,xaxisMax:null,xaxisMin:0,xaxisFormatter:null,xaxisTextFont:null,xaxisTextSize:null,xaxisTextBold:null,xaxisTextItalic:null,xaxisTextColor:null,yaxis:true,yaxisTickmarks:true,yaxisTickmarksLength:5,yaxisColor:'black',yaxisScale:false,yaxisLabels:null,yaxisLabelsOffsetx:0,yaxisLabelsOffsety:0,yaxisTextFont:null,yaxisTextSize:null,yaxisTextBold:null,yaxisTextItalic:null,yaxisTextColor:null,colors:['red','#0f0','#00f','#ff0','#0ff','#0f0','pink','orange','gray','black','red','#0f0','#00f','#ff0','#0ff','#0f0','pink','orange','gray','black'],colorsSequential:false,strokestyle:'rgba(0,0,0,0)',vmargin:3,vmarginGrouped:2,labelsAbove:false,labelsAboveFont:null,labelsAboveSize:null,labelsAboveBold:null,labelsAboveItalic:null,labelsAboveColor:null,labelsAboveBackground:null,labelsAboveBackgroundPadding:0,labelsAboveUnitsPre:null,labelsAboveUnitsPost:null,labelsAbovePoint:null,labelsAboveThousand:null,labelsAboveFormatter:null,labelsAboveDecimals:null,labelsAboveOffsetx:0,labelsAboveOffsety:0,labelsAboveSpecific:null,textColor:'black',textFont:'sans-serif',textSize:12,textBold:false,textItalic:false,linewidth:1,grouping:'grouped',tooltips:null,tooltipsOverride:null,tooltipsEffect:'fade',tooltipsCssClass:'RGraph_tooltip',tooltipsEvent:'click',highlightStroke:'rgba(0,0,0,0)',highlightFill:'rgba(255,255,255,0.7)',highlightLinewidth:1,title:'',titleSize:16,titleX:null,titleY:null,titleHalign:'center',titleValign:null,titleColor:'black',titleFont:null,titleBold:false,titleItalic:false,titleSubtitle:null,titleSubtitleSize:10,titleSubtitleX:null,titleSubtitleY:null,titleSubtitleHalign:'center',titleSubtitleValign:null,titleSubtitleColor:'#aaa',titleSubtitleFont:null,titleSubtitleBold:false,titleSubtitleItalic:false,shadow:false,shadowOffsetx:2,shadowOffsety:2,shadowBlur:2,shadowOpacity:0.25,key:null,keyColors:null,keyOffsetx:0,keyOffsety:0,keyTextOffsetx:0,keyTextOffsety:-1,keyTextSize:null,keyTextBold:null,keyTextItalic:null,keyTextFont:null};RG.SVG.getGlobals(this);if(RG.SVG.FX&&typeof RG.SVG.FX.decorate==='function'){RG.SVG.FX.decorate(this);} var prop=this.properties;this.draw=function() {RG.SVG.fireCustomEvent(this,'onbeforedraw');this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));RG.SVG.createDefs(this);if(typeof prop.gutterCenter!=='number'){prop.gutterCenter=this.getGutterCenter();} this.coords=[];this.coordsLeft=[];this.coordsRight=[];this.coords2=[];this.coords2Left=[];this.coords2Right=[];this.graphWidth=(this.width-prop.gutterLeft-prop.gutterRight-prop.gutterCenter)/2;this.graphHeight=this.height-prop.gutterTop-prop.gutterBottom;RG.SVG.resetColorsToOriginalValues({object:this});this.parseColors();var values=[];for(var i=0;i<2;++i){for(var j=0,max=0;jthis.scale.max){return null;} if(valuethis.scale.max){return null;} if(value=startFrames_left[seq]){var isNull=RG.SVG.isNull(obj.left[i]);if(typeof obj.left[i]==='number'){obj.left[i]=ma.min(ma.abs(original_left[i]),ma.abs(original_left[i]*((counters_left[i]++)/framesperbar)));var rect_left=obj.coords[i].element;rect_left.setAttribute('width',parseFloat(rect_left.getAttribute('data-original-width'))*(obj.left[i]/rect_left.getAttribute('data-value')));rect_left.setAttribute('x',obj.properties.gutterLeft+obj.graphWidth-(parseFloat(rect_left.getAttribute('data-original-width'))*(obj.left[i]/rect_left.getAttribute('data-value'))));}else if(RG.SVG.isArray(obj.left[i])){for(var j=0,accWidth=0;j=startFrames_right[seq]){var isNull=RG.SVG.isNull(obj.right[i]);if(typeof obj.right[i]==='number'){obj.right[i]=ma.min(ma.abs(original_right[i]),ma.abs(original_right[i]*((counters_right[i]++)/framesperbar)));var rect_right=obj.coords[i+obj.left.length].element;rect_right.setAttribute('width',parseFloat(rect_right.getAttribute('data-original-width'))*(obj.right[i]/rect_right.getAttribute('data-value')));rect_right.setAttribute('x',obj.properties.gutterLeft+obj.graphWidth+prop.gutterCenter);}else if(RG.SVG.isArray(obj.right[i])){for(var j=0,accWidth=0;j0;RG.SVG.ISFF=ua.indexOf('irefox')>0;RG.SVG.events=[];RG.SVG.GLOBALS={};RG.SVG.ISFF=ua.indexOf('Firefox')!=-1;RG.SVG.ISOPERA=ua.indexOf('Opera')!=-1;RG.SVG.ISCHROME=ua.indexOf('Chrome')!=-1;RG.SVG.ISSAFARI=ua.indexOf('Safari')!=-1&&!RG.ISCHROME;RG.SVG.ISWEBKIT=ua.indexOf('WebKit')!=-1;RG.SVG.ISIE=ua.indexOf('Trident')>0||navigator.userAgent.indexOf('MSIE')>0;RG.SVG.ISIE6=ua.indexOf('MSIE 6')>0;RG.SVG.ISIE7=ua.indexOf('MSIE 7')>0;RG.SVG.ISIE8=ua.indexOf('MSIE 8')>0;RG.SVG.ISIE9=ua.indexOf('MSIE 9')>0;RG.SVG.ISIE10=ua.indexOf('MSIE 10')>0;RG.SVG.ISIE11UP=ua.indexOf('MSIE')==-1&&ua.indexOf('Trident')>0;RG.SVG.ISIE10UP=RG.SVG.ISIE10||RG.SVG.ISIE11UP;RG.SVG.ISIE9UP=RG.SVG.ISIE9||RG.SVG.ISIE10UP;RG.SVG.createSVG=function(opt) {var container=opt.container,obj=opt.object;if(container.__svg__){return container.__svg__;} var svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute('style','top: 0; left: 0; position: absolute');svg.setAttribute('width',container.offsetWidth);svg.setAttribute('height',container.offsetHeight);svg.setAttribute('version','1.1');svg.setAttributeNS("http://www.w3.org/2000/xmlns/",'xmlns','http://www.w3.org/2000/svg');svg.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink");svg.__object__=obj;svg.__container__=container;container.appendChild(svg);container.__svg__=svg;container.__object__=obj;var style=getComputedStyle(container);if(style.position!=='absolute'&&style.position!=='fixed'&&style.position!=='sticky'){container.style.position='relative';} var numLayers=10;for(var i=1;i<=numLayers;++i){var group=RG.SVG.create({svg:svg,type:'g',attr:{className:'background'+i}});obj.layers['background'+i]=group;svg['background'+i]=group;} var group=RG.SVG.create({svg:svg,type:'g',attr:{className:'all-elements'}});container.__svg__.all=group;return svg;};RG.SVG.createDefs=function(obj) {if(!obj.svg.defs){var defs=RG.SVG.create({svg:obj.svg,type:'defs'});obj.svg.defs=defs;} return defs;};RG.SVG.create=function(opt) {var ns="http://www.w3.org/2000/svg",tag=doc.createElementNS(ns,opt.type);for(var o in opt.attr){if(typeof o==='string'){var name=o;if(o==='className'){name='class';} if((opt.type==='a'||opt.type==='image')&&o==='xlink:href'){tag.setAttributeNS('http://www.w3.org/1999/xlink',o,String(opt.attr[o]));}else{if(RG.SVG.isNull(opt.attr[o])){opt.attr[o]='';} tag.setAttribute(name,String(opt.attr[o]));}}} for(var o in opt.style){if(typeof o==='string'){tag.style[o]=String(opt.style[o]);}} if(opt.parent){opt.parent.appendChild(tag);}else{opt.svg.appendChild(tag);} return tag;};RG.SVG.getMouseXY=function(e) {if(!e.target){return;} var el=e.target,offsetX=0,offsetY=0,x,y;if(typeof el.offsetParent!=='undefined'){do{offsetX+=el.offsetLeft;offsetY+=el.offsetTop;}while((el=el.offsetParent));} x=e.pageX;y=e.pageY;x-=(2*(parseInt(document.body.style.borderLeftWidth)||0));y-=(2*(parseInt(document.body.style.borderTopWidth)||0));return[x,y];};RG.SVG.drawXAxis=function(obj) {var prop=obj.properties;if(prop.xaxis){var y=obj.type==='hbar'?obj.height-prop.gutterBottom:obj.getYCoord(obj.scale.min<0&&obj.scale.max<0?obj.scale.max:(obj.scale.min>0&&obj.scale.max>0?obj.scale.min:0));var axis=RG.SVG.create({svg:obj.svg,parent:obj.svg.all,type:'path',attr:{d:'M{1} {2} L{3} {4}'.format(prop.gutterLeft,y,obj.width-prop.gutterRight,y),fill:prop.xaxisColor,stroke:prop.xaxisColor,'stroke-width':typeof prop.xaxisLinewidth==='number'?prop.xaxisLinewidth:1,'shape-rendering':'crispEdges','stroke-linecap':'square'}});if(obj.type==='hbar'){var width=obj.graphWidth/obj.data.length,x=prop.gutterLeft,startY=(obj.height-prop.gutterBottom),endY=(obj.height-prop.gutterBottom)+prop.xaxisTickmarksLength;}else{var width=obj.graphWidth/obj.data.length,x=prop.gutterLeft,startY=obj.getYCoord(0)-(prop.yaxisMin<0?prop.xaxisTickmarksLength:0),endY=obj.getYCoord(0)+prop.xaxisTickmarksLength;if(obj.scale.min<0&&obj.scale.max<=0){startY=prop.gutterTop;endY=prop.gutterTop-prop.xaxisTickmarksLength;} if(obj.scale.min>0&&obj.scale.max>0){startY=obj.getYCoord(obj.scale.min);endY=obj.getYCoord(obj.scale.min)+prop.xaxisTickmarksLength;}} if(prop.xaxisTickmarks){if(prop.xaxisScale){for(var i=0;i<(typeof prop.xaxisLabelsPositionEdgeTickmarksCount==='number'?prop.xaxisLabelsPositionEdgeTickmarksCount:(obj.scale.numlabels+(prop.yaxis&&prop.xaxisMin===0?0:1)));++i){if(obj.type==='hbar'){var dataPoints=obj.data.length;} x=prop.gutterLeft+((i+(prop.yaxis&&prop.xaxisMin===0?1:0))*(obj.graphWidth/obj.scale.numlabels));if(typeof prop.xaxisLabelsPositionEdgeTickmarksCount==='number'){dataPoints=prop.xaxisLabelsPositionEdgeTickmarksCount;var gap=(obj.graphWidth/prop.xaxisLabelsPositionEdgeTickmarksCount);x=(gap*i)+prop.gutterLeft+gap;} RG.SVG.create({svg:obj.svg,parent:obj.svg.all,type:'path',attr:{d:'M{1} {2} L{3} {4}'.format(x,startY,x,endY),stroke:prop.xaxisColor,'stroke-width':typeof prop.xaxisLinewidth==='number'?prop.xaxisLinewidth:1,'shape-rendering':"crispEdges"}});}}else{if(prop.xaxisLabelsPosition==='section'){if(obj.type==='bar'||obj.type==='waterfall'){var dataPoints=obj.data.length;}else if(obj.type==='line'){var dataPoints=obj.data[0].length;}else if(obj.type==='scatter'){var dataPoints=prop.xaxisLabels?prop.xaxisLabels.length:10;} if(typeof prop.xaxisLabelsPositionSectionTickmarksCount==='number'){dataPoints=prop.xaxisLabelsPositionSectionTickmarksCount;} for(var i=0;i0){var y=obj.height-prop.gutterBottom+prop.xaxisLabelsOffsety+(prop.xaxis?prop.xaxisTickmarksLength+6:10),str=RG.SVG.numberFormat({object:obj,num:prop.xaxisMin.toFixed(prop.xaxisDecimals),prepend:prop.xaxisUnitsPre,append:prop.xaxisUnitsPost,point:prop.xaxisPoint,thousand:prop.xaxisThousand,formatter:prop.xaxisFormatter});var text=RG.SVG.text({object:obj,parent:obj.svg.all,text:typeof prop.xaxisFormatter==='function'?(prop.xaxisFormatter)(this,prop.xaxisMin):str,x:prop.gutterLeft+prop.xaxisLabelsOffsetx,y:y,halign:'center',valign:'top',tag:'labels.xaxis',font:prop.xaxisTextFont||prop.textFont,size:prop.xaxisTextSize||(typeof prop.textSize==='number'?prop.textSize+'pt':prop.textSize),bold:prop.xaxisTextBold||prop.textBold,italic:prop.xaxisTextItalic||prop.textItalic,color:prop.xaxisTextColor||prop.textColor});}}else{var segment=obj.graphWidth/prop.xaxisLabelsCount,scale=obj.scale;for(var i=0;i0){var y=obj.height-prop.gutterBottom+prop.xaxisLabelsOffsety+(prop.xaxis?prop.xaxisTickmarksLength+6:10),str=RG.SVG.numberFormat({object:obj,num:prop.xaxisMin.toFixed(prop.xaxisDecimals),prepend:prop.xaxisUnitsPre,append:prop.xaxisUnitsPost,point:prop.xaxisPoint,thousand:prop.xaxisThousand,formatter:prop.xaxisFormatter});var text=RG.SVG.text({object:obj,parent:obj.svg.all,text:typeof prop.xaxisFormatter==='function'?(prop.xaxisFormatter)(this,prop.xaxisMin):str,x:prop.gutterLeft+prop.xaxisLabelsOffsetx,y:y,halign:'center',valign:'top',tag:'labels.xaxis',font:prop.xaxisTextFont||prop.textFont,size:prop.xaxisTextSize||(typeof prop.textSize==='number'?prop.textSize+'pt':prop.textSize),bold:prop.xaxisTextBold||prop.textBold,italic:prop.xaxisTextItalic||prop.textItalic,color:prop.xaxisTextColor||prop.textColor});}}}else{if(typeof prop.xaxisLabels==='object'&&!RG.SVG.isNull(prop.xaxisLabels)){var angle=prop.xaxisTextAngle;if(prop.xaxisLabelsPosition==='section'){var segment=(obj.width-prop.gutterLeft-prop.gutterRight)/prop.xaxisLabels.length;for(var i=0;i0?prop.xaxisMin:0);if(prop.xaxisMin<0&&prop.xaxisMax<=0){x=obj.getXCoord(prop.xaxisMax);}}else{var x=prop.gutterLeft;} var axis=RG.SVG.create({svg:obj.svg,parent:obj.svg.all,type:'path',attr:{d:'M{1} {2} L{3} {4}'.format(x,prop.gutterTop,x,obj.height-prop.gutterBottom),stroke:prop.yaxisColor,fill:prop.yaxisColor,'stroke-width':typeof prop.yaxisLinewidth==='number'?prop.yaxisLinewidth:1,'shape-rendering':"crispEdges",'stroke-linecap':'square'}});if(obj.type==='hbar'){var height=(obj.graphHeight-prop.vmarginTop-prop.vmarginBottom)/prop.yaxisLabels.length,y=prop.gutterTop+prop.vmarginTop,len=prop.yaxisLabels.length,startX=obj.getXCoord(0)+(prop.xaxisMin<0?prop.yaxisTickmarksLength:0),endX=obj.getXCoord(0)-prop.yaxisTickmarksLength;if(prop.xaxisMin<0&&prop.xaxisMax<=0){startX=obj.getXCoord(prop.xaxisMax);endX=obj.getXCoord(prop.xaxisMax)+5;} if(typeof prop.yaxisLabelsPositionSectionTickmarksCount==='number'){len=prop.yaxisLabelsPositionSectionTickmarksCount;height=(obj.graphHeight-prop.vmarginTop-prop.vmarginBottom)/len;} if(prop.yaxisTickmarks){for(var i=0;i0&&obj.scale.max>0)){var axis=RG.SVG.create({svg:obj.svg,parent:obj.svg.all,type:'path',attr:{d:'M{1} {2} L{3} {4}'.format(prop.gutterLeft-prop.yaxisTickmarksLength,obj.height-prop.gutterBottom,prop.gutterLeft,obj.height-prop.gutterBottom-0.001),stroke:prop.yaxisColor,'stroke-width':typeof prop.yaxisLinewidth==='number'?prop.yaxisLinewidth:1,'shape-rendering':"crispEdges"}});}}}} if(prop.yaxisScale){var segment=(obj.height-prop.gutterTop-prop.gutterBottom)/prop.yaxisLabelsCount;for(var i=0;iarr[i]){i--;break;}} scale.max=arr[i] scale.labels=[];scale.values=[];for(var j=0;jNumber(topValue)){topValue+=(interval/2);} if(max<=10){topValue=(Number(originalMax)<=5?5:10);} if(obj&&typeof(round)=='boolean'&&round){topValue=10*interval;} scale.max=topValue;for(var i=0;i=0;i-=1){newarr.push(arr[i]);} return newarr;};RG.SVG.arrayClone=function(obj) {if(obj===null||typeof obj!=='object'){return obj;} if(RG.SVG.isArray(obj)){var temp=[];for(var i=0,len=obj.length;i0&&pos<20;};RG.SVG.abs=function(value) {if(typeof value==='string'){value=parseFloat(value)||0;} if(typeof value==='number'){return ma.abs(value);} if(typeof value==='object'){for(i in value){if(typeof i==='string'||typeof i==='number'||typeof i==='object'){value[i]=RG.SVG.abs(value[i]);}} return value;} return 0;};RG.SVG.numberFormat=function(opt) {var obj=opt.object,prepend=opt.prepend?String(opt.prepend):'',append=opt.append?String(opt.append):'',output='',decimal_seperator=typeof opt.point==='string'?opt.point:'.',thousand_seperator=typeof opt.thousand==='string'?opt.thousand:',',num=opt.num decimals_trim=opt.decimals_trim;RegExp.$1='';if(typeof opt.formatter==='function'){return opt.formatter(obj,num);} if(String(num).indexOf('e')>0){return String(prepend+String(num)+append);} num=String(num);if(num.indexOf('.')>0){var tmp=num;num=num.replace(/\.(.*)/,'');decimal=tmp.replace(/(.*)\.(.*)/,'$2');}else{decimal='';} var seperator=thousand_seperator;var foundPoint;for(i=(num.length-1),j=0;i>=0;j++,i--){var character=num.charAt(i);if(j%3==0&&j!=0){output+=seperator;} output+=character;} var rev=output;output='';for(i=(rev.length-1);i>=0;i--){output+=rev.charAt(i);} if(output.indexOf('-'+thousand_seperator)==0){output='-'+output.substr(('-'+thousand_seperator).length);} if(decimal.length){output=output+decimal_seperator+decimal;decimal='';RegExp.$1='';} if(decimals_trim){output=output.replace(/0+$/,'');output=output.replace(/\.$/,'');} if(output.charAt(0)=='-'){output=output.replace(/-/,'');prepend='-'+prepend;} return prepend+output+append;};RG.SVG.text=function(opt) {var obj=opt.object,parent=opt.parent||opt.object.svg.all,size=typeof opt.size==='number'?opt.size+'pt':(typeof opt.size==='string'?opt.size.replace(/pt$/,''):12)+'pt',bold=opt.bold?'bold':'normal',font=opt.font?opt.font:'sans-serif',italic=opt.italic?'italic':'normal',halign=opt.halign,valign=opt.valign,str=opt.text,x=opt.x,y=opt.y,color=opt.color?opt.color:'black',background=opt.background||null,backgroundRounded=opt.backgroundRounded||0,padding=opt.padding||0,link=opt.link||'',linkTarget=opt.linkTarget||'_blank',events=(opt.events===false?false:true),angle=opt.angle;if(typeof str==='number'){str=String(str);} if(RG.SVG.isNull(str)){str='';} if(str&&str.substr(0,2)=='\r\n'||str.substr(0,1)==='\n'){str="\u00A0"+str;} if(halign==='right'){halign='end';}else if(halign==='center'||halign==='middle'){halign='middle';}else{halign='start';} if(valign==='top'){valign='hanging';}else if(valign==='center'||valign==='middle'){valign='central';valign='middle';}else{valign='bottom';} if(link){var a=RGraph.SVG.create({svg:obj.svg,type:'a',parent:parent,attr:{'xlink:href':link,target:linkTarget}});} if(str&&str.indexOf&&str.indexOf("\n")===-1){var text=RG.SVG.create({svg:obj.svg,parent:link?a:opt.parent,type:'text',attr:{tag:opt.tag?opt.tag:'',fill:color,x:x,y:y,'font-size':size,'font-weight':bold,'font-family':font,'font-style':italic,'text-anchor':halign,'dominant-baseline':valign}});var textNode=document.createTextNode(str);text.appendChild(textNode);if(!events){text.style.pointerEvents='none';}}else if(str&&str.indexOf){var dimensions=RG.SVG.measureText({text:'My',bold:bold,font:font,size:size});var lineHeight=dimensions[1];str=str.split(/\r?\n/);if(valign==='bottom'){y-=str.length*lineHeight;} if(valign==='center'||valign==='middle'){y-=(str.length*lineHeight)/2;} var text=RG.SVG.create({svg:obj.svg,parent:link?a:opt.parent,type:'text',attr:{tag:opt.tag?opt.tag:'',fill:color,x:x,y:y,'font-size':size,'font-weight':bold,'font-family':font,'font-style':italic,'text-anchor':halign,'dominant-baseline':valign}});if(!events){text.style.pointerEvents='none';} for(var i=0;i=0){if(RG.SVG.isNull(data[group])){group++;grouped_index=0;continue;} if(typeof data[group]=='number'){group++ grouped_index=0;continue;} grouped_index++;if(grouped_index>=data[group].length){group++;grouped_index=0;}} return[group,grouped_index];};RG.SVG.groupedIndexToSequential=function(opt) {var dataset=opt.dataset,index=opt.index,obj=opt.object;for(var i=0,seq=0;i<=dataset;++i){for(var j=0;j=cx&&y>=cy){angle+=RG.SVG.TRIG.HALFPI;}else if(x>=cx&&y3.14){largeArc='0';sweep='0';}else if(options.anticlockwise&&diff<=3.14){largeArc='1';sweep='0';}else if(!options.anticlockwise&&diff>3.14){largeArc='1';sweep='1';}else if(!options.anticlockwise&&diff<=3.14){largeArc='0';sweep='1';} if(options.start>options.end&&options.anticlockwise&&diff<=3.14){largeArc='0';sweep='0';} if(options.start>options.end&&options.anticlockwise&&diff>3.14){largeArc='1';sweep='1';} if(typeof options.moveto==='boolean'&&options.moveto===false){var d=["A",options.r,options.r,0,largeArc,sweep,end.x,end.y];}else{var d=["M",start.x,start.y,"A",options.r,options.r,0,largeArc,sweep,end.x,end.y];} if(options.array===true){return d;}else{return d.join(" ");}};RG.SVG.TRIG.getArcPath2=function(options) {options.start-=1.57;options.end-=1.57;var start=RG.SVG.TRIG.toCartesian({cx:options.cx,cy:options.cy,r:options.r,angle:options.start});var end=RG.SVG.TRIG.toCartesian({cx:options.cx,cy:options.cy,r:options.r,angle:options.end});var diff=ma.abs(options.end-options.start);var largeArc='0';var sweep='0';if(!options.anticlockwise){if(diff>RG.SVG.TRIG.PI){largeArc='1';sweep='1';}else{largeArc='0';sweep='1';}}else{if(diff>RG.SVG.TRIG.PI){largeArc='1';sweep='0';}else{largeArc='0';sweep='0';}} if(typeof options.lineto==='boolean'&&options.lineto===false){var d=["M",start.x,start.y,"A",options.r,options.r,0,largeArc,sweep,end.x,end.y];}else{var d=["M",options.cx,options.cy,"L",start.x,start.y,"A",options.r,options.r,0,largeArc,sweep,end.x,end.y];} if(options.array===true){return d;}else{return d.join(" ");}};RG.SVG.TRIG.getArcPath3=function(options) {options.start-=(ma.PI/2);options.end-=(ma.PI/2);var start=RG.SVG.TRIG.toCartesian({cx:options.cx,cy:options.cy,r:options.r,angle:options.start});var end=RG.SVG.TRIG.toCartesian({cx:options.cx,cy:options.cy,r:options.r,angle:options.end});var diff=ma.abs(options.end-options.start);var largeArc='0';var sweep='0';if(!options.anticlockwise){if(diff>RG.SVG.TRIG.PI){largeArc='1';sweep='1';}else{largeArc='0';sweep='1';}}else{if(diff>RG.SVG.TRIG.PI){largeArc='1';sweep='0';}else{largeArc='0';sweep='0';}} if(typeof options.lineto==='boolean'&&options.lineto===false){var d=["M",start.x,start.y,"A",options.r,options.r,0,largeArc,sweep,end.x,end.y];}else{var d=["L",start.x,start.y,"A",options.r,options.r,0,largeArc,sweep,end.x,end.y];} if(options.array===true){return d;}else{return d.join(" ");}};RG.SVG.TRIG.getRadiusEndPoint=function(opt) {if(arguments.length===1){var angle=opt.angle,r=opt.r;}else if(arguments.length===4){var angle=arguments[0],r=arguments[1];} var x=ma.cos(angle)*r,y=ma.sin(angle)*r;return[x,y];};RG.SVG.drawTitle=function(obj) {var prop=obj.properties,valign='bottom',originalTitleX=prop.titleX,originalTitleY=prop.titleY,originalTitleSubtitleX=prop.titleSubtitleX,originalTitleSubtitleY=prop.titleSubtitleY;if(typeof originalTitleX==='string')originalTitleX.replace(/^\+/,'');if(typeof originalTitleY==='string')originalTitleY.replace(/^\+/,'');if(typeof originalTitleSubtitleX==='string')originalTitleSubtitleX.replace(/^\+/,'');if(typeof originalTitleSubtitleY==='string')originalTitleSubtitleY.replace(/^\+/,'');if(obj.type==='pie'){if(RG.SVG.isNull(prop.titleX)){prop.titleX=obj.centerx;prop.titleSubtitleX=obj.centerx;} if(RG.SVG.isNull(prop.titleY)){prop.titleY=obj.centery-obj.radius-10;}} if(obj.scale&&obj.scale.max<=0&&obj.scale.min<0&&typeof prop.titleY!=='number'&&obj.type!=='hbar'){prop.titleY=obj.height-prop.gutterBottom+10;var positionBottom=true;valign='top';}else if(typeof prop.titleY!=='number'){var positionBottom=false;prop.titleY=prop.gutterTop-10;valign='bottom';if(!RG.SVG.isNull(prop.key)){prop.titleY-=(2*(prop.keyTextSize||prop.textSize));}} if(prop.titleSubtitle&&typeof prop.titleSubtitleY!=='number'&&!positionBottom){prop.titleY=prop.titleY-(prop.titleSubtitleSize*1.5);} prop.titleSubTitleSize=prop.titleSubTitleSize||prop.textSize;prop.titleSubtitleY=prop.titleSubtitleY||prop.titleY+18;if(positionBottom&&typeof prop.titleSubtitleY!=='number'){prop.titleSubtitleY=prop.titleY+26;} if(prop.title){var x=typeof prop.titleX==='number'?prop.titleX+(prop.variant3dOffsetx||0):prop.gutterLeft+(obj.graphWidth/2)+(prop.variant3dOffsetx||0);var y=prop.titleY+(prop.variant3dOffsety||0);if(typeof originalTitleX==='string'){x+=parseFloat(originalTitleX);} if(typeof originalTitleY==='string'){y+=parseFloat(originalTitleY);} RG.SVG.text({object:obj,svg:obj.svg,parent:obj.svg.all,tag:'title',text:prop.title.toString(),size:prop.titleSize||(prop.textSize+4)||16,x:x,y:y,halign:prop.titleHalign||'center',valign:prop.titleValign||valign,color:prop.titleColor||prop.textColor||'black',bold:prop.titleBold||false,italic:prop.titleItalic||false,font:prop.titleFont||prop.textFont||'Arial'});} if(typeof prop.title==='string'&&typeof prop.titleSubtitle==='string'){y+=(prop.titleSubtitleSize*1.5);if(typeof originalTitleSubtitleX==='number'){x=originalTitleSubtitleX;} if(typeof originalTitleSubtitleY==='number'){y=originalTitleSubtitleY;} if(typeof originalTitleSubtitleX==='string'){x+=parseFloat(originalTitleSubtitleX);} if(typeof originalTitleSubtitleY==='string'){y+=parseFloat(originalTitleSubtitleY);} RG.SVG.text({object:obj,svg:obj.svg,parent:obj.svg.all,tag:'subtitle',text:prop.titleSubtitle,size:prop.titleSubtitleSize,x:x,y:y,halign:prop.titleSubtitleHalign||'center',valign:prop.titleSubtitleValign||valign,color:prop.titleSubtitleColor||prop.textColor||'#aaa',bold:prop.titleSubtitleBold||false,italic:prop.titleSubtitleItalic||false,font:prop.titleSubtitleFont||prop.textFont||'Arial'});}};RG.SVG.trim=function(str) {return RG.SVG.ltrim(RG.SVG.rtrim(str));};RG.SVG.ltrim=function(str) {return String(str).replace(/^(\s|\0)+/,'');};RG.SVG.rtrim=function(str) {return String(str).replace(/(\s|\0)+$/,'');};RG.SVG.parseColorLinear=function(opt) {var obj=opt.object,color=opt.color;if(!color||typeof color!=='string'){return color;} if(color.match(/^gradient\((.*)\)$/i)){var parts=RegExp.$1.split(':'),diff=1/(parts.length-1);if(opt&&opt.direction&&opt.direction==='horizontal'){var grad=RG.SVG.create({type:'linearGradient',parent:obj.svg.defs,attr:{id:'RGraph-linear-gradient-'+obj.uid+'-'+obj.gradientCounter,x1:opt.start||0,x2:opt.end||'100%',y1:0,y2:0,gradientUnits:opt.gradientUnits||"userSpaceOnUse"}});}else{var grad=RG.SVG.create({type:'linearGradient',parent:obj.svg.defs,attr:{id:'RGraph-linear-gradient-'+obj.uid+'-'+obj.gradientCounter,x1:0,x2:0,y1:opt.start||0,y2:opt.end||'100%',gradientUnits:opt.gradientUnits||"userSpaceOnUse"}});} var stop=RG.SVG.create({type:'stop',parent:grad,attr:{offset:'0%','stop-color':RG.SVG.trim(parts[0])}});for(var j=1,len=parts.length;j0){for(var j=0,len=RG.SVG.events[uid].length;j0){x+=parseInt(document.body.style.borderLeftWidth)||0;y+=parseInt(document.body.style.borderTopWidth)||0;} return[x+paddingLeft+borderLeft,y+paddingTop+borderTop];};RG.SVG.FX.update=function(func) {win.requestAnimationFrame=win.requestAnimationFrame||win.webkitRequestAnimationFrame||win.msRequestAnimationFrame||win.mozRequestAnimationFrame||(function(func){setTimeout(func,16.666);});win.requestAnimationFrame(func);};RG.SVG.FX.getEasingMultiplier=function(frames,frame) {var multiplier=ma.pow(ma.sin((frame/frames)*RG.SVG.TRIG.HALFPI),3);return multiplier;};RG.SVG.measureText=function(opt) {var text=opt.text||'',bold=opt.bold||false,font=opt.font||'Arial',size=opt.size||10,str=text+':'+bold+':'+font+':'+size;if(typeof RG.SVG.measuretext_cache==='undefined'){RG.SVG.measuretext_cache=[];} if(typeof RG.SVG.measuretext_cache=='object'&&RG.SVG.measuretext_cache[str]){return RG.SVG.measuretext_cache[str];} if(!RG.SVG.measuretext_cache['text-span']){var span=document.createElement('SPAN');span.style.position='absolute';span.style.padding=0;span.style.display='inline';span.style.top='-200px';span.style.left='-200px';span.style.lineHeight='1em';document.body.appendChild(span);RG.SVG.measuretext_cache['text-span']=span;}else if(RG.SVG.measuretext_cache['text-span']){var span=RG.SVG.measuretext_cache['text-span'];} span.innerHTML=text.replace(/\r?\n/g,'
');span.style.fontFamily=font;span.style.fontWeight=bold?'bold':'normal';span.style.fontSize=String(size).replace(/pt$/,'')+'pt';var sizes=[span.offsetWidth,span.offsetHeight];RG.SVG.measuretext_cache[str]=sizes;return sizes;};RG.SVG.stringsToNumbers=function(str) {var sep=arguments[1]||',';if(typeof str==='number'){return str;} if(typeof str==='string'){if(str.indexOf(sep)!=-1){str=str.split(sep);}else{str=parseFloat(str);}} if(typeof str==='object'){for(var i=0,len=str.length;i=5){return'';} switch(typeof obj){case'string':str+=obj+' ('+(typeof obj)+', '+obj.length+')';break;case'number':str+=obj+' ('+(typeof obj)+')';break;case'boolean':str+=obj+' ('+(typeof obj)+')';break;case'function':str+='function () {}';break;case'undefined':str+='undefined';break;case'null':str+='null';break;case'object':if(RGraph.SVG.isNull(obj)){str+=indent+'null\n';}else{str+=indent+'Object {'+'\n' for(j in obj){str+=indent+' '+j+' => '+window.$p(obj[j],true,indent+' ',counter+1)+'\n';} str+=indent+'}';} break;default:str+='Unknown type: '+typeof obj+'';break;} if(!arguments[1]){alert(str);} return str;};window.$a=function(v) {alert(v);};window.$cl=function(v) {return console.log(v);};if(!String.prototype.format){String.prototype.format=function() {var args=arguments;return this.replace(/{(\d+)}/g,function(str,idx) {return typeof args[idx-1]!=='undefined'?args[idx-1]:str;});};} ================================================ FILE: docs/RGraph/libraries/RGraph.svg.common.csv.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.SVG=RGraph.SVG||{};if(!RGraph.SVG.AJAX)RGraph.SVG.AJAX=function(url,callback) {if(window.XMLHttpRequest){var httpRequest=new XMLHttpRequest();}else if(window.ActiveXObject){var httpRequest=new ActiveXObject("Microsoft.XMLHTTP");} httpRequest.onreadystatechange=function() {if(this.readyState==4&&this.status==200){this.__user_callback__=callback;this.__user_callback__(this.responseText);}} httpRequest.open('GET',url,true);httpRequest.send();};if(!RGraph.SVG.getString)RGraph.SVG.AJAX.getString=function(url,callback) {RGraph.SVG.AJAX(url,function() {var str=String(this.responseText);callback(str);});};if(!RGraph.SVG.createUID)RGraph.SVG.createUID=function() {return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c) {var r=Math.random()*16|0,v=c=='x'?r:(r&0x3|0x8);return v.toString(16);});};RGraph.CSV=function(url,func) {this.url=url;this.ready=func;this.data=null;this.numrows=null;this.numcols=null;this.seperator=arguments[2]||',';this.endofline=arguments[3]||/\r?\n/;this.splitCSV=function(str,split) {var arr=[];var field='';var inDoubleQuotes=false;var inSingleQuotes=false;var preserve=(typeof split==='object'&&split.preserve)?true:false;if(typeof split==='object'){if(typeof split.char==='string'){split=split.char;}else{split=',';}} for(var i=0,len=str.length;i=frames){callback(obj);}},(index/frames)*duration);})(i)} return this;};RG.SVG.FX.fadeout=function() {var obj=this,opt=arguments[0]||{},frames=opt.frames||90,duration=(frames/60)*1000,frame=0,callback=opt.callback||function(){};for(var i=1;i<=frames;++i){(function(index) {setTimeout(function() {obj.svg.style.opacity=1-(index/frames);if(index>=frames){callback(obj);}},(index/frames)*duration);})(i)} return this;};RG.SVG.FX.fadeslidein=function() {var obj=this,opt=arguments[0]||{},frames=opt.frames||90,frame=0,pc=-20,step=(120-pc)/frames,color=opt.color||'white',width=this.container.offsetWidth,height=this.container.offsetHeight,callback=opt.callback||function(){};RG.SVG.redraw(this.svg);$('
').css({background:'linear-gradient(135deg, rgba(255,255,255,0) '+pc+'%, '+color+' '+(pc+20)+'%)',width:width+'px',height:height+'px',top:0,left:0,position:'absolute'}).appendTo($(this.container));function iterator() {if(pc<120){$('div#rgraph_fadeslide_cover_'+obj.id).css({background:'linear-gradient(135deg, rgba(255,255,255,0) '+pc+'%, '+color+' '+(pc+20)+'%)'});pc+=step;RG.SVG.FX.update(iterator);}else{$('div#rgraph_fadeslide_cover_'+obj.id).remove();callback(obj);}} iterator();return this;};RG.SVG.FX.fadeslideout=function() {var obj=this,opt=arguments[0]||{},frames=opt.frames||90,frame=0,pc=-20,step=(120-pc)/frames,canvasXY=RG.SVG.getSVGXY(obj.svg),color=opt.color||'white',width=this.container.offsetWidth,height=this.container.offsetHeight,callback=opt.callback||function(){};$('
').css({background:'linear-gradient(135deg, '+color+' '+pc+'%, rgba(255,255,255,0) '+(pc+20)+'%)',width:width+'px',height:height+'px',top:0,left:0,position:'absolute'}).appendTo($(obj.svg.parentNode));function iterator() {if(pc<120){$('div#rgraph_fadeslide_cover_'+obj.id).css({background:'linear-gradient(135deg, '+color+' '+pc+'%, rgba(255,255,255,0) '+(pc+20)+'%)'});pc+=step;RG.SVG.FX.update(iterator);}else{RG.SVG.clear(obj.svg);$('div#rgraph_fadeslide_cover_'+obj.id).remove();callback(obj);}} iterator();return this;};RG.SVG.FX.fadecircularinoutwards=function() {var obj=this,opt=arguments[0]||{},frames=opt.frames||90,frame=1,radius=0,svgXY=RG.SVG.getSVGXY(obj.svg),color=opt.color||'white',callback=opt.callback||function(){};RG.SVG.redraw(this.svg);$('
').css({background:'radial-gradient(rgba(255,255,255,0) 0%, '+color+' '+radius+'%)',width:this.container.offsetWidth+'px',height:this.container.offsetHeight+'px',top:0,left:0,position:'absolute'}).appendTo($(obj.svg.parentNode));function iterator() {if(frame').css({background:'radial-gradient(rgba(255,255,255,0) 0%, transparent 0%)',width:width+'px',height:height+'px',top:0,left:0,position:'absolute'}).appendTo($(obj.svg.parentNode));function iterator() {if(frame').css({background:'radial-gradient(rgba(255,255,255,0) 100%, rgba(255,255,255,0) 0%)',width:this.container.offsetWidth+'px',height:this.container.offsetHeight+'px',top:0,left:0,position:'absolute'}).appendTo($(obj.svg.parentNode));function iterator() {if(frame').css({background:'radial-gradient(rgba(255,255,255,0) 0%, rgba(255,255,255,0) 0%)',width:this.container.offsetWidth+'px',height:this.container.offsetHeight+'px',top:0,left:0,position:'absolute'}).appendTo($(obj.svg.parentNode));function iterator() {if(frame';for(var i=0;i
 
'+(prop.links&&prop.links[i]?'':'')+''+prop.labels[i]+''+(prop.links&&prop.links[i]?'':'')+'';} div.innerHTML+=(str+'');return doc.getElementById('rgraph_key');};})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.common.sheets.js ================================================ RGraph=window.RGraph||{isRGraph:true};(function(win,doc,undefined) {RGraph.Sheets=function(key) {var worksheet,callback,letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ';if(arguments.length===3){worksheet=Number(arguments[1]);callback=arguments[2];}else{worksheet=1;callback=arguments[1];} var url='https://spreadsheets.google.com/feeds/cells/[KEY]/[WORKSHEET]/public/full?alt=json-in-script&callback=__rgraph_JSONPCallback'.replace(/\[KEY\]/,key).replace(/\[WORKSHEET\]/,worksheet);this.load=function(url,userCallback) {var obj=this;__rgraph_JSONPCallback=function(json) {obj.json=json;var grid=[],row=0,col=0;for(var i=0;i=0;i--){if(arr[i]||content){out.push(arr[i]);content=true;}} arr=out.reverse();return out;};})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.common.tooltips.js ================================================ RGraph=window.RGraph||{isRGraph:true,isRGraphSVG:true};RGraph.SVG=RGraph.SVG||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math;RG.SVG.tooltips={};RG.SVG.tooltips.style={display:'inline-block',position:'absolute',padding:'6px',fontFamily:'Arial',fontSize:'12pt',fontWeight:'normal',textAlign:'center',left:0,top:0,backgroundColor:'rgb(255,255,239)',color:'black',visibility:'visible',zIndex:3,borderRadius:'5px',boxShadow:'rgba(96,96,96,0.5) 0 0 5px',transition:'left ease-out .25s, top ease-out .25s'};RG.SVG.tooltip=function(opt) {var obj=opt.object;RG.SVG.fireCustomEvent(obj,'onbeforetooltip');if(!opt.text||typeof opt.text==='undefined'||RG.SVG.trim(opt.text).length===0){return;} var prop=obj.properties;if(typeof prop.tooltipsOverride==='function'){document.body.addEventListener('mouseup',function(e) {obj.removeHighlight();},false);return(prop.tooltipsOverride)(obj,opt);} if(!RG.SVG.REG.get('tooltip')){var tooltipObj=document.createElement('DIV');tooltipObj.className=prop.tooltipsCssClass;for(var i in RG.SVG.tooltips.style){if(typeof i==='string'){tooltipObj.style[i]=RG.SVG.tooltips.style[i];}}}else{var tooltipObj=RG.SVG.REG.get('tooltip');tooltipObj.__object__.removeHighlight();tooltipObj.style.width='';} if(RG.SVG.REG.get('tooltip-lasty')){tooltipObj.style.left=RG.SVG.REG.get('tooltip-lastx')+'px';tooltipObj.style.top=RG.SVG.REG.get('tooltip-lasty')+'px';} tooltipObj.innerHTML=opt.text;tooltipObj.__text__=opt.text;tooltipObj.id='__rgraph_tooltip_'+obj.id+'_'+obj.uid+'_'+opt.index;tooltipObj.__event__=prop.tooltipsEvent||'click';tooltipObj.__object__=obj;if(typeof opt.index==='number'){tooltipObj.__index__=opt.index;} if(typeof opt.dataset==='number'){tooltipObj.__dataset__=opt.dataset;} if(typeof opt.group==='number'||RG.SVG.isNull(opt.group)){tooltipObj.__group__=opt.group;} if(typeof opt.sequentialIndex==='number'){tooltipObj.__sequentialIndex__=opt.sequentialIndex;} document.body.appendChild(tooltipObj);var width=tooltipObj.offsetWidth,height=tooltipObj.offsetHeight;tooltipObj.style.left=opt.event.pageX-(width/2)+'px';tooltipObj.style.top=opt.event.pageY-height-15+'px';tooltipObj.style.width=width+'px';if(!RG.SVG.REG.get('tooltip-lastx')){for(var i=0;i<=30;++i){(function(idx) {setTimeout(function() {tooltipObj.style.opacity=(idx/30)*1;},(idx/30)*200);})(i);}} if(parseFloat(tooltipObj.style.left)<=5){tooltipObj.style.left='5px';} if(parseFloat(tooltipObj.style.left)+parseFloat(tooltipObj.style.width)>window.innerWidth){tooltipObj.style.left='' tooltipObj.style.right='5px'} if(RG.SVG.isFixed(obj.svg)){var scrollTop=window.scrollY||document.documentElement.scrollTop;tooltipObj.style.position='fixed';tooltipObj.style.top=opt.event.pageY-scrollTop-height-10+'px';} tooltipObj.onmousedown=function(e) {e.stopPropagation();};tooltipObj.onmouseup=function(e) {e.stopPropagation();};tooltipObj.onclick=function(e) {if(e.button==0){e.stopPropagation();}};document.body.addEventListener('mouseup',function(e) {RG.SVG.hideTooltip();},false);RG.SVG.REG.set('tooltip',tooltipObj);RG.SVG.REG.set('tooltip-lastx',parseFloat(tooltipObj.style.left));RG.SVG.REG.set('tooltip-lasty',parseFloat(tooltipObj.style.top));RG.SVG.fireCustomEvent(obj,'ontooltip');};})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.funnel.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.SVG=RGraph.SVG||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math,win=window,doc=document;RG.SVG.Funnel=function(conf) {this.set=function(name,value) {if(arguments.length===1&&typeof name==='object'){for(i in arguments[0]){if(typeof i==='string'){var ret=RG.SVG.commonSetter({object:this,name:i,value:arguments[0][i]});name=ret.name;value=ret.value;this.set(name,value);}}}else{var ret=RG.SVG.commonSetter({object:this,name:name,value:value});name=ret.name;value=ret.value;this.properties[name]=value;if(name==='colors'){this.originalColors=RG.SVG.arrayClone(value);this.colorsParsed=false;}} return this;};this.id=conf.id;this.uid=RG.SVG.createUID();this.container=document.getElementById(this.id);this.layers={};this.svg=RG.SVG.createSVG({object:this,container:this.container});this.isRGraph=true;this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));this.data=RG.SVG.arrayClone(conf.data);this.originalData=RG.SVG.arrayClone(conf.data);this.type='funnel';this.coords=[];this.colorsParsed=false;this.originalColors={};this.gradientCounter=1;this.nodes=[];this.shadowNodes=[];this.max=0;this.redraw=false;this.highlight_node=null;RG.SVG.OR.add(this);this.container.style.display='inline-block';var obj=this;this.data.forEach(function(val,key,arr) {obj.max=ma.max(obj.max,val);});this.properties={gutterLeft:35,gutterRight:35,gutterTop:35,gutterBottom:35,backgroundbars:false,backgroundBarsOpacity:0.25,backgroundBarsColors:null,strokestyle:'white',colors:['red','black','orange','green','#6ff','#ccc','pink','orange','cyan','maroon','olive','teal'],colorsOpacity:1,textColor:'black',textFont:'sans-serif',textSize:12,textBold:false,textItalic:false,labels:[],labelsFont:null,labelsSize:null,labelsColor:null,labelsBold:null,labelsItalic:null,labelsBackground:null,labelsAlign:'center',labelsPosition:'section',linewidth:1,tooltips:null,tooltipsOverride:null,tooltipsEffect:'fade',tooltipsCssClass:'RGraph_tooltip',tooltipsEvent:'click',highlightStroke:'rgba(0,0,0,0)',highlightStroke:'rgba(0,0,0,0)',highlightFill:'rgba(255,255,255,0.7)',highlightLinewidth:1,title:'',titleSize:16,titleX:null,titleY:null,titleHalign:'center',titleValign:null,titleColor:'black',titleFont:null,titleBold:false,titleItalic:false,titleSubtitle:null,titleSubtitleSize:10,titleSubtitleX:null,titleSubtitleY:null,titleSubtitleHalign:'center',titleSubtitleValign:null,titleSubtitleColor:'#aaa',titleSubtitleFont:null,titleSubtitleBold:false,titleSubtitleItalic:false,shadow:false,shadowOffsetx:2,shadowOffsety:2,shadowBlur:2,shadowOpacity:0.25,key:null,keyColors:null,keyOffsetx:0,keyOffsety:0,keyTextOffsetx:0,keyTextOffsety:-1,keyTextSize:null,keyTextBold:null,keyTextItalic:null};RG.SVG.getGlobals(this);if(RG.SVG.FX&&typeof RG.SVG.FX.decorate==='function'){RG.SVG.FX.decorate(this);} var prop=this.properties;this.draw=function() {RG.SVG.fireCustomEvent(this,'onbeforedraw');this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));this.data=RG.SVG.arrayClone(this.originalData);this.coords=[];RG.SVG.createDefs(this);this.graphWidth=this.width-prop.gutterLeft-prop.gutterRight;this.graphHeight=this.height-prop.gutterTop-prop.gutterBottom;for(var i=0,len=this.data.length;ithis.innerMax)this.value=this.innerMax;if(this.value0){this.graphHeight-=prop.gutterTop;} this.centerx=(this.graphWidth/2)+prop.gutterLeft;this.centery=(this.graphHeight/2)+prop.gutterTop;this.radius=ma.min(this.graphWidth/2,this.graphHeight/2);if(prop.title.length>0){this.centery+=10;this.radius-=10;} this.centerx=typeof prop.centerx==='number'?prop.centerx:this.centerx;this.centery=typeof prop.centery==='number'?prop.centery:this.centery;this.radius=typeof prop.radius==='number'?prop.radius:this.radius;if(typeof prop.radius==='string'&&prop.radius.match(/^\+|-\d+$/))this.radius+=parseFloat(prop.radius);if(typeof prop.centerx==='string'&&prop.centerx.match(/^\+|-\d+$/))this.centery+=parseFloat(prop.centerx);if(typeof prop.centery==='string'&&prop.centery.match(/^\+|-\d+$/))this.centerx+=parseFloat(prop.centery);RG.SVG.resetColorsToOriginalValues({object:this});this.parseColors();if(prop.rmargin===null){if(prop.scaleOuter){prop.rmargin=40;}else{prop.rmargin=25;}} this.drawMeter();this.drawNeedle();if(prop.labelsIngraph){this.drawIngraph();} RG.SVG.drawTitle(this);if(prop.adjustable){this.adjusting_mousedown=false;var func=function(e) {var svg=e.currentTarget,obj=svg.__object__,mouseX=e.offsetX,mouseY=e.offsetY;var radius=RG.SVG.TRIG.getHypLength({x1:mouseX,y1:mouseY,x2:obj.centerx,y2:obj.centery,object:obj});if(radius>obj.radius){return;} var value=obj.getValue(e);obj.value=value;obj.drawNeedle();};var obj=this;this.svg.addEventListener('mousedown',function(e) {this.adjusting_mousedown=true;func(e);},false);this.svg.addEventListener('mousemove',function(e) {if(this.adjusting_mousedown){func(e);}},false);this.svg.addEventListener('mouseup',function(e) {this.adjusting_mousedown=false;},false);} RG.SVG.fireCustomEvent(this,'ondraw');return this;};this.drawMeter=function() {this.scaleInner=RG.SVG.getScale({object:this,numlabels:prop.scaleInnerLabelsCount,unitsPre:prop.scaleInnerUnitsPre,unitsPost:prop.scaleInnerUnitsPost,max:this.innerMax,min:this.innerMin,point:prop.scaleInnerPoint,round:prop.scaleInnerRound,thousand:prop.scaleInnerThousand,decimals:prop.scaleInnerDecimals,strict:true,formatter:prop.scaleInnerFormatter});this.scaleOuter=RG.SVG.getScale({object:this,numlabels:prop.scaleOuterLabelsCount,unitsPre:prop.scaleOuterUnitsPre,unitsPost:prop.scaleOuterUnitsPost,max:this.outerMax,min:this.outerMin,point:prop.scaleOuterPoint,round:prop.scaleOuterRound,thousand:prop.scaleOuterThousand,decimals:prop.scaleOuterDecimals,strict:true,formatter:prop.scaleOuterFormatter});this.nodes.background=RG.SVG.create({svg:this.svg,type:'circle',parent:this.svg.all,attr:{cx:this.centerx,cy:this.centery,r:this.radius,stroke:prop.backgroundStroke,fill:prop.backgroundFill}});this.nodes.innerAxisGroup=RG.SVG.create({svg:this.svg,type:'g',parent:this.svg.all,attr:{id:'innerAxisGroup',}});this.nodes.outerAxisGroup=RG.SVG.create({svg:this.svg,type:'g',parent:this.svg.all,attr:{id:'outerAxisGroup',}});var innerPath=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.innerGap-prop.rmargin,start:this.angleStart,end:this.angleEnd,anticlockwise:false,lineto:false});var inner=RG.SVG.create({svg:this.svg,type:'path',parent:this.nodes.innerAxisGroup,attr:{d:innerPath,stroke:prop.colors[1],fill:'transparent','stroke-width':prop.linewidth}});var outerPath=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.rmargin,start:this.angleStart,end:this.angleEnd,anticlockwise:false,lineto:false});var outer=RG.SVG.create({svg:this.svg,type:'path',parent:this.nodes.outerAxisGroup,attr:{d:outerPath,stroke:prop.colors[0],fill:'transparent','stroke-width':prop.linewidth}});this.nodes.outerAxis=outerPath;this.nodes.innerAxis=innerPath;var numticks=prop.tickmarksCount,gap=this.angleSpan/numticks,numlabels=prop.tickmarksCount;for(var i=0;i<=numticks;++i){if(prop.scaleOuter){var path_a=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.rmargin,start:this.angleStart+(i*gap),end:this.angleStart+(i*gap),anticlockwise:false,lineto:false});var path_b=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius+prop.tickmarksOuterSize-prop.rmargin,start:this.angleStart+(i*gap),end:this.angleStart+(i*gap),anticlockwise:false,lineto:true});RG.SVG.create({svg:this.svg,type:'path',parent:this.nodes.outerAxisGroup,attr:{d:path_a+' '+path_b,stroke:prop.colors[0],fill:'transparent','stroke-width':prop.linewidth,'stroke-linecap':'square'}});var coords=RG.SVG.TRIG.toCartesian({cx:this.centerx,cy:this.centery,r:this.radius+prop.tickmarksOuterSize+10-prop.rmargin,angle:this.angleStart-RG.SVG.TRIG.HALFPI+(i*gap)});var halign=(coords.x>this.centerx?'left':'right');if(i/numlabels===0.5){halign='center';} RG.SVG.text({object:this,svg:this.svg,parent:this.nodes.outerAxisGroup,tag:'scale.outer',text:(i===0?RG.SVG.numberFormat({object:this,prepend:prop.scaleOuterUnitsPre,append:prop.scaleOuterUnitsPost,num:this.outerMin.toFixed(prop.scaleOuterDecimals),point:prop.scaleOuterPoint,thousand:prop.scaleOuterThousand}):this.scaleOuter.labels[i-1]),size:prop.scaleOuterSize||prop.textSize,x:coords.x,y:coords.y,halign:halign,valign:'center',padding:2,color:prop.scaleOuterColor||prop.textColor,bold:typeof prop.scaleOuterBold==='boolean'?prop.scaleOuterBold:prop.textBold,italic:typeof prop.scaleOuterItalic==='boolean'?prop.scaleOuterItalic:prop.textItalic,font:prop.scaleOuterFont||prop.textFont});}else{var path_a=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.rmargin,start:this.angleStart,end:this.angleStart,anticlockwise:false,lineto:false});var path_b=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.innerGap-prop.rmargin,start:this.angleStart,end:this.angleStart,anticlockwise:false,lineto:true});RG.SVG.create({svg:this.svg,type:'path',parent:this.nodes.innerAxisGroup,attr:{d:path_a+path_b,stroke:prop.colors[1],fill:'transparent','stroke-width':prop.linewidth,'stroke-linecap':'square'}});var path_a=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.rmargin,start:this.angleEnd,end:this.angleEnd,anticlockwise:false,lineto:false});var path_b=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.innerGap-prop.rmargin,start:this.angleEnd,end:this.angleEnd,anticlockwise:false,lineto:true});RG.SVG.create({svg:this.svg,type:'path',parent:this.nodes.innerAxisGroup,attr:{d:path_a+path_b,stroke:prop.colors[1],fill:'transparent','stroke-width':prop.linewidth,'stroke-linecap':'square'}});} var path_a=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.rmargin-prop.innerGap,start:this.angleStart+(i*gap),end:this.angleStart+(i*gap),anticlockwise:false,lineto:false});var path_b=RG.SVG.TRIG.getArcPath3({cx:this.centerx,cy:this.centery,r:this.radius-prop.innerGap-prop.tickmarksOuterSize-prop.rmargin,start:this.angleStart+(i*gap),end:this.angleStart+(i*gap),anticlockwise:false,lineto:true});RG.SVG.create({svg:this.svg,type:'path',parent:this.nodes.innerAxisGroup,attr:{d:path_a+' '+path_b,stroke:prop.colors[1],fill:'transparent','stroke-width':prop.linewidth,'stroke-linecap':'square'}});var coords=RG.SVG.TRIG.toCartesian({cx:this.centerx,cy:this.centery,r:this.radius-prop.innerGap-prop.tickmarksInnerSize-10-prop.rmargin,angle:this.angleStart-RG.SVG.TRIG.HALFPI+(i*gap)});var halign=(coords.x>this.centerx?'right':'left');if(i/numlabels===0.5){halign='center';} RG.SVG.text({object:this,svg:this.svg,parent:this.nodes.innerAxisGroup,tag:'scale.inner',text:(i===0?RG.SVG.numberFormat({object:this,prepend:prop.scaleInnerUnitsPre,append:prop.scaleInnerUnitsPost,num:this.innerMin.toFixed(prop.scaleInnerDecimals),point:prop.scaleInnerPoint,thousand:prop.scaleInnerThousand}):this.scaleInner.labels[i-1]),size:prop.scaleInnerSize||prop.textSize,x:coords.x,y:coords.y,halign:halign,valign:'center',padding:2,color:prop.scaleInnerColor||prop.textColor,bold:typeof prop.scaleInnerBold==='boolean'?prop.scaleInnerBold:prop.textBold,italic:typeof prop.scaleInnerItalic==='boolean'?prop.scaleInnerItalic:prop.textItalic,font:prop.scaleInnerFont||prop.textFont});}};this.drawIngraph=function() {if(this.nodes.labelsIngraphGroup){this.nodes.labelsIngraphGroup.parentNode.removeChild(this.nodes.labelsIngraphGroup);} this.nodes.labelsIngraphGroup=RG.SVG.create({svg:this.svg,type:'g',parent:this.svg.all,attr:{id:'labelsIngraphGroup',}});this.nodes.labelsIngraph=RG.SVG.text({object:this,parent:this.nodes.labelsIngraphGroup,text:RG.SVG.numberFormat({prepend:prop.labelsIngraphUnitsPre,append:prop.labelsIngraphUnitsPost,decimal_seperator:prop.labelsIngraphPoint,thousand_seperator:prop.labelsIngraphThousand,formatter:prop.labelsIngraphFormatter,num:this.value.toFixed(prop.labelsIngraphDecimals)}),x:this.centerx,y:this.centery+this.radius-prop.rmargin-30,background:prop.labelsIngraphBackground,backgroundRounded:prop.labelsIngraphRounded,padding:prop.labelsIngraphPadding,halign:'center',valign:'center',size:prop.labelsIngraphSize||prop.textSize+2,bold:typeof prop.labelsIngraphBold==='boolean'?prop.labelsIngraphBold:prop.textBold,italic:typeof prop.labelsIngraphItalic==='boolean'?prop.labelsIngraphItalic:prop.textItalic,font:prop.labelsIngraphFont||prop.textFont,color:prop.labelsIngraphColor||prop.textColor});var rect=this.nodes.labelsIngraph.previousSibling;rect.setAttribute('stroke','#aaa');var func=function(e){e.stopPropagation();};rect.addEventListener('mousedown',func,false);this.nodes.labelsIngraph.addEventListener('mousedown',func,false);};this.drawNeedle=function() {if(this.nodes.needleGroup){this.nodes.needleGroup.parentNode.removeChild(this.nodes.needleGroup);} this.nodes.needleGroup=RG.SVG.create({svg:this.svg,type:'g',parent:this.svg.all,attr:{id:'needle-group',fill:prop.needleColor,stroke:prop.needleColor}});var angle=(this.value-this.innerMin)/(this.innerMax-this.innerMin)*this.angleSpan;angle+=RG.SVG.TRIG.HALFPI+(RG.SVG.TRIG.HALFPI/2);var coords=RG.SVG.TRIG.toCartesian({cx:this.centerx,cy:this.centery,r:this.radius-60,angle:angle});var coords2=RG.SVG.TRIG.toCartesian({cx:this.centerx,cy:this.centery,r:prop.centerpinRadius,angle:angle-RG.SVG.TRIG.HALFPI});var coords3=RG.SVG.TRIG.toCartesian({cx:this.centerx,cy:this.centery,r:prop.centerpinRadius,angle:angle+RG.SVG.TRIG.HALFPI});RG.SVG.create({svg:this.svg,type:'path',parent:this.nodes.needleGroup,attr:{'stroke-width':1,'stroke-linecap':"round",d:'M{1} {2} L{3} {4} L{5} {6} z'.format(coords.x,coords.y,coords2.x,coords2.y,coords3.x,coords3.y)}});RG.SVG.create({svg:this.svg,type:'circle',parent:this.nodes.needleGroup,attr:{cx:this.centerx,cy:this.centery,r:prop.centerpinRadius}});if(prop.labelsIngraph){this.drawIngraph();}};this.parseColors=function() {if(!Object.keys(this.originalColors).length){this.originalColors={colors:RG.SVG.arrayClone(prop.colors),backgroundFill:RG.SVG.arrayClone(prop.backgroundFill),backgroundStroke:RG.SVG.arrayClone(prop.backgroundStroke),labelsIngraphBackground:RG.SVG.arrayClone(prop.labelsIngraphBackground)}} prop.backgroundFill=RG.SVG.parseColorLinear({object:this,color:prop.backgroundFill,start:prop.gutterTop,end:this.height-prop.gutterBottom,direction:'vertical'});prop.backgroundStroke=RG.SVG.parseColorLinear({object:this,color:prop.backgroundStroke,start:prop.gutterTop,end:this.height-prop.gutterBottom,direction:'vertical'});prop.labelsIngraphBackground=RG.SVG.parseColorLinear({object:this,color:prop.labelsIngraphBackground,direction:'vertical',gradientUnits:'objectBoundingBox'});};this.getValue=function(e) {var mouseX=e.offsetX,mouseY=e.offsetY;var angle=RG.SVG.TRIG.getAngleByXY({cx:this.centerx,cy:this.centery,x:mouseX,y:mouseY});if(mouseXthis.innerMax)value=this.innerMax;return value;};this.on=function(type,func) {if(type.substr(0,2)!=='on'){type='on'+type;} RG.SVG.addCustomEventListener(this,type,func);return this;};this.exec=function(func) {func(this);return this;};for(i in conf.options){if(typeof i==='string'){this.set(i,conf.options[i]);}}};return this;})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.hbar.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.SVG=RGraph.SVG||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math,win=window,doc=document;RG.SVG.HBar=function(conf) {this.set=function(name,value) {if(arguments.length===1&&typeof name==='object'){for(i in arguments[0]){if(typeof i==='string'){var ret=RG.SVG.commonSetter({object:this,name:i,value:arguments[0][i]});name=ret.name;value=ret.value;this.set(name,value);}}}else{var ret=RG.SVG.commonSetter({object:this,name:name,value:value});name=ret.name;value=ret.value;this.properties[name]=value;if(name==='colors'){this.originalColors=RG.SVG.arrayClone(value);this.colorsParsed=false;}} return this;};this.id=conf.id;this.uid=RG.SVG.createUID();this.container=document.getElementById(this.id);this.layers={};this.svg=RG.SVG.createSVG({object:this,container:this.container});this.isRGraph=true;this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));this.data=conf.data;this.type='hbar';this.coords=[];this.coords2=[];this.stackedBackfaces=[];this.colorsParsed=false;this.originalColors={};this.gradientCounter=1;RG.SVG.OR.add(this);this.container.style.display='inline-block';this.properties={gutterLeft:100,gutterRight:35,gutterTop:35,gutterBottom:35,gutterLeftAutosize:true,backgroundColor:null,backgroundImage:null,backgroundImageAspect:'none',backgroundImageStretch:true,backgroundImageOpacity:null,backgroundImageX:null,backgroundImageY:null,backgroundImageW:null,backgroundImageH:null,backgroundGrid:true,backgroundGridColor:'#ddd',backgroundGridLinewidth:1,backgroundGridHlines:true,backgroundGridHlinesCount:null,backgroundGridVlines:true,backgroundGridVlinesCount:null,backgroundGridBorder:true,backgroundGridDashed:false,backgroundGridDotted:false,backgroundGridDashArray:null,colors:['red','#0f0','#00f','#ff0','#0ff','#0f0','pink','orange','gray','black','red','#0f0','#00f','#ff0','#0ff','#0f0','pink','orange','gray','black'],colorsSequential:false,strokestyle:'rgba(0,0,0,0)',vmargin:3,vmarginGrouped:2,vmarginTop:0,vmarginBottom:0,xaxis:true,xaxisTickmarks:true,xaxisTickmarksLength:5,xaxisColor:'black',xaxisLabels:[],xaxisLabelsOffsetx:0,xaxisLabelsOffsety:0,xaxisLabelsCount:5,xaxisScale:true,xaxisUnitsPre:'',xaxisUnitsPost:'',xaxisStrict:false,xaxisDecimals:0,xaxisPoint:'.',xaxisThousand:',',xaxisRound:false,xaxisMax:null,xaxisMin:0,xaxisFormatter:null,xaxisLabelsPositionEdgeTickmarksCount:null,xaxisTextColor:null,xaxisTextBold:null,xaxisTextItalic:null,xaxisTextFont:null,xaxisTextSize:null,yaxis:true,yaxisTickmarks:true,yaxisTickmarksLength:3,yaxisLabels:[],yaxisLabelsPosition:'section',yaxisLabelsOffsetx:0,yaxisLabelsOffsety:0,yaxisScale:false,yaxisLabelsPositionSectionTickmarksCount:null,yaxisColor:'black',yaxisTextFont:null,yaxisTextSize:null,yaxisTextColor:null,yaxisTextBold:null,yaxisTextItalic:null,textColor:'black',textFont:'sans-serif',textSize:12,textBold:false,textItalic:false,labelsAbove:false,labelsAboveFont:null,labelsAboveSize:null,labelsAboveBold:null,labelsAboveItalic:null,labelsAboveColor:null,labelsAboveBackground:null,labelsAboveBackgroundPadding:0,labelsAboveUnitsPre:null,labelsAboveUnitsPost:null,labelsAbovePoint:null,labelsAboveThousand:null,labelsAboveFormatter:null,labelsAboveDecimals:null,labelsAboveOffsetx:0,labelsAboveOffsety:0,labelsAboveHalign:'left',labelsAboveValign:'center',labelsAboveSpecific:null,linewidth:1,grouping:'grouped',tooltips:null,tooltipsOverride:null,tooltipsEffect:'fade',tooltipsCssClass:'RGraph_tooltip',tooltipsEvent:'click',highlightStroke:'rgba(0,0,0,0)',highlightFill:'rgba(255,255,255,0.7)',highlightLinewidth:1,title:'',titleSize:16,titleX:null,titleY:null,titleHalign:'center',titleValign:null,titleColor:'black',titleFont:null,titleBold:false,titleItalic:false,titleSubtitle:null,titleSubtitleX:null,titleSubtitleY:null,titleSubtitleHalign:'center',titleSubtitleValign:null,titleSubtitleColor:'#aaa',titleSubtitleSize:10,titleSubtitleFont:null,titleSubtitleBold:false,titleSubtitleItalic:false,shadow:false,shadowOffsetx:2,shadowOffsety:2,shadowBlur:2,shadowOpacity:0.25,key:null,keyColors:null,keyOffsetx:0,keyOffsety:0,keyTextOffsetx:0,keyTextOffsety:-1,keyTextSize:null,keyTextBold:null,keyTextItalic:null};RG.SVG.getGlobals(this);if(RG.SVG.FX&&typeof RG.SVG.FX.decorate==='function'){RG.SVG.FX.decorate(this);} var prop=this.properties;this.draw=function() {RG.SVG.fireCustomEvent(this,'onbeforedraw');this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));this.coords=[];this.coords2=[];RG.SVG.createDefs(this);if(prop.gutterLeftAutosize){for(var i=0,len=prop.yaxisLabels.length,maxLength=0;i0&&this.scale.max>0)?this.scale.min:0)-(this.data[i]<0?width:0),y=prop.gutterTop+prop.vmarginTop+prop.vmargin+(outerSegment*i);if(this.scale.min<0&&this.scale.max<0){x=this.width-prop.gutterRight-width;} var rect=RG.SVG.create({svg:this.svg,parent:this.svg.all,type:'rect',attr:{stroke:prop.strokestyle,fill:prop.colorsSequential?(prop.colors[sequentialIndex]?prop.colors[sequentialIndex]:prop.colors[prop.colors.length-1]):prop.colors[0],x:x,y:y,width:width,height:height,'stroke-width':prop.linewidth,'data-tooltip':(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips.length)?prop.tooltips[i]:'','data-index':i,'data-original-width':width,'data-original-height':height,'data-sequential-index':sequentialIndex,'data-value':this.data[i],filter:prop.shadow?'url(#dropShadow)':''}});this.coords.push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(!this.coords2[0]){this.coords2[0]=[];} this.coords2[0].push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips[sequentialIndex]){var obj=this;(function(idx,seq) {rect.addEventListener(prop.tooltipsEvent.replace(/^on/,''),function(e) {obj.removeHighlight();RG.SVG.tooltip({object:obj,index:idx,group:null,sequentialIndex:seq,text:prop.tooltips[seq],event:e});obj.highlight(e.target);},false);rect.addEventListener('mousemove',function(e) {e.target.style.cursor='pointer';},false);})(i,sequentialIndex);}}else if(RG.SVG.isArray(this.data[i])&&prop.grouping==='grouped'){var outerSegment=((this.graphHeight-prop.vmarginTop-prop.vmarginBottom)/this.data.length),innerSegment=outerSegment-(2*prop.vmargin);for(var j=0;j0&&this.scale.max>this.scale.min){var x1=this.getXCoord(this.data[i][j]);var x2=this.getXCoord(this.scale.min);x=this.getXCoord(this.scale.min);width=x1-x2;} var rect=RG.SVG.create({svg:this.svg,type:'rect',parent:this.svg.all,attr:{stroke:prop['strokestyle'],fill:(prop.colorsSequential&&prop.colors[sequentialIndex])?prop.colors[sequentialIndex]:(prop.colors[j]?prop.colors[j]:prop.colors[prop.colors.length-1]),x:x,y:y,width:width,height:height,'stroke-width':prop.linewidth,'data-index':i,'data-original-width':width,'data-sequential-index':sequentialIndex,'data-tooltip':(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips.length)?prop.tooltips[sequentialIndex]:'','data-value':this.data[i][j],filter:prop.shadow?'url(#dropShadow)':''}});this.coords.push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(!this.coords2[i]){this.coords2[i]=[];} this.coords2[i].push({object:this,element:rect,x:parseFloat(rect.getAttribute('x')),y:parseFloat(rect.getAttribute('y')),width:parseFloat(rect.getAttribute('width')),height:parseFloat(rect.getAttribute('height'))});if(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips[sequentialIndex]){var obj=this;(function(idx,seq) {var indexes=RG.SVG.sequentialIndexToGrouped(seq,obj.data);rect.addEventListener(prop.tooltipsEvent.replace(/^on/,''),function(e) {obj.removeHighlight();RG.SVG.tooltip({object:obj,group:idx,index:indexes[1],sequentialIndex:seq,text:prop.tooltips[seq],event:e});obj.highlight(e.target);},false);rect.addEventListener('mousemove',function(e) {e.target.style.cursor='pointer'},false);})(i,sequentialIndex);}} --sequentialIndex;}else if(RG.SVG.isArray(this.data[i])&&prop.grouping==='stacked'){var section=((this.graphHeight-prop.vmarginTop-prop.vmarginBottom)/this.data.length);var x=this.getXCoord(0);for(var j=0;jthis.scale.max){return null;} var x;if(value0&&this.scale.max>this.scale.min){var x1=this.getXCoord(this.scale.min);var x2=this.getXCoord(value);}else{var x1=this.getXCoord(0);var x2=this.getXCoord(value);} return ma.abs(x1-x2);};this.highlight=function(rect) {var x=rect.getAttribute('x'),y=rect.getAttribute('y'),width=rect.getAttribute('width'),height=rect.getAttribute('height');var highlight=RG.SVG.create({svg:this.svg,type:'rect',parent:this.svg.all,attr:{stroke:prop.highlightStroke,fill:prop.highlightFill,x:x,y:y,width:width,height:height,'stroke-width':prop.highlightLinewidth},style:{pointerEvents:'none'}});RG.SVG.REG.set('highlight',highlight);};this.parseColors=function() {if(!Object.keys(this.originalColors).length){this.originalColors={colors:RG.SVG.arrayClone(prop.colors),backgroundGridColor:RG.SVG.arrayClone(prop.backgroundGridColor),highlightFill:RG.SVG.arrayClone(prop.highlightFill),backgroundColor:RG.SVG.arrayClone(prop.backgroundColor)}} var colors=prop.colors;if(colors){for(var i=0;i=0)?(parseFloat(this.coords[i].element.getAttribute('x'))+parseFloat(this.coords[i].element.getAttribute('width'))+7+prop.labelsAboveOffsetx):parseFloat(this.coords[i].element.getAttribute('x')-7-prop.labelsAboveOffsetx),y=parseFloat(this.coords[i].element.getAttribute('y'))+parseFloat(this.coords[i].element.getAttribute('height')/2)+prop.labelsAboveOffsety,width=dimensions[0],height=dimensions[1],halign=(value>=0)?'left':'right';if(x+width>this.width&&value>0){halign='right';x=this.width-5;prop.labelsAboveBackground=prop.labelsAboveBackground||'rgba(255,255,255,0.95)';} var text=RG.SVG.text({object:this,parent:this.svg.all,tag:'labels.above',text:str,x:x,y:y,halign:halign,valign:valign,font:font,size:size,bold:bold,italic:italic,color:prop.labelsAboveColor||prop.textColor,background:prop.labelsAboveBackground||null,padding:prop.labelsAboveBackgroundPadding||0});}}};this.on=function(type,func) {if(type.substr(0,2)!=='on'){type='on'+type;} RG.SVG.addCustomEventListener(this,type,func);return this;};this.exec=function(func) {func(this);return this;};this.removeHighlight=function() {var highlight=RG.SVG.REG.get('highlight');if(highlight&&highlight.parentNode){highlight.parentNode.removeChild(highlight);} RG.SVG.REG.set('highlight',null);};this.grow=function() {var opt=arguments[0]||{},frames=opt.frames||30,frame=0,obj=this,data=[],height=null,seq=0;data=RG.SVG.arrayClone(this.data);this.draw();var iterate=function() {for(var i=0,seq=0,len=obj.coords.length;i0?obj.getXCoord(0):obj.getXCoord(0)-width);}else if(typeof data[i]==='object'){var accumulativeWidth=0;for(var j=0,len2=data[i].length;j0?(obj.getXCoord(0)+accumulativeWidth):(obj.getXCoord(0)-width-accumulativeWidth));accumulativeWidth+=(prop.grouping==='stacked'?width:0);} if(obj.stackedBackfaces[i]){obj.stackedBackfaces[i].setAttribute('width',accumulativeWidth);obj.stackedBackfaces[i].setAttribute('x',prop.gutterLeft);} --seq;}} if(frame++opt.startFrames[i]){var originalWidth=obj.coords[i].element.getAttribute('data-original-width'),value=parseFloat(obj.coords[i].element.getAttribute('data-value'));obj.coords[i].element.setAttribute('width',width=ma.min(((frame-opt.startFrames[i])/framesperbar)*originalWidth,originalWidth));obj.coords[i].element.setAttribute('x',value>=0?obj.getXCoord(0):obj.getXCoord(0)-width);if(prop.grouping==='stacked'){var seq=obj.coords[i].element.getAttribute('data-sequential-index');var indexes=RG.SVG.sequentialIndexToGrouped(seq,obj.data);if(indexes[1]>0){obj.coords[i].element.setAttribute('x',parseInt(obj.coords[i-1].element.getAttribute('x'))+parseInt(obj.coords[i-1].element.getAttribute('width')));}}}} if(frame>=opt.frames){callback(obj);}else{RG.SVG.FX.update(iterator);}} iterator();return this;};for(i in conf.options){if(typeof i==='string'){this.set(i,conf.options[i]);}}};return this;})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.line.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.SVG=RGraph.SVG||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math,win=window,doc=document;RG.SVG.Line=function(conf) {this.set=function(name,value) {if(arguments.length===1&&typeof name==='object'){for(i in arguments[0]){if(typeof i==='string'){var ret=RG.SVG.commonSetter({object:this,name:i,value:arguments[0][i]});name=ret.name;value=ret.value;this.set(name,value);}}}else{var ret=RG.SVG.commonSetter({object:this,name:name,value:value});name=ret.name;value=ret.value;this.properties[name]=value;if(name==='colors'){this.originalColors=RG.SVG.arrayClone(value);this.colorsParsed=false;}} return this;};this.id=conf.id;this.uid=RG.SVG.createUID();this.container=document.getElementById(this.id);this.layers={};this.svg=RG.SVG.createSVG({object:this,container:this.container});this.isRGraph=true;this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));if(RG.SVG.isArray(conf.data)&&RG.SVG.isArray(conf.data[0])){this.data=RG.SVG.arrayClone(conf.data);}else if(RG.SVG.isArray(conf.data)){this.data=[RG.SVG.arrayClone(conf.data)];}else{this.data=[[]];} this.type='line';this.coords=[];this.coords2=[];this.coordsSpline=[];this.hasMultipleDatasets=typeof this.data[0]==='object'&&typeof this.data[1]==='object'?true:false;this.colorsParsed=false;this.originalColors={};this.gradientCounter=1;this.originalData=RG.SVG.arrayClone(this.data);this.filledGroups=[];RG.SVG.OR.add(this);this.container.style.display='inline-block';this.properties={gutterLeft:35,gutterRight:35,gutterTop:35,gutterBottom:35,backgroundColor:null,backgroundImage:null,backgroundImageStretch:true,backgroundImageAspect:'none',backgroundImageOpacity:null,backgroundImageX:null,backgroundImageY:null,backgroundImageW:null,backgroundImageH:null,backgroundGrid:true,backgroundGridColor:'#ddd',backgroundGridLinewidth:1,backgroundGridHlines:true,backgroundGridHlinesCount:null,backgroundGridVlines:true,backgroundGridVlinesCount:null,backgroundGridBorder:true,backgroundGridDashed:false,backgroundGridDotted:false,backgroundGridDashArray:null,colors:['red','#0f0','blue','#ff0','#0ff','green'],filled:false,filledColors:[],filledClick:null,filledOpacity:1,filledAccumulative:false,hmargin:0,yaxis:true,yaxisTickmarks:true,yaxisTickmarksLength:3,yaxisColor:'black',yaxisScale:true,yaxisLabels:null,yaxisLabelsOffsetx:0,yaxisLabelsOffsety:0,yaxisLabelsCount:5,yaxisUnitsPre:'',yaxisUnitsPost:'',yaxisStrict:false,yaxisDecimals:0,yaxisPoint:'.',yaxisThousand:',',yaxisRound:false,yaxisMax:null,yaxisMin:0,yaxisFormatter:null,xaxis:true,xaxisTickmarks:true,xaxisTickmarksLength:5,xaxisLabels:null,xaxisLabelsOffsetx:0,xaxisLabelsOffsety:0,xaxisLabelsPosition:'edge',xaxisLabelsPositionEdgeTickmarksCount:null,xaxisColor:'black',textColor:'black',textFont:'sans-serif',textSize:12,textBold:false,textItalic:false,linewidth:1,tooltips:null,tooltipsOverride:null,tooltipsEffect:'fade',tooltipsCssClass:'RGraph_tooltip',tooltipsEvent:'mousemove',highlightStroke:'rgba(0,0,0,0)',highlightFill:'rgba(255,255,255,0.7)',highlightLinewidth:1,tickmarksStyle:'none',tickmarksSize:5,tickmarksFill:'white',tickmarksLinewidth:1,labelsAbove:false,labelsAboveFont:null,labelsAboveSize:null,labelsAboveBold:null,labelsAboveItalic:null,labelsAboveColor:null,labelsAboveBackground:'rgba(255,255,255,0.7)',labelsAboveBackgroundPadding:2,labelsAboveUnitsPre:null,labelsAboveUnitsPost:null,labelsAbovePoint:null,labelsAboveThousand:null,labelsAboveFormatter:null,labelsAboveDecimals:null,labelsAboveOffsetx:0,labelsAboveOffsety:-10,labelsAboveHalign:'center',labelsAboveValign:'bottom',labelsAboveSpecific:null,shadow:false,shadowOffsetx:2,shadowOffsety:2,shadowBlur:2,shadowOpacity:0.25,spline:false,stepped:false,title:'',titleSize:null,titleX:null,titleY:null,titleHalign:'center',titleValign:null,titleColor:null,titleFont:null,titleBold:false,titleItalic:false,titleSubtitle:null,titleSubtitleSize:10,titleSubtitleX:null,titleSubtitleY:null,titleSubtitleHalign:'center',titleSubtitleValign:null,titleSubtitleColor:'#aaa',titleSubtitleFont:null,titleSubtitleBold:false,titleSubtitleItalic:false,errorbars:null,errorbarsColor:'black',errorbarsLinewidth:1,errorbarsCapwidth:10,key:null,keyColors:null,keyOffsetx:0,keyOffsety:0,keyTextOffsetx:0,keyTextOffsety:-1,keyTextSize:null,keyTextBold:null,keyTextItalic:null};RG.SVG.getGlobals(this);if(RG.SVG.FX&&typeof RG.SVG.FX.decorate==='function'){RG.SVG.FX.decorate(this);} var prop=this.properties;this.draw=function() {RG.SVG.fireCustomEvent(this,'onbeforedraw');this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));RG.SVG.createDefs(this);this.graphWidth=this.width-prop.gutterLeft-prop.gutterRight;this.graphHeight=this.height-prop.gutterTop-prop.gutterBottom;RG.SVG.resetColorsToOriginalValues({object:this});this.parseColors();this.coords=[];this.coords2=[];this.coordsSpline=[];this.data=RG.SVG.arrayClone(this.originalData);this.tooltipsSequentialIndex=0;this.data_seq=RG.SVG.arrayLinearize(this.data);if(prop.errorbars){for(var i=0;i0&&prop.filledAccumulative?(prop.spline?this.coordsSpline[index-1][this.coordsSpline[index-1].length-1][1]:this.coords2[index-1][this.coords2[index-1].length-1][1]):this.getYCoord(prop.yaxisMin>0?prop.yaxisMin:0)+(prop.xaxis?0:1)));if(index>0&&prop.filledAccumulative){var path2=RG.SVG.arrayClone(path);if(index>0&&prop.filledAccumulative){if(prop.spline){for(var i=this.coordsSpline[index-1].length-1;i>=0;--i){fillPath.push('L{1} {2}'.format(this.coordsSpline[index-1][i][0],this.coordsSpline[index-1][i][1]));}}else{for(var i=this.coords2[index-1].length-1;i>=0;--i){fillPath.push('L{1} {2}'.format(this.coords2[index-1][i][0],this.coords2[index-1][i][1]));if(prop.stepped&&i>0){fillPath.push('L{1} {2}'.format(this.coords2[index-1][i][0],this.coords2[index-1][i-1][1]));}}}}}else{fillPath.push('L{1} {2}'.format(this.coords2[index][0][0]+(prop.yaxis?1:0),this.getYCoord(prop.yaxisMin>0?prop.yaxisMin:0)+(prop.xaxis?0:1)));} fillPath.push('L{1} {2}'.format(this.coords2[index][0][0]+(prop.yaxis?1:0),this.coords2[index][0][1]));for(var i=0;i0){for(var i=this.coords2[index-1].length-1;i>=0;--i){path2.push('L{1} {2}'.format(this.coords2[index-1][i][0],this.coords2[index-1][i][1]));}} path2=path2.join(' ');var line=RG.SVG.create({svg:this.svg,parent:prop.filled?this.filledGroups[index]:this.svg.all,type:'path',attr:{d:path2,stroke:prop.colors[index],'fill':'none','stroke-width':this.hasMultipleDatasets&&prop.filled&&prop.filledAccumulative?0.1:(RG.SVG.isArray(prop.linewidth)?prop.linewidth[index]:prop.linewidth+0.01),'stroke-linecap':'round','stroke-linejoin':'round',filter:prop.shadow?'url(#dropShadow)':'','clip-path':this.isTrace?'url(#trace-effect-clip)':''}});} if(prop.tooltips&&prop.tooltips.length){if(!this.svg.all.line_tooltip_hotspots){var group=RG.SVG.create({svg:this.svg,type:'g',attr:{'fill':'transparent',className:"rgraph_hotspots"},style:{cursor:'pointer'}});this.svg.all.line_tooltip_hotspots=group;}else{group=this.svg.all.line_tooltip_hotspots;} for(var i=0;ithis.scale.max){return null;} if(value0){var errorbarLine=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x,y1:y,x2:x,y2:y1,stroke:color,'stroke-width':linewidth}});var errorbarCap=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x-halfCapWidth,y1:y1,x2:x+halfCapWidth,y2:y1,stroke:color,'stroke-width':linewidth}});} if(typeof min==='number'){var errorbarLine=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x,y1:y,x2:x,y2:y3,stroke:color,'stroke-width':linewidth}});var errorbarCap=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x-halfCapWidth,y1:y3,x2:x+halfCapWidth,y2:y3,stroke:color,'stroke-width':linewidth}});}};this.trace=function() {var opt=arguments[0]||{},frame=1,frames=opt.frames||60,obj=this;this.isTrace=true;this.draw();var clippath=RG.SVG.create({svg:this.svg,parent:this.svg.defs,type:'clipPath',attr:{id:'trace-effect-clip'}});var clippathrect=RG.SVG.create({svg:this.svg,parent:clippath,type:'rect',attr:{x:0,y:0,width:0,height:this.height}});var iterator=function() {var width=(frame++)/frames*obj.width;clippathrect.setAttribute("width",width);if(frame<=frames){RG.SVG.FX.update(iterator);}else{clippath.parentNode.removeChild(clippath);if(opt.callback){(opt.callback)(obj);}}};iterator();return this;};for(i in conf.options){if(typeof i==='string'){this.set(i,conf.options[i]);}}} return this;})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.pie.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.SVG=RGraph.SVG||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math,win=window,doc=document;RG.SVG.Pie=function(conf) {this.set=function(name,value) {if(arguments.length===1&&typeof name==='object'){for(i in arguments[0]){if(typeof i==='string'){var ret=RG.SVG.commonSetter({object:this,name:i,value:arguments[0][i]});name=ret.name;value=ret.value;this.set(name,value);}}}else{var ret=RG.SVG.commonSetter({object:this,name:name,value:value});name=ret.name;value=ret.value;this.properties[name]=value;if(name==='colors'){this.originalColors=RG.SVG.arrayClone(value);this.colorsParsed=false;}} return this;};this.id=conf.id;this.uid=RG.SVG.createUID();this.container=document.getElementById(this.id);this.layers={};this.svg=RG.SVG.createSVG({object:this,container:this.container});this.isRGraph=true;this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));this.data=conf.data;this.type='pie';this.angles=[];this.colorsParsed=false;this.originalColors={};this.gradientCounter=1;this.nodes=[];this.shadowNodes=[];RG.SVG.OR.add(this);this.container.style.display='inline-block';this.properties={centerx:null,centery:null,radius:null,gutterLeft:35,gutterRight:35,gutterTop:35,gutterBottom:35,colors:['#f66','#6f6','#66f','#ff6','#6ff','#ccc','pink','orange','cyan','maroon','olive','teal'],strokestyle:'rgba(0,0,0,0)',margin:3,textColor:'black',textFont:'sans-serif',textSize:12,textBold:false,textItalic:false,labels:[],labelsSticks:true,labelsSticksHlength:50,linewidth:1,tooltips:null,tooltipsOverride:null,tooltipsEffect:'fade',tooltipsCssClass:'RGraph_tooltip',tooltipsEvent:'click',highlightStroke:'rgba(0,0,0,0)',highlightFill:'rgba(255,255,255,0.7)',highlightLinewidth:1,highlightStyle:'normal',highlightStyleOutlineWidth:7,title:'',titleSize:16,titleX:null,titleY:null,titleHalign:'center',titleValign:null,titleColor:'black',titleFont:null,titleBold:false,titleItalic:false,titleSubtitle:null,titleSubtitleSize:10,titleSubtitleX:null,titleSubtitleY:null,titleSubtitleHalign:'center',titleSubtitleValign:null,titleSubtitleColor:'#aaa',titleSubtitleFont:null,titleSubtitleBold:false,titleSubtitleItalic:false,shadow:false,shadowOffsetx:2,shadowOffsety:2,shadowBlur:2,shadowOpacity:0.25,exploded:0,roundRobinMultiplier:1,donut:false,donutWidth:75,key:null,keyColors:null,keyOffsetx:0,keyOffsety:0,keyTextOffsetx:0,keyTextOffsety:-1,keyTextSize:null,keyTextBold:null,keyTextItalic:null};RG.SVG.getGlobals(this);if(RG.SVG.FX&&typeof RG.SVG.FX.decorate==='function'){RG.SVG.FX.decorate(this);} var prop=this.properties;this.draw=function() {RG.SVG.fireCustomEvent(this,'onbeforedraw');this.angles=[];this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));RG.SVG.createDefs(this);this.graphWidth=this.width-prop.gutterLeft-prop.gutterRight;this.graphHeight=this.height-prop.gutterTop-prop.gutterBottom;this.centerx=(this.graphWidth/2)+prop.gutterLeft;this.centery=(this.graphHeight/2)+prop.gutterTop;this.radius=ma.min(this.graphWidth,this.graphHeight)/2;this.centerx=typeof prop.centerx==='number'?prop.centerx:this.centerx;this.centery=typeof prop.centery==='number'?prop.centery:this.centery;this.radius=typeof prop.radius==='number'?prop.radius:this.radius;if(typeof prop.radius==='string'&&prop.radius.match(/^\+|-\d+$/))this.radius+=parseFloat(prop.radius);if(typeof prop.centerx==='string'&&prop.centerx.match(/^\+|-\d+$/))this.centerx+=parseFloat(prop.centerx);if(typeof prop.centery==='string'&&prop.centery.match(/^\+|-\d+$/))this.centery+=parseFloat(prop.centery);RG.SVG.resetColorsToOriginalValues({object:this});this.parseColors();this.max=RG.SVG.arrayMax(this.data);this.total=RG.SVG.arraySum(this.data);if(typeof prop.exploded==='number'&&prop.exploded>0){var val=prop.exploded;prop.exploded=[];for(var i=0;i0&&angles[i].halfwayRG.SVG.TRIG.HALFPI&&angles[i].halfwayRG.SVG.TRIG.PI&&angles[i].halfway<(RG.SVG.TRIG.HALFPI+RG.SVG.TRIG.PI)){halign='right';valign='top';}else if(angles[i].halfway>(RG.SVG.TRIG.HALFPI+RG.SVG.TRIG.PI)&&angles[i].halfwayRG.SVG.TRIG.HALFPI){var index=labels_left.length;labels_left[index]=[];labels_left[index].text=prop.labels[i];labels_left[index].halign='right';labels=labels_left;labels_coords[i].halign='right';}else{var index=labels_right.length;labels_right[index]=[];labels_right[index].text=prop.labels[i];labels_right[index].halign='right';labels=labels_right;labels_coords[i].halign='left';} endpoint_inner[0]+=(explosion[1]||0);endpoint_inner[1]+=(explosion[2]||0);endpoint_outer[0]+=(explosion[1]||0);endpoint_outer[1]+=(explosion[2]||0);var x,y;if(labels[index].text){var stick=RG.SVG.create({svg:this.svg,parent:this.svg.all,type:'path',attr:{d:'M {1} {2} L {3} {4}'.format(this.centerx+endpoint_inner[0],this.centery+endpoint_inner[1],this.centerx+endpoint_outer[0],this.centery+endpoint_outer[1]),stroke:'#999',fill:'rgba(0,0,0,0)'}});} if(stick){labels[index].stick=stick;} x=(this.centerx+endpoint_outer[0]+(angle>1.57?-50:50));y=(this.centery+endpoint_outer[1]);labels_coords[i].x=x;labels_coords[i].y=y;labels_coords[i].text=prop.labels[i];} var vspace_right=(this.height-prop.gutterTop-prop.gutterBottom)/labels_right.length;var vspace_left=(this.height-prop.gutterTop-prop.gutterBottom)/labels_left.length;x=y=0;for(var i=0;i1){var len=this.data[0].length;for(var i=1;i0){for(var i=0,len=radials;i0){if(prop.backgroundGridPoly){for(var j=1;j<=concentrics;j++){for(var i=0,len=radials,path=[];i0&&prop.filled&&prop.filledAccumulative){path.push('L {1} {2}'.format(this.coords2[dataset][0][0],this.coords2[dataset][0][1]));path.push('M {1} {2}'.format(this.coords2[dataset-1][0][0],this.coords2[dataset-1][0][1]));for(var i=this.coords2[dataset-1].length-1;i>=0;--i){path.push('L {1} {2}'.format(this.coords2[dataset-1][i][0],this.coords2[dataset-1][i][1]));} this.redraw=true;}else{path.push('z');} var path=RG.SVG.create({svg:this.svg,type:'path',parent:this.svg.all,attr:{d:path.join(" "),stroke:prop.colors[dataset],fill:prop.filled?prop.colors[dataset]:'transparent','fill-opacity':prop.filledOpacity,'stroke-width':prop.linewidth,'clip-path':this.isTrace?'url(#trace-effect-clip)':'',filter:prop.shadow?'url(#dropShadow)':'',}});path.setAttribute('data-dataset',dataset);} this.redrawRadar();};this.redrawRadar=function() {if(this.redraw){this.redraw=false;for(var dataset=0;dataset0.75){valign='bottom';}else{valign='top';} if((i/len)===0){halign='center';} if((i/len)===0.25){valign='center';} if((i/len)===0.5){halign='center';} if((i/len)===0.75){valign='center';} RG.SVG.text({object:this,svg:this.svg,parent:this.svg.all,tag:'labels',text:labels[i],size:typeof prop.labelsSize==='number'?prop.labelsSize:prop.textSize,x:x,y:y,halign:halign,valign:'center',color:prop.labelsColor||prop.textColor,bold:typeof prop.labelsBold==='boolean'?prop.labelsBold:prop.textBold,italic:typeof prop.labelsItalic==='boolean'?prop.labelsItalic:prop.textItalic,font:prop.labelsFont||prop.textFont});} if(prop.scaleVisible){for(var i=0;i0){if(prop.tooltipsEvent!=='mousemove'){prop.tooltipsEvent='click';} var group=RG.SVG.create({svg:this.svg,type:'g',parent:this.svg.all,attr:{className:'rgraph-radar-tooltip-hotspots'}});for(var dataset=0,seq=0;dataset0){if(prop.variant==='non-equi-angular'){var radials=this.data.length;for(var i=0,total=0;i0){for(var j=1;j<=concentrics;j++){RG.SVG.create({svg:this.svg,type:'circle',parent:grid,attr:{cx:this.centerx,cy:this.centery,r:this.radius*(j/concentrics),fill:'transparent',stroke:prop.backgroundGridColor,'stroke-width':prop.backgroundGridLinewidth}});}}}};this.drawRose=function() {var opt=arguments[0]||{};for(var i=0;ithis.centerx){halign='left';}else if(ma.round(endpoint[0])===this.centerx){halign='center';}else{halign='right';} RG.SVG.text({object:this,svg:this.svg,parent:group,tag:'labels',text:typeof prop.labels[i]==='string'?prop.labels[i]:'',size:prop.labelsSize,x:endpoint[0],y:endpoint[1],halign:halign,valign:'center',background:'rgba(255,255,255,0.7)',padding:2,color:prop.labelsColor||prop.textColor,bold:typeof prop.labelsBold==='boolean'?prop.labelsBold:prop.textBold,italic:typeof prop.labelsItalic==='boolean'?prop.labelsItalic:prop.textItalic,font:prop.labelsFont||prop.textFont});}};this.highlight=function(path) {var path=path.getAttribute('d');var highlight=RG.SVG.create({svg:this.svg,parent:this.svg.all,type:'path',attr:{d:path,fill:prop.highlightFill,stroke:prop.highlightStroke,'stroke-width':prop.highlightLinewidth},style:{pointerEvents:'none'}});if(prop.tooltipsEvent==='mousemove'){highlight.addEventListener('mouseout',function(e) {highlight.parentNode.removeChild(highlight);RG.SVG.hideTooltip();RG.SVG.REG.set('highlight',null);},false);} RG.SVG.REG.set('highlight',highlight);};this.parseColors=function() {if(!Object.keys(this.originalColors).length){this.originalColors={colors:RG.SVG.arrayClone(prop.colors),highlightFill:RG.SVG.arrayClone(prop.highlightFill)}} var colors=prop.colors;if(colors){for(var i=0;i=frames){callback(obj);}else{RG.SVG.FX.update(iterator);}} iterator();return this;};this.roundrobin=function(opt) {var obj=this,opt=arguments[0]||{},frame=-1,frames=opt.frames||60,callback=opt.callback||function(){};prop.effectRoundrobinMultiplier=0.01;this.draw();function iterator() {++frame;var multiplier=RG.SVG.FX.getEasingMultiplier(frames,frame);prop.effectRoundrobinMultiplier=multiplier;obj.drawRose();if(frame>=frames){callback(obj);}else{RG.SVG.FX.update(iterator);}} iterator();return this;};for(i in conf.options){if(typeof i==='string'){this.set(i,conf.options[i]);}}};return this;})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.svg.scatter.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.SVG=RGraph.SVG||{};(function(win,doc,undefined) {var RG=RGraph,ua=navigator.userAgent,ma=Math,win=window,doc=document;RG.SVG.Scatter=function(conf) {this.set=function(name,value) {if(arguments.length===1&&typeof name==='object'){for(i in arguments[0]){if(typeof i==='string'){var ret=RG.SVG.commonSetter({object:this,name:i,value:arguments[0][i]});name=ret.name;value=ret.value;this.set(name,value);}}}else{var ret=RG.SVG.commonSetter({object:this,name:name,value:value});name=ret.name;value=ret.value;this.properties[name]=value;if(name==='colors'){this.originalColors=RG.SVG.arrayClone(value);this.colorsParsed=false;}} return this;};this.id=conf.id;this.uid=RG.SVG.createUID();this.container=document.getElementById(this.id);this.layers={};this.svg=RG.SVG.createSVG({object:this,container:this.container});this.isRGraph=true;this.width=Number(this.svg.getAttribute('width'));this.height=Number(this.svg.getAttribute('height'));this.data=conf.data;this.type='scatter';this.coords=[];this.coords2=[];this.colorsParsed=false;this.originalColors={};this.gradientCounter=1;this.sequential=0;RG.SVG.OR.add(this);this.container.style.display='inline-block';this.properties={gutterLeft:35,gutterRight:35,gutterTop:35,gutterBottom:35,backgroundColor:null,backgroundImage:null,backgroundImageAspect:'none',backgroundImageStretch:true,backgroundImageOpacity:null,backgroundImageX:null,backgroundImageY:null,backgroundImageW:null,backgroundImageH:null,backgroundGrid:true,backgroundGridColor:'#ddd',backgroundGridLinewidth:1,backgroundGridHlines:true,backgroundGridHlinesCount:null,backgroundGridVlines:true,backgroundGridVlinesCount:null,backgroundGridBorder:true,backgroundGridDashed:false,backgroundGridDotted:false,backgroundGridDashArray:null,xmax:0,tickmarksStyle:'cross',tickmarksSize:7,colors:['black'],line:false,lineColors:1,lineLinewidth:1,errorbarsColor:'black',errorbarsLinewidth:1,errorbarsCapwidth:10,yaxis:true,yaxisTickmarks:true,yaxisTickmarksLength:3,yaxisColor:'black',yaxisScale:true,yaxisLabels:null,yaxisLabelsOffsetx:0,yaxisLabelsOffsety:0,yaxisLabelsCount:5,yaxisUnitsPre:'',yaxisUnitsPost:'',yaxisStrict:false,yaxisDecimals:0,yaxisPoint:'.',yaxisThousand:',',yaxisRound:false,yaxisMax:null,yaxisMin:0,yaxisFormatter:null,xaxis:true,xaxisTickmarks:true,xaxisTickmarksLength:5,xaxisLabels:null,xaxisLabelsPosition:'section',xaxisLabelsPositionEdgeTickmarksCount:10,xaxisColor:'black',xaxisLabelsOffsetx:0,xaxisLabelsOffsety:0,xaxisMin:0,xaxisMax:null,xaxisLabelsCount:10,xaxisUnitsPre:'',xaxisUnitsPost:'',xaxisMax:null,xaxisMin:0,xaxisPoint:'.',xaxisRound:false,xaxisThousand:',',xaxisDecimals:0,xaxisFormatter:null,textColor:'black',textFont:'sans-serif',textSize:12,textBold:false,textItalic:false,labelsAboveFont:null,labelsAboveSize:null,labelsAboveBold:null,labelsAboveItalic:null,labelsAboveColor:null,labelsAboveBackground:'rgba(255,255,255,0.7)',labelsAboveBackgroundPadding:2,labelsAboveXUnitsPre:null,labelsAboveXUnitsPost:null,labelsAboveXPoint:null,labelsAboveXThousand:null,labelsAboveXFormatter:null,labelsAboveXDecimals:null,labelsAboveXDecimalsTrim:null,labelsAboveYUnitsPre:null,labelsAboveYUnitsPost:null,labelsAboveYPoint:null,labelsAboveYThousand:null,labelsAboveYFormatter:null,labelsAboveYDecimals:null,labelsAboveOffsetx:0,labelsAboveOffsety:-10,labelsAboveHalign:'center',labelsAboveValign:'bottom',labelsAboveSeperator:',',tooltipsOverride:null,tooltipsEffect:'fade',tooltipsCssClass:'RGraph_tooltip',tooltipsEvent:'mousemove',highlightStroke:'rgba(0,0,0,0)',highlightFill:'rgba(255,255,255,0.7)',highlightLinewidth:1,title:'',titleSize:16,titleX:null,titleY:null,titleHalign:'center',titleValign:null,titleColor:'black',titleFont:null,titleBold:false,titleItalic:false,titleSubtitle:null,titleSubtitleSize:10,titleSubtitleX:null,titleSubtitleY:null,titleSubtitleHalign:'center',titleSubtitleValign:null,titleSubtitleColor:'#aaa',titleSubtitleFont:null,titleSubtitleBold:false,titleSubtitleItalic:false,key:null,keyColors:null,keyOffsetx:0,keyOffsety:0,keyTextOffsetx:0,keyTextOffsety:-1,keyTextSize:null,keyTextBold:null,keyTextItalic:null,bubble:false,bubbleMaxValue:null,bubbleMaxRadius:null,bubbleColorsSolid:false,errorbars:null,errorbarsColor:'black',errorbarsLinewidth:1,errorbarsCapwidth:10,};RG.SVG.getGlobals(this);for(i in conf.options){if(typeof i==='string'){this.set(i,conf.options[i]);}} if(this.data[0]&&!RG.SVG.isArray(this.data[0])){this.data=[];this.data[0]=conf.data;} if(RG.SVG.FX&&typeof RG.SVG.FX.decorate==='function'){RG.SVG.FX.decorate(this);} var prop=this.properties;if(typeof prop.xaxisMin==='string'){prop.xaxisMin=RG.SVG.parseDate(prop.xaxisMin);} if(typeof prop.xaxisMax==='string'){prop.xaxisMax=RG.SVG.parseDate(prop.xaxisMax);} for(var i=0;iprop.xaxisMax){return null;} if(valuethis.scale.max){return null;} var y,xaxispos=prop.xaxispos;if(value0){y=this.getYCoord(prevTotal)-height;}else{y=this.getYCoord(prevTotal);}}else{if(i==0&&this.data[i]>0){y=y-height;}else if(this.data[i]>0&&this.data[i-1]>0){y=y-height;}else if(this.data[i]>0&&this.data[i-1]<0){y=y+prevHeight-height;}else if(this.data[i]<0&&this.data[i-1]>0){}else if(this.data[i]<0&&this.data[i-1]<0){y=y+prevHeight;}} var fill=this.data[i]>0?prop.colors[0]:prop.colors[1];if(prop.colorsSequential){fill=prop.colors[i];} if(prop.total){if(i===(this.data.length-1)&&this.data[this.data.length-1]>=0){y=this.getYCoord(0)-height;if(!prop.colorsSequential){fill=prop.colors[2];}}else if(i===(this.data.length-1)&&this.data[this.data.length-1]<0){y=this.getYCoord(0);if(!prop.colorsSequential){fill=prop.colors[2];}}} var x=prop.gutterLeft+(outerWidth*i)+prop.hmargin;if(this.data[i]===null||typeof this.data[i]==='undefined'){var axisY=this.getYCoord(0);if(prevValue<0){y=prevY+prevHeight;}else{y=prevY;} height=this.getYCoord(0)-this.getYCoord(total);if(!prop.colorsSequential){fill=prop.colors[3]||prop.colors[2];} if(height<0){y+=height;height*=-1;}} var rect=RG.SVG.create({svg:this.svg,type:'rect',parent:this.svg.all,attr:{x:x,y:y,width:innerWidth,height:height,stroke:prop.strokestyle,fill:fill,'stroke-width':prop.linewidth,'shape-rendering':'crispEdges','data-index':i,'data-original-x':x,'data-original-y':y,'data-original-width':innerWidth,'data-original-height':height,'data-original-stroke':prop.strokestyle,'data-original-fill':fill,'data-value':String(this.data[i])}});this.coords.push({object:this,element:rect,x:x,y:y,width:innerWidth,height:height});if(!RG.SVG.isNull(prop.tooltips)&&prop.tooltips[i]){var obj=this;(function(idx) {rect.addEventListener(prop.tooltipsEvent.replace(/^on/,''),function(e) {obj.removeHighlight();RG.SVG.tooltip({object:obj,index:idx,text:prop.tooltips[idx],event:e});obj.highlight(e.target);},false);rect.addEventListener('mousemove',function(e) {e.target.style.cursor='pointer'},false);})(i);} var prevX=x,prevY=y,prevWidth=innerWidth,prevHeight=height,prevValue=this.data[i];} for(var i=0;i0?0:parseInt(this.coords[i].element.getAttribute('height'))),x2=x1+(2*prop.hmargin),y2=parseInt(this.coords[i].element.getAttribute('y'))+(this.data[i]>0?0:parseInt(this.coords[i].element.getAttribute('height')));if(this.coords[i].element.getAttribute('data-value')==='null'){y1=parseFloat(this.coords[i].element.getAttribute('y'));y2=parseFloat(y1);} var line=RG.SVG.create({svg:this.svg,type:'line',parent:this.svg.all,attr:{x1:x1,y1:y1+0.5,x2:x2,y2:y2+0.5,stroke:prop.strokestyleConnector||prop.strokestyle,'stroke-width':prop.linewidth,'data-index':i,'data-original-x1':x1,'data-original-y1':y1+0.5,'data-original-x2':x2,'data-original-y2':y2+0.5}});}}};this.getYCoord=function(value) {var prop=this.properties;if(value>this.scale.max){return null;} var y,xaxispos=prop.xaxispos;if(value=0){var y=parseFloat(this.coords[i].element.getAttribute('y'))-7+prop.labelsAboveOffsety;var valign=prop.labelsAboveValign;}else{var y=parseFloat(this.coords[i].element.getAttribute('y'))+parseFloat(this.coords[i].element.getAttribute('height'))+7-prop.labelsAboveOffsety;var valign=prop.labelsAboveValign==='top'?'bottom':'top';} if(i===(this.coords.length-1)){var font=prop.labelsAboveLastFont||prop.labelsAboveFont||prop.textFont,size=prop.labelsAboveLastSize||prop.labelsAboveSize||prop.textSize,color=prop.labelsAboveLastColor||prop.labelsAboveColor||prop.textColor,background=prop.labelsAboveLastBackground||prop.labelsAboveBackground||null,padding=(typeof prop.labelsAboveLastBackgroundPadding==='number'?prop.labelsAboveLastBackgroundPadding:prop.labelsAboveBackgroundPadding)||0;if(typeof prop.labelsAboveLastBold==='boolean'){var bold=prop.labelsAboveLastBold;}else if(typeof prop.labelsAboveBold==='boolean'){var bold=prop.labelsAboveBold;}else{var bold=prop.textBold;} if(typeof prop.labelsAboveLastItalic==='boolean'){var italic=prop.labelsAboveLastItalic;}else if(typeof prop.labelsAboveItalic==='boolean'){var italic=prop.labelsAboveItalic;}else{var italic=prop.textItalic;}}else{var font=prop.labelsAboveFont||prop.textFont,size=prop.labelsAboveSize||prop.textSize,color=prop.labelsAboveColor||prop.textColor,background=prop.labelsAboveBackground||null,padding=prop.labelsAboveBackgroundPadding||0;if(typeof prop.labelsAboveBold==='boolean'){var bold=prop.labelsAboveBold;}else{var bold=prop.textBold;} if(typeof prop.labelsAboveItalic==='boolean'){var italic=prop.labelsAboveItalic;}else{var italic=prop.textItalic;}} RG.SVG.text({object:this,parent:this.svg.all,tag:'labels.above',text:str,x:x,y:y,halign:prop.labelsAboveHalign,valign:valign,font:font,size:size,bold:bold,italic:italic,color:color,background:background,padding:padding});}}}};this.on=function(type,func) {if(type.substr(0,2)!=='on'){type='on'+type;} RG.SVG.addCustomEventListener(this,type,func);return this;};this.exec=function(func) {func(this);return this;};this.removeHighlight=function() {var highlight=RG.SVG.REG.get('highlight');if(highlight&&highlight.parentNode){highlight.parentNode.removeChild(highlight);} RG.SVG.REG.set('highlight',null);};this.grow=function() {var opt=arguments[0]||{},frames=opt.frames||30,frame=0,obj=this,data=[],height=null,seq=0;return this;};this.wave=function() {return this;};for(i in conf.options){if(typeof i==='string'){this.set(i,conf.options[i]);}}};return this;})(window,document); ================================================ FILE: docs/RGraph/libraries/RGraph.thermometer.js ================================================ RGraph=window.RGraph||{isRGraph:true};RGraph.Thermometer=function(conf) {if(typeof conf==='object'&&typeof conf.id==='string'){var parseConfObjectForOptions=true;}else{var conf={id:arguments[0],min:arguments[1],max:arguments[2],value:arguments[3]}} this.id=conf.id;this.canvas=document.getElementById(this.id);this.context=this.canvas.getContext?this.canvas.getContext('2d'):null;this.canvas.__object__=this;this.uid=RGraph.CreateUID();this.canvas.uid=this.canvas.uid?this.canvas.uid:RGraph.CreateUID();this.colorsParsed=false;this.type='thermometer';this.isRGraph=true;this.min=RGraph.stringsToNumbers(conf.min);this.max=RGraph.stringsToNumbers(conf.max);this.value=RGraph.stringsToNumbers(conf.value);this.coords=[];this.graphArea=[];this.currentValue=null;this.coordsText=[];this.original_colors=[];this.firstDraw=true;this.properties={'chart.linewidth':1,'chart.background.color':'white','chart.strokestyle':'black','chart.colors':['Gradient(#c00:red:#f66:#fcc)'],'chart.gutter.left':25,'chart.gutter.right':25,'chart.gutter.top':25,'chart.gutter.bottom':25,'chart.ticksize':2,'chart.text.color':'black','chart.text.font':'Arial, Verdana, sans-serif','chart.text.size':12,'chart.text.bold':false,'chart.text.italic':false,'chart.text.accessible':true,'chart.text.accessible.overflow':'visible','chart.text.accessible.pointerevents':false,'chart.numticks':10,'chart.units.pre':'','chart.units.post':'','chart.zoom.factor':1.5,'chart.zoom.fade.in':true,'chart.zoom.fade.out':true,'chart.zoom.hdir':'right','chart.zoom.vdir':'down','chart.zoom.frames':25,'chart.zoom.delay':16.666,'chart.zoom.shadow':true,'chart.zoom.background':true,'chart.title':'','chart.title.side':'','chart.title.side.bold':true,'chart.title.side.font':null,'chart.shadow':true,'chart.shadow.offsetx':0,'chart.shadow.offsety':0,'chart.shadow.blur':15,'chart.shadow.color':'#ddd','chart.resizable':false,'chart.contextmenu':null,'chart.adjustable':false,'chart.value.label':true,'chart.value.label.color':null,'chart.value.label.font':null,'chart.value.label.size':null,'chart.value.label.bold':null,'chart.value.label.italic':null,'chart.value.label.decimals':null,'chart.value.label.thousand':',','chart.value.label.point':'.','chart.labels.count':5,'chart.scale.visible':false,'chart.scale.decimals':0,'chart.annotatable':false,'chart.annotate.color':'black','chart.scale.decimals':0,'chart.scale.point':'.','chart.scale.thousand':',','chart.tooltips':null,'chart.tooltips.highlight':true,'chart.tooltips.effect':'fade','chart.tooltips.event':'onclick','chart.highlight.stroke':'rgba(0,0,0,0)','chart.highlight.fill':'rgba(255,255,255,0.7)','chart.clearto':'rgba(0,0,0,0)','chart.bulb.bottom.radius.adjust':0,'chart.bulb.bottom.radius':null} if(!this.canvas){alert('[THERMOMETER] No canvas support');return;} this.$0={};if(!this.canvas.__rgraph_aa_translated__){this.context.translate(0.5,0.5);this.canvas.__rgraph_aa_translated__=true;} var RG=RGraph,ca=this.canvas,co=ca.getContext('2d'),prop=this.properties,pa2=RG.path2,win=window,doc=document,ma=Math if(RG.Effects&&typeof RG.Effects.decorate==='function'){RG.Effects.decorate(this);} this.set=this.Set=function(name) {var value=typeof arguments[1]==='undefined'?null:arguments[1];if(arguments.length===1&&typeof name==='object'){RG.parseObjectStyleConfig(this,name);return this;} if(name.substr(0,6)!='chart.'){name='chart.'+name;} while(name.match(/([A-Z])/)){name=name.replace(/([A-Z])/,'.'+RegExp.$1.toLowerCase());} if(name=='chart.ylabels.count'){name='chart.labels.count';} prop[name.toLowerCase()]=value;return this;};this.get=this.Get=function(name) {if(name.substr(0,6)!='chart.'){name='chart.'+name;} while(name.match(/([A-Z])/)){name=name.replace(/([A-Z])/,'.'+RegExp.$1.toLowerCase());} return prop[name];};this.draw=this.Draw=function() {RG.fireCustomEvent(this,'onbeforedraw');this.value=ma.min(this.max,this.value);this.value=ma.max(this.min,this.value);if(!this.colorsParsed){this.parseColors();this.colorsParsed=true;} this.currentValue=this.value;this.coordsText=[];this.gutterLeft=prop['chart.gutter.left'];this.gutterRight=prop['chart.gutter.right'];this.gutterTop=prop['chart.gutter.top'];this.gutterBottom=prop['chart.gutter.bottom'];this.scale2=RG.getScale2(this,{max:this.max,min:this.min,strict:true,'scale.thousand':prop['chart.scale.thousand'],'scale.point':prop['chart.scale.point'],'scale.decimals':prop['chart.scale.decimals'],'ylabels.count':prop['chart.labels.count'],'scale.round':prop['chart.scale.round'],'units.pre':prop['chart.units.pre'],'units.post':prop['chart.units.post']});this.x=this.gutterLeft;this.width=ca.width-this.gutterLeft-this.gutterRight;this.y=this.gutterTop+(this.width/2);this.halfWidth=this.width/2;this.bulbTopCenterx=this.gutterLeft+(this.width/2);this.bulbTopCentery=this.gutterTop+(this.width/2);this.bulbTopRadius=this.width/2;this.bulbBottomCenterx=this.gutterLeft+(this.width/2);this.bulbBottomRadius=typeof prop['chart.bulb.bottom.radius']==='number'?prop['chart.bulb.bottom.radius']:this.width*0.75+prop['chart.bulb.bottom.radius.adjust'];this.bulbBottomCentery=ca.height-this.gutterBottom-this.bulbBottomRadius;this.scaleTopY=this.bulbTopCentery;this.scaleBottomY=this.bulbBottomCentery-this.bulbBottomRadius;this.scaleHeight=this.scaleBottomY-this.scaleTopY;this.height=this.getYCoord(this.min)-this.getYCoord(this.value);this.coords[0]=[this.x,this.getYCoord(this.value),this.width,this.height];this.drawBackground();this.drawBar();this.drawTickMarks();this.drawLabels();if(prop['chart.title']){this.drawTitle();} if(prop['chart.title.side']){this.drawSideTitle();} if(prop['chart.resizable']){RG.allowResizing(this);} if(prop['chart.contextmenu']){RG.showContext(this);} RG.installEventListeners(this);if(this.firstDraw){this.firstDraw=false;RG.fireCustomEvent(this,'onfirstdraw');this.firstDrawFunc();} RG.fireCustomEvent(this,'ondraw');return this;};this.drawBackground=this.DrawBackground=function() {if(prop['chart.shadow']){RG.setShadow(this,prop['chart.shadow.color'],prop['chart.shadow.offsetx'],prop['chart.shadow.offsety'],prop['chart.shadow.blur']);} this.pathBackground();co.strokeStyle=prop['chart.strokestyle'];co.fillStyle=prop['chart.background.color'];co.lineWidth=1+prop['chart.linewidth'];co.stroke();co.fill();co.lineWidth=1;};this.drawBar=this.DrawBar=function() {this.pathBar();pa2(co,'f %',prop['chart.colors'][0]);};this.pathBar=function() {var barHeight=this.coords[0][3],y=(this.coords[0][1]+this.coords[0][3])-barHeight RG.noShadow(this);pa2(co,'b r % % % % a % % % 0 6.28 false',this.coords[0][0],y,this.coords[0][2],this.bulbBottomCentery-y,this.bulbBottomCenterx,this.bulbBottomCentery,this.bulbBottomRadius);};this.pathBackground=function() {pa2(this.context,'b r % % % % a % % % 0 6.28 false m % % a % % % 0 6.28 false',this.x,this.scaleTopY,this.coords[0][2],this.bulbBottomCentery-this.scaleTopY,this.bulbTopCenterx,this.bulbTopCentery,this.bulbTopRadius,this.bulbBottomCenterx,this.bulbBottomCentery,this.bulbBottomCenterx,this.bulbBottomCentery,this.bulbBottomRadius);};this.drawTickMarks=this.DrawTickMarks=function() {if(prop['chart.numticks']){var ticksize=prop['chart.ticksize'];co.strokeStyle=prop['chart.strokestyle'];co.lineWidth=prop['chart.linewidth']/2;co.beginPath();for(var i=0;i<=prop['chart.numticks'];++i){var y=this.scaleBottomY-((this.scaleHeight/prop['chart.numticks'])*i);co.moveTo(this.gutterLeft,ma.round(y));co.lineTo(this.gutterLeft+ticksize,ma.round(y));co.moveTo(ca.width-this.gutterRight,ma.round(y));co.lineTo(ca.width-this.gutterRight-ticksize,ma.round(y));} co.stroke();co.lineWidth=1;}};this.drawLabels=this.DrawLabels=function() {if(prop['chart.value.label']){co.fillStyle=typeof prop['chart.value.label.color']==='string'?prop['chart.value.label.color']:prop['chart.text.color'];var text=prop['chart.scale.visible']?RG.numberFormat(this,this.value.toFixed(typeof prop['chart.value.label.decimals']=='number'?prop['chart.value.label.decimals']:prop['chart.scale.decimals'])):RG.numberFormat(this,this.value.toFixed(typeof prop['chart.value.label.decimals']=='number'?prop['chart.value.label.decimals']:prop['chart.scale.decimals']),prop['chart.units.pre'],prop['chart.units.post']);RG.text2(this,{font:typeof prop['chart.value.label.font']==='string'?prop['chart.value.label.font']:prop['chart.text.font'],size:typeof prop['chart.value.label.size']==='number'?prop['chart.value.label.size']:prop['chart.text.size'],x:this.coords[0][0]+(this.coords[0][2]/2),y:this.coords[0][1]+7,text:text,bold:typeof prop['chart.value.label.bold']==='boolean'?prop['chart.value.label.bold']:prop['chart.text.bold'],italic:typeof prop['chart.value.label.italic']==='boolean'?prop['chart.value.label.italic']:prop['chart.text.italic'],valign:'top',halign:'center',bounding:true,boundingFill:'white',tag:'value.label'});} if(prop['chart.scale.visible']){this.drawScale();}};this.drawTitle=this.DrawTitle=function() {co.fillStyle=prop['chart.text.color'];RG.text2(this,{font:prop['chart.text.font'],size:prop['chart.text.size']+2,x:this.gutterLeft+(this.width/2),y:this.gutterTop-3,text:String(prop['chart.title']),valign:'bottom',halign:'center',bold:true,tag:'title'});};this.drawSideTitle=this.DrawSideTitle=function() {var font=prop['chart.title.side.font']?prop['chart.title.side.font']:prop['chart.text.font'];var size=prop['chart.title.side.size']?prop['chart.title.side.size']:prop['chart.text.size']+2;co.fillStyle=prop['chart.text.color'];RG.text2(this,{font:font,size:size+2,x:this.gutterLeft-3,y:(this.scaleHeight/2)+this.gutterTop+this.bulbTopRadius,text:String(prop['chart.title.side']),valign:'bottom',halign:'center',angle:270,bold:prop['chart.title.side.bold'],tag:'title.side',accessible:false});};this.drawScale=this.DrawScale=function() {co.fillStyle=prop['chart.text.color'];var font=prop['chart.text.font'],italic=prop['chart.text.italic'],bold=prop['chart.text.bold'],size=prop['chart.text.size'],color=prop['chart.text.color'],units_pre=prop['chart.units.pre'],units_post=prop['chart.units.post'],decimals=prop['chart.scale.decimals'],numLabels=prop['chart.labels.count'],step=(this.max-this.min)/numLabels;for(var i=1;i<=numLabels;++i){var x=ca.width-this.gutterRight+(prop['chart.linewidth']/2),y=ca.height-this.gutterBottom-(2*this.bulbBottomRadius)-((this.scaleHeight/numLabels)*i),text=RG.numberFormat(this,String((this.min+(i*step)).toFixed(decimals)),units_pre,units_post);RG.text2(this,{font:font,size:size,x:x+6,y:y,text:text,valign:'center',tag:'scale',bold:bold,italic:italic,color:color});} RG.text2(this,{font:font,size:size,x:x+6,y:this.bulbBottomCentery-this.bulbBottomRadius,text:RG.numberFormat(this,this.min.toFixed(decimals),units_pre,units_post),valign:'center',tag:'scale'});};this.getShape=this.getBar=function(e) {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1];for(var i=0;ithis.max||value0){co.fillStyle=prop['chart.title.color'];RG.text2(this,{'font':prop['chart.title.font']?prop['chart.title.font']:text_font,'size':title_size,'x':this.gutterLeft+((ca.width-this.gutterLeft-this.gutterRight)/2),'y':this.gutterTop-5,'text':prop['chart.title'],'valign':'bottom','halign':'center','bold':prop['chart.title.bold'],'tag':'title'});} if(typeof(prop['chart.title.side'])=='string'){co.fillStyle=prop['chart.title.side.color'];RG.Text2(this,{'font':prop['chart.title.side.font'],'size':prop['chart.title.side.size'],'x':prop['chart.labels.position']=='right'?this.gutterLeft-10:(ca.width-this.gutterRight)+10,'y':this.gutterTop+(this.height/2),'text':prop['chart.title.side'],'valign':'bottom','halign':'center','angle':prop['chart.labels.position']=='right'?270:90,'bold':prop['chart.title.side.bold'],'tag':'title.side'});}};this.getShape=this.getBar=function(e) {var mouseXY=RG.getMouseXY(e),mouseX=mouseXY[0],mouseY=mouseXY[1] for(var i=0,len=this.coords.length;ithis.max)value=this.max;if(valuethis.gutterLeft&&mouseXY[0]<(ca.width-this.gutterRight)&&mouseXY[1]>=this.gutterTop&&mouseXY[1]<=(ca.height-this.gutterBottom)){return this;}};this.allowAdjusting=this.AllowAdjusting=function(){return;};this.adjusting_mousemove=this.Adjusting_mousemove=function(e) {if(prop['chart.adjustable']&&RG.Registry.Get('chart.adjusting')&&RG.Registry.Get('chart.adjusting').uid==this.uid){var mouseXY=RG.getMouseXY(e);var value=this.getValue(e);if(typeof value==='number'){RG.FireCustomEvent(this,'onadjust');this.value=Number(value.toFixed(prop['chart.scale.decimals']));RG.RedrawCanvas(this.canvas);}}};this.drawSpecificLabels=this.DrawSpecificLabels=function() {var labels=prop['chart.labels.specific'];if(labels){var font=prop['chart.text.font'];var size=prop['chart.text.size'];var halign=prop['chart.labels.position']=='right'?'left':'right';var step=this.height/(labels.length-1);co.beginPath();co.fillStyle=prop['chart.text.color'];for(var i=0;ithis.max||value=this.gutterLeft&&mouseX<=(ca.width-this.gutterRight)&&mouseY>=this.gutterTop&&mouseY<=(ca.height-this.gutterBottom)){return true;} return false;};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.tickmarks.color']=RG.array_clone(prop['chart.tickmarks.color']);this.original_colors['chart.strokestyle.inner']=RG.array_clone(prop['chart.strokestyle.inner']);this.original_colors['chart.strokestyle.outer']=RG.array_clone(prop['chart.strokestyle.outer']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.color']=RG.array_clone(prop['chart.highlight.color']);} var colors=prop['chart.colors'];for(var i=0,len=colors.length;i0){var yTickGap=(ca.height-this.gutterTop-this.gutterBottom)/numYTicks;for(y=this.gutterTop;y<(ca.height-this.gutterBottom);y+=yTickGap){if(prop['chart.xaxispos']=='bottom'||(y!=((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop)){co.moveTo(this.gutterLeft,ma.round(y));co.lineTo(this.gutterLeft-3,ma.round(y));}} if(prop['chart.noxaxis']||prop['chart.xaxispos']=='center'||prop['chart.ymin']!==0){co.moveTo(this.gutterLeft-3,Math.round(ca.height-this.gutterBottom));co.lineTo(this.gutterLeft,Math.round(ca.height-this.gutterBottom));}} if(prop['chart.numxticks']==null){prop['chart.numxticks']=this.data.length+(prop['chart.total']?1:0)} if(prop['chart.noxaxis']==false&&prop['chart.numxticks']>0){xTickGap=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.numxticks'];if(prop['chart.xaxispos']=='center'){yStart=((ca.height-this.gutterBottom-this.gutterTop)/2)+this.gutterTop-3;yEnd=((ca.height-this.gutterBottom-this.gutterTop)/2)+this.gutterTop+3;}else{yStart=this.getYCoord(0)-(this.scale2.min<0?3:0);yEnd=this.getYCoord(0)+3;} for(x=this.gutterLeft+xTickGap;x<=ca.width-this.gutterRight+1;x+=xTickGap){co.moveTo(ma.round(x),yStart);co.lineTo(ma.round(x),yEnd);} if(prop['chart.noyaxis']){co.moveTo(ma.round(this.gutterLeft),yStart);co.lineTo(ma.round(this.gutterLeft),yEnd);}} if(prop['chart.noyaxis']&&prop['chart.noxaxis']==false){co.moveTo(ma.round(this.gutterLeft),this.getYCoord(0));co.lineTo(ma.round(this.gutterLeft),this.getYCoord(0));} co.stroke();};this.drawLabels=this.DrawLabels=function() {var context=co,numYLabels=5,interval=this.grapharea/numYLabels,font=prop['chart.text.font'],size=prop['chart.text.size'],color=prop['chart.text.color'],units_pre=prop['chart.units.pre'],units_post=prop['chart.units.post'],offsetx=prop['chart.ylabels.offsetx'],offsety=prop['chart.ylabels.offsety'];co.beginPath();co.fillStyle=color;if(prop['chart.ylabels']){if(prop['chart.xaxispos']=='center'){var halfInterval=interval/2;var halfWay=((ca.height-this.gutterTop-this.gutterBottom)/2)+this.gutterTop;for(var i=0,len=this.scale2.labels.length;i0){interval=(ca.width-this.gutterLeft-this.gutterRight)/prop['chart.labels'].length;var halign='center',valign='top',angle=prop['chart.text.angle'];if(angle){halign='right';angle*=-1;} var labels=prop['chart.labels'],labelsColor=prop['chart.labels.color'],bold=prop['chart.labels.bold'],offsetx=prop['chart.labels.offsetx'],offsety=prop['chart.labels.offsety'] for(var i=0,len=labels.length;i=0?(coords[1]-3-prop['chart.labels.above.offsety']):(coords[1]+coords[3]+3+prop['chart.labels.above.offsety']),text:str,valign:(isTotal?this.total:this.data[i])>=0?'bottom':'top',halign:'center',tag:'labels.above'});}};this.drawbars=this.Drawbars=function() {var context=co,canvas=ca,hmargin=prop['chart.hmargin'],runningTotal=0;co.lineWidth=prop['chart.linewidth']+0.001;for(var i=0,len=this.data.length,seq=0;i=0?prop['chart.colors'][0]:prop['chart.colors'][1];if(prop['chart.colors.sequential']){co.fillStyle=prop['chart.colors'][seq];} if(prop['chart.shadow']){RG.setShadow(this,prop['chart.shadow.color'],prop['chart.shadow.offsetx'],prop['chart.shadow.offsety'],prop['chart.shadow.blur']);}else{RG.noShadow(this);} co.rect(x+prop['chart.bar.offsetx'],ma.floor(y)+prop['chart.bar.offsety'],w,ma.floor(h));this.coords.push([x,y,w,h]);runningTotal+=this.data[i];co.stroke();co.fill();} this.total=runningTotal;if(prop['chart.total']){h=this.getYCoord(0)-this.getYCoord(ma.abs(runningTotal));if(prop['chart.xaxispos']=='center'){y=runningTotal>0?this.getYCoord(0)-h:this.getYCoord(0);}else{if(runningTotal>0){y=this.getYCoord(0)-h;}else{y=this.getYCoord(0);}} x=x+(prop['chart.hmargin']*2)+w;co.fillStyle=prop['chart.colors'][2];if(prop['chart.colors.sequential']){co.fillStyle=prop['chart.colors'][seq]} pa2(co,'b r % % % % s % f %',x+prop['chart.bar.offsetx'],y+prop['chart.bar.offsety'],w,h,co.strokeStyle,co.fillStyle);var previousCoords=[x,y,w,ma.abs(h)];this.coords.push(previousCoords);} RG.noShadow(this);co.lineWidth=1;co.strokeStyle='#666';co.beginPath();for(var i=1,len=this.coords.length;i0?prev[1]:prev[1]+prev[3]);co.moveTo(prev[0]+prev[2]+prop['chart.bar.offsetx'],y+prop['chart.bar.offsety']);co.lineTo(curr[0]+prop['chart.bar.offsetx'],(prevData>0?prev[1]:prev[1]+prev[3])+prop['chart.bar.offsety']);} co.stroke();};this.getShape=this.getBar=function(e) {for(var i=0,len=this.coords.length;i=left&&mouseX<=(left+width)&&mouseY>=top&&mouseY<=top+height){var tooltip=RG.parseTooltipText(prop['chart.tooltips'],i);return{0:this,object:this,1:left,x:left,2:top,y:top,3:width,width:width,4:height,height:height,5:i,index:i,tooltip:tooltip};}} return null;};this.getMax=function(data) {var runningTotal=0,max=0;for(var i=0,len=data.length;ithis.gutterLeft&&mouseXY[0]<(ca.width-this.gutterRight)&&mouseXY[1]>this.gutterTop&&mouseXY[1]<(ca.height-this.gutterBottom)){return this;}};this.getYCoord=function(value) {if(prop['chart.xaxispos']=='center'){if(value<(-1*this.max)){return null;} var coord=(value/this.max)*(this.grapharea/2);return this.gutterTop+(this.grapharea/2)-coord;}else{var coord=((value-this.scale2.min)/(this.max-this.scale2.min))*this.grapharea;coord=coord+this.gutterBottom;return ca.height-coord;}};this.parseColors=function() {if(this.original_colors.length===0){this.original_colors['chart.colors']=RG.array_clone(prop['chart.colors']);this.original_colors['chart.key.colors']=RG.array_clone(prop['chart.key.colors']);this.original_colors['chart.crosshairs.color']=RG.array_clone(prop['chart.crosshairs.color']);this.original_colors['chart.highlight.stroke']=RG.array_clone(prop['chart.highlight.stroke']);this.original_colors['chart.highlight.fill']=RG.array_clone(prop['chart.highlight.fill']);this.original_colors['chart.background.barcolor1']=RG.array_clone(prop['chart.background.barcolor1']);this.original_colors['chart.background.barcolor2']=RG.array_clone(prop['chart.background.barcolor2']);this.original_colors['chart.background.grid.color']=RG.array_clone(prop['chart.background.grid.color']);this.original_colors['chart.strokestyle']=RG.array_clone(prop['chart.strokestyle']);this.original_colors['chart.axis.color']=RG.array_clone(prop['chart.axis.color']);} var colors=prop['chart.colors'];if(colors){for(var i=0,len=colors.length;i li > a:hover, .dropdown-menu > li > a:focus { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; background-color: #e8e8e8; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; background-color: #2e6da4; } .navbar-default { background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8)); background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); border-radius: 4px; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #286090; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); background-repeat: repeat-x; border-color: #2b669a; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); } /*# sourceMappingURL=bootstrap-theme.css.map */ ================================================ FILE: docs/css/bootstrap.css ================================================ /*! * Bootstrap v3.4.0 (https://getbootstrap.com/) * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: none; text-decoration: underline; -webkit-text-decoration: underline dotted; -moz-text-decoration: underline dotted; text-decoration: underline dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; -webkit-box-shadow: none !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: "Glyphicons Halflings"; src: url("../fonts/glyphicons-halflings-regular.eot"); src: url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: "Glyphicons Halflings"; font-style: normal; font-weight: 400; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\002a"; } .glyphicon-plus:before { content: "\002b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #333333; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: 400; line-height: 1; color: #777777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { padding: 0.2em; background-color: #fcf8e3; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: 700; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eeeeee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: "\2014 \00A0"; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; text-align: right; border-right: 5px solid #eeeeee; border-left: 0; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ""; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: "\00A0 \2014"; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #fff; background-color: #333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } kbd kbd { padding: 0; font-size: 100%; font-weight: 700; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; color: #333333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { margin-right: -15px; margin-left: -15px; } .row-no-gutters { margin-right: 0; margin-left: 0; } .row-no-gutters [class*="col-"] { padding-right: 0; padding-left: 0; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { background-color: transparent; } table col[class*="col-"] { position: static; display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { position: static; display: table-cell; float: none; } caption { padding-top: 8px; padding-bottom: 8px; color: #777777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { min-height: 0.01%; overflow-x: auto; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: 700; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-appearance: none; -moz-appearance: none; appearance: none; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.42857143; color: #555555; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control::-ms-expand { background-color: transparent; border: 0; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eeeeee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 46px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: 400; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-top: 4px \9; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: 400; vertical-align: middle; cursor: pointer; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } .form-control-static { min-height: 34px; padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; } .form-control-static.input-lg, .form-control-static.input-sm { padding-right: 0; padding-left: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 42.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; background-color: #dff0d8; border-color: #3c763d; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; background-color: #fcf8e3; border-color: #8a6d3b; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; background-color: #f2dede; border-color: #a94442; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 27px; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { padding-top: 7px; margin-bottom: 0; text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; background-image: none; border: 1px solid transparent; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; filter: alpha(opacity=65); opacity: 0.65; -webkit-box-shadow: none; box-shadow: none; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; background-image: none; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; background-image: none; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; background-image: none; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #fff; } .btn-info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; background-image: none; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; background-image: none; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; background-image: none; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { font-weight: 400; color: #337ab7; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; -webkit-transition-duration: 0.35s; -o-transition-duration: 0.35s; transition-duration: 0.35s; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: 400; line-height: 1.42857143; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { right: 0; left: auto; } .dropdown-menu-left { right: auto; left: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777777; white-space: nowrap; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } .navbar-right .dropdown-menu-left { right: auto; left: 0; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group .form-control:focus { z-index: 3; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: 400; line-height: 1; color: #555555; text-align: center; background-color: #eeeeee; border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #777777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777777; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; cursor: default; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; overflow-x: visible; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-right: 15px; margin-top: 8px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { padding: 10px 15px; margin-right: -15px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: 8px; margin-bottom: 8px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-right: 15px; margin-left: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555; background-color: #e7e7e7; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #fff; background-color: #080808; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ccc; content: "/\00a0"; } .breadcrumb > .active { color: #777777; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; color: #23527c; background-color: #eeeeee; border-color: #ddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; color: #fff; cursor: default; background-color: #337ab7; border-color: #337ab7; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; cursor: not-allowed; background-color: #fff; border-color: #ddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777777; cursor: not-allowed; background-color: #fff; } .label { display: inline; padding: 0.2em 0.6em 0.3em; font-size: 75%; font-weight: 700; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: 0.25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eeeeee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 15px; padding-left: 15px; border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 63px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 20px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; transition: border 0.2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-right: auto; margin-left: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #333333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0%; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { overflow: hidden; zoom: 1; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777777; cursor: not-allowed; background-color: #eeeeee; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; filter: alpha(opacity=20); opacity: 0.2; } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; filter: alpha(opacity=50); opacity: 0.5; } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; -moz-appearance: none; appearance: none; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: -webkit-transform 0.3s ease-out; transition: transform 0.3s ease-out; transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #fff; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); outline: 0; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: 0.5; } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: 400; line-height: 1.42857143; line-break: auto; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; font-size: 12px; filter: alpha(opacity=0); opacity: 0; } .tooltip.in { filter: alpha(opacity=90); opacity: 0.9; } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { right: 5px; bottom: 0; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: 400; line-height: 1.42857143; line-break: auto; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; font-size: 14px; background-color: #fff; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover > .arrow { border-width: 11px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow:after { content: ""; border-width: 10px; } .popover.top > .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); border-bottom-width: 0; } .popover.top > .arrow:after { bottom: 1px; margin-left: -10px; content: " "; border-top-color: #fff; border-bottom-width: 0; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); border-left-width: 0; } .popover.right > .arrow:after { bottom: -10px; left: 1px; content: " "; border-right-color: #fff; border-left-width: 0; } .popover.bottom > .arrow { top: -11px; left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); } .popover.bottom > .arrow:after { top: 1px; margin-left: -10px; content: " "; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left > .arrow:after { right: 1px; bottom: -10px; content: " "; border-right-width: 0; border-left-color: #fff; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: 0.6s ease-in-out left; -o-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform 0.6s ease-in-out; -o-transition: -o-transform 0.6s ease-in-out; transition: -webkit-transform 0.6s ease-in-out; transition: transform 0.6s ease-in-out; transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); left: 0; } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); left: 0; } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); left: 0; } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); background-color: rgba(0, 0, 0, 0); filter: alpha(opacity=50); opacity: 0.5; } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); background-repeat: repeat-x; } .carousel-control.right { right: 0; left: auto; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); background-repeat: repeat-x; } .carousel-control:hover, .carousel-control:focus { color: #fff; text-decoration: none; outline: 0; filter: alpha(opacity=90); opacity: 0.9; } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -10px; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; font-family: serif; line-height: 1; } .carousel-control .icon-prev:before { content: "\2039"; } .carousel-control .icon-next:before { content: "\203a"; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); border: 1px solid #fff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #fff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -10px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -10px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -10px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-header:before, .modal-header:after, .modal-footer:before, .modal-footer:after { display: table; content: " "; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-header:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*# sourceMappingURL=bootstrap.css.map */ ================================================ FILE: docs/js/bootstrap.js ================================================ /*! * Bootstrap v3.4.0 (https://getbootstrap.com/) * Copyright 2011-2018 Twitter, Inc. * Licensed under the MIT license */ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +function ($) { 'use strict'; var version = $.fn.jquery.split(' ')[0].split('.') if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') } }(jQuery); /* ======================================================================== * Bootstrap: transition.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#transitions * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // https://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this $(this).one('bsTransitionEnd', function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() if (!$.support.transition) return $.event.special.bsTransitionEnd = { bindType: $.support.transition.end, delegateType: $.support.transition.end, handle: function (e) { if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) } } }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#alerts * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.VERSION = '3.4.0' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } selector = selector === '#' ? [] : selector var $parent = $(document).find(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { // detach from parent, fire event then clean up data $parent.detach().trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); /* ======================================================================== * Bootstrap: button.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#buttons * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.VERSION = '3.4.0' Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state += 'Text' if (data.resetText == null) $el.data('resetText', $el[val]()) // push to event loop to allow forms to submit setTimeout($.proxy(function () { $el[val](data[state] == null ? this.options[state] : data[state]) if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d).prop(d, true) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d).prop(d, false) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked')) changed = false $parent.find('.active').removeClass('active') this.$element.addClass('active') } else if ($input.prop('type') == 'checkbox') { if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false this.$element.toggleClass('active') } $input.prop('checked', this.$element.hasClass('active')) if (changed) $input.trigger('change') } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')) this.$element.toggleClass('active') } } // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } var old = $.fn.button $.fn.button = Plugin $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target).closest('.btn') Plugin.call($btn, 'toggle') if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { // Prevent double click on radios, and the double selections (so cancellation) on checkboxes e.preventDefault() // The target component still receive the focus if ($btn.is('input,button')) $btn.trigger('focus') else $btn.find('input:visible,button:visible').first().trigger('focus') } }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) }) }(jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#carousel * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = null this.sliding = null this.interval = null this.$active = null this.$items = null this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } Carousel.VERSION = '3.4.0' Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true, keyboard: true } Carousel.prototype.keydown = function (e) { if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break default: return } e.preventDefault() } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getItemIndex = function (item) { this.$items = item.parent().children('.item') return this.$items.index(item || this.$active) } Carousel.prototype.getItemForDirection = function (direction, active) { var activeIndex = this.getItemIndex(active) var willWrap = (direction == 'prev' && activeIndex === 0) || (direction == 'next' && activeIndex == (this.$items.length - 1)) if (willWrap && !this.options.wrap) return active var delta = direction == 'prev' ? -1 : 1 var itemIndex = (activeIndex + delta) % this.$items.length return this.$items.eq(itemIndex) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) if (typeof $next === 'object' && $next.length) { $next[0].offsetWidth // force reflow } $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var $this = $(this) var href = $this.attr('href') if (href) { href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 } var target = $this.attr('data-target') || href var $target = $(document).find(target) if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#collapse * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ /* jshint latedef: false */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.4.0' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(document).find(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(document).find(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#dropdowns * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.4.0' function getParent($this) { var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = selector && $(document).find(selector) return $parent && $parent.length ? $parent : $this.parent() } function clearMenus(e) { if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { var $this = $(this) var $parent = getParent($this) var relatedTarget = { relatedTarget: this } if (!$parent.hasClass('open')) return if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) }) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $(document.createElement('div')) .addClass('dropdown-backdrop') .insertAfter($(this)) .on('click', clearMenus) } var relatedTarget = { relatedTarget: this } $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this .trigger('focus') .attr('aria-expanded', 'true') $parent .toggleClass('open') .trigger($.Event('shown.bs.dropdown', relatedTarget)) } return false } Dropdown.prototype.keydown = function (e) { if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') if (!isActive && e.which != 27 || isActive && e.which == 27) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } var desc = ' li:not(.disabled):visible a' var $items = $parent.find('.dropdown-menu' + desc) if (!$items.length) return var index = $items.index(e.target) if (e.which == 38 && index > 0) index-- // up if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') } // DROPDOWN PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.dropdown') if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.dropdown $.fn.dropdown = Plugin $.fn.dropdown.Constructor = Dropdown // DROPDOWN NO CONFLICT // ==================== $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } // APPLY TO STANDARD DROPDOWN ELEMENTS // =================================== $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== * Bootstrap: modal.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#modals * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // MODAL CLASS DEFINITION // ====================== var Modal = function (element, options) { this.options = options this.$body = $(document.body) this.$element = $(element) this.$dialog = this.$element.find('.modal-dialog') this.$backdrop = null this.isShown = null this.originalBodyPad = null this.scrollbarWidth = 0 this.ignoreBackdropClick = false this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom' if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } Modal.VERSION = '3.4.0' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true } Modal.prototype.toggle = function (_relatedTarget) { return this.isShown ? this.hide() : this.show(_relatedTarget) } Modal.prototype.show = function (_relatedTarget) { var that = this var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.checkScrollbar() this.setScrollbar() this.$body.addClass('modal-open') this.escape() this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) }) this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(that.$body) // don't move modals dom position } that.$element .show() .scrollTop(0) that.adjustDialog() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') that.enforceFocus() var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ? that.$dialog // wait for modal to slide in .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } Modal.prototype.hide = function (e) { if (e) e.preventDefault() e = $.Event('hide.bs.modal') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() this.resize() $(document).off('focusin.bs.modal') this.$element .removeClass('in') .off('click.dismiss.bs.modal') .off('mouseup.dismiss.bs.modal') this.$dialog.off('mousedown.dismiss.bs.modal') $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } Modal.prototype.enforceFocus = function () { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { if (document !== e.target && this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) } Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () { if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } Modal.prototype.hideModal = function () { var that = this this.$element.hide() this.backdrop(function () { that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } Modal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove() this.$backdrop = null } Modal.prototype.backdrop = function (callback) { var that = this var animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $(document.createElement('div')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return } if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow this.$backdrop.addClass('in') if (!callback) return doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } } // these following methods are used to handle overflowing modals Modal.prototype.handleUpdate = function () { this.adjustDialog() } Modal.prototype.adjustDialog = function () { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } Modal.prototype.resetAdjustments = function () { this.$element.css({ paddingLeft: '', paddingRight: '' }) } Modal.prototype.checkScrollbar = function () { var fullWindowWidth = window.innerWidth if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) } this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' var scrollbarWidth = this.scrollbarWidth if (this.bodyIsOverflowing) { this.$body.css('padding-right', bodyPad + scrollbarWidth) $(this.fixedContent).each(function (index, element) { var actualPadding = element.style.paddingRight var calculatedPadding = $(element).css('padding-right') $(element) .data('padding-right', actualPadding) .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px') }) } } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) $(this.fixedContent).each(function (index, element) { var padding = $(element).data('padding-right') $(element).removeData('padding-right') element.style.paddingRight = padding ? padding : '' }) } Modal.prototype.measureScrollbar = function () { // thx walsh var scrollDiv = document.createElement('div') scrollDiv.className = 'modal-scrollbar-measure' this.$body.append(scrollDiv) var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth this.$body[0].removeChild(scrollDiv) return scrollbarWidth } // MODAL PLUGIN DEFINITION // ======================= function Plugin(option, _relatedTarget) { return this.each(function () { var $this = $(this) var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal $.fn.modal = Plugin $.fn.modal.Constructor = Modal // MODAL NO CONFLICT // ================= $.fn.modal.noConflict = function () { $.fn.modal = old return this } // MODAL DATA-API // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this) var href = $this.attr('href') var target = $this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 var $target = $(document).find(target) var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery); /* ======================================================================== * Bootstrap: tooltip.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TOOLTIP PUBLIC CLASS DEFINITION // =============================== var Tooltip = function (element, options) { this.type = null this.options = null this.enabled = null this.timeout = null this.hoverState = null this.$element = null this.inState = null this.init('tooltip', element, options) } Tooltip.VERSION = '3.4.0' Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, placement: 'top', selector: false, template: '', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 } } Tooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } Tooltip.prototype.getDefaults = function () { return Tooltip.DEFAULTS } Tooltip.prototype.getOptions = function (options) { options = $.extend({}, this.getDefaults(), this.$element.data(), options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } return options } Tooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } Tooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('in') || self.hoverState == 'in') { self.hoverState = 'in' return } clearTimeout(self.timeout) self.hoverState = 'in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'in') self.show() }, self.options.delay.show) } Tooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } Tooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'out') self.hide() }, self.options.delay.hide) } Tooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'out') that.leave(that) } $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } Tooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) $tip.removeClass('fade in top bottom left right') } Tooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) } callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('in') $.support.transition && $tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } Tooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } Tooltip.prototype.hasContent = function () { return this.getTitle() } Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var isSvg = window.SVGElement && el instanceof window.SVGElement // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. // See https://github.com/twbs/bootstrap/issues/20280 var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } Tooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } Tooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } Tooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } Tooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } Tooltip.prototype.enable = function () { this.enabled = true } Tooltip.prototype.disable = function () { this.enabled = false } Tooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } Tooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('in') ? self.leave(self) : self.enter(self) } } Tooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null that.$element = null }) } // TOOLTIP PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tooltip $.fn.tooltip = Plugin $.fn.tooltip.Constructor = Tooltip // TOOLTIP NO CONFLICT // =================== $.fn.tooltip.noConflict = function () { $.fn.tooltip = old return this } }(jQuery); /* ======================================================================== * Bootstrap: popover.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#popovers * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // POPOVER PUBLIC CLASS DEFINITION // =============================== var Popover = function (element, options) { this.init('popover', element, options) } if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') Popover.VERSION = '3.4.0' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', trigger: 'click', content: '', template: '' }) // NOTE: POPOVER EXTENDS tooltip.js // ================================ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) Popover.prototype.constructor = Popover Popover.prototype.getDefaults = function () { return Popover.DEFAULTS } Popover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' ](content) $tip.removeClass('fade top bottom left right in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() } Popover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } Popover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } Popover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.popover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.popover', (data = new Popover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.popover $.fn.popover = Plugin $.fn.popover.Constructor = Popover // POPOVER NO CONFLICT // =================== $.fn.popover.noConflict = function () { $.fn.popover = old return this } }(jQuery); /* ======================================================================== * Bootstrap: scrollspy.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#scrollspy * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // SCROLLSPY CLASS DEFINITION // ========================== function ScrollSpy(element, options) { this.$body = $(document.body) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.selector = (this.options.target || '') + ' .nav li > a' this.offsets = [] this.targets = [] this.activeTarget = null this.scrollHeight = 0 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) this.refresh() this.process() } ScrollSpy.VERSION = '3.4.0' ScrollSpy.DEFAULTS = { offset: 10 } ScrollSpy.prototype.getScrollHeight = function () { return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) } ScrollSpy.prototype.refresh = function () { var that = this var offsetMethod = 'offset' var offsetBase = 0 this.offsets = [] this.targets = [] this.scrollHeight = this.getScrollHeight() if (!$.isWindow(this.$scrollElement[0])) { offsetMethod = 'position' offsetBase = this.$scrollElement.scrollTop() } this.$body .find(this.selector) .map(function () { var $el = $(this) var href = $el.data('target') || $el.attr('href') var $href = /^#./.test(href) && $(href) return ($href && $href.length && $href.is(':visible') && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { that.offsets.push(this[0]) that.targets.push(this[1]) }) } ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollHeight = this.getScrollHeight() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i if (this.scrollHeight != scrollHeight) { this.refresh() } if (scrollTop >= maxScroll) { return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop < offsets[0]) { this.activeTarget = null return this.clear() } for (i = offsets.length; i--;) { activeTarget != targets[i] && scrollTop >= offsets[i] && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) && this.activate(targets[i]) } } ScrollSpy.prototype.activate = function (target) { this.activeTarget = target this.clear() var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector) .parents('li') .addClass('active') if (active.parent('.dropdown-menu').length) { active = active .closest('li.dropdown') .addClass('active') } active.trigger('activate.bs.scrollspy') } ScrollSpy.prototype.clear = function () { $(this.selector) .parentsUntil(this.options.target, '.active') .removeClass('active') } // SCROLLSPY PLUGIN DEFINITION // =========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') var options = typeof option == 'object' && option if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.scrollspy $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy // SCROLLSPY NO CONFLICT // ===================== $.fn.scrollspy.noConflict = function () { $.fn.scrollspy = old return this } // SCROLLSPY DATA-API // ================== $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) Plugin.call($spy, $spy.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: tab.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#tabs * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TAB CLASS DEFINITION // ==================== var Tab = function (element) { // jscs:disable requireDollarBeforejQueryAssignment this.element = $(element) // jscs:enable requireDollarBeforejQueryAssignment } Tab.VERSION = '3.4.0' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element var $ul = $this.closest('ul:not(.dropdown-menu)') var selector = $this.data('target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } if ($this.parent('li').hasClass('active')) return var $previous = $ul.find('.active:last a') var hideEvent = $.Event('hide.bs.tab', { relatedTarget: $this[0] }) var showEvent = $.Event('show.bs.tab', { relatedTarget: $previous[0] }) $previous.trigger(hideEvent) $this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(document).find(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { $previous.trigger({ type: 'hidden.bs.tab', relatedTarget: $this[0] }) $this.trigger({ type: 'shown.bs.tab', relatedTarget: $previous[0] }) }) } Tab.prototype.activate = function (element, container, callback) { var $active = container.find('> .active') var transition = callback && $.support.transition && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') .removeClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition element.addClass('in') } else { element.removeClass('fade') } if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') .addClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', true) } callback && callback() } $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') } // TAB PLUGIN DEFINITION // ===================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tab') if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tab $.fn.tab = Plugin $.fn.tab.Constructor = Tab // TAB NO CONFLICT // =============== $.fn.tab.noConflict = function () { $.fn.tab = old return this } // TAB DATA-API // ============ var clickHandler = function (e) { e.preventDefault() Plugin.call($(this), 'show') } $(document) .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) }(jQuery); /* ======================================================================== * Bootstrap: affix.js v3.4.0 * https://getbootstrap.com/docs/3.4/javascript/#affix * ======================================================================== * Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // AFFIX CLASS DEFINITION // ====================== var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target) this.$target = target .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) this.$element = $(element) this.affixed = null this.unpin = null this.pinnedOffset = null this.checkPosition() } Affix.VERSION = '3.4.0' Affix.RESET = 'affix affix-top affix-bottom' Affix.DEFAULTS = { offset: 0, target: window } Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { var scrollTop = this.$target.scrollTop() var position = this.$element.offset() var targetHeight = this.$target.height() if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false if (this.affixed == 'bottom') { if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' } var initializing = this.affixed == null var colliderTop = initializing ? scrollTop : position.top var colliderHeight = initializing ? targetHeight : height if (offsetTop != null && scrollTop <= offsetTop) return 'top' if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' return false } Affix.prototype.getPinnedOffset = function () { if (this.pinnedOffset) return this.pinnedOffset this.$element.removeClass(Affix.RESET).addClass('affix') var scrollTop = this.$target.scrollTop() var position = this.$element.offset() return (this.pinnedOffset = position.top - scrollTop) } Affix.prototype.checkPositionWithEventLoop = function () { setTimeout($.proxy(this.checkPosition, this), 1) } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom var scrollHeight = Math.max($(document).height(), $(document.body).height()) if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) if (this.affixed != affix) { if (this.unpin != null) this.$element.css('top', '') var affixType = 'affix' + (affix ? '-' + affix : '') var e = $.Event(affixType + '.bs.affix') this.$element.trigger(e) if (e.isDefaultPrevented()) return this.affixed = affix this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.$element .removeClass(Affix.RESET) .addClass(affixType) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') } if (affix == 'bottom') { this.$element.offset({ top: scrollHeight - height - offsetBottom }) } } // AFFIX PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.affix') var options = typeof option == 'object' && option if (!data) $this.data('bs.affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.affix $.fn.affix = Plugin $.fn.affix.Constructor = Affix // AFFIX NO CONFLICT // ================= $.fn.affix.noConflict = function () { $.fn.affix = old return this } // AFFIX DATA-API // ============== $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) var data = $spy.data() data.offset = data.offset || {} if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) }) }(jQuery); ================================================ FILE: docs/js/npm.js ================================================ // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. require('../../js/transition.js') require('../../js/alert.js') require('../../js/button.js') require('../../js/carousel.js') require('../../js/collapse.js') require('../../js/dropdown.js') require('../../js/modal.js') require('../../js/tooltip.js') require('../../js/popover.js') require('../../js/scrollspy.js') require('../../js/tab.js') require('../../js/affix.js') ================================================ FILE: docs/video.html ================================================ Atari Zoo Neural Activity Visualizer

================================================ FILE: docs/video2.html ================================================ Atari Zoo Neural Activity Visualizer

Activations to view


Select model to visualize


[No canvas support] [No canvas support]

Playback controls



Advanced features





Note this webapp borrows from this very helpful demo.
================================================ FILE: examples/classify_state.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy as np import tensorflow as tf from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report from tensorflow import keras algos = ['a2c','es','ga','apex','rainbow','dqn'] algos_2 = algos[:6] env_name = 'SeaquestNoFrameskip-v4' # env_name = 'ZaxxonNoFrameskip-v4' root_dir = '/rl_zoo/data/' rollout_path_template = root_dir + 'rlzoo/{}/{}/model{}_rollout.npz' split_by_rollout = False n_last_frames = 1 num_models = 3 train_frames, train_labels, test_frames, test_labels = None, None, None, None if split_by_rollout: idx = np.arange(num_models) np.random.shuffle(idx) train_idx, test_idx = idx[:-1], idx[-1:] for algo in algos_2: for model_num in range(num_models): rollout = np.load(rollout_path_template.format(algo, env_name, model_num + 1)) observations = rollout['observations'][:, :, :, :n_last_frames] labels_ = np.empty(observations.shape[0]) labels_.fill(algos_2.index(algo)) if model_num in train_idx: if train_frames is None: train_frames = observations train_labels = labels_ else: train_frames = np.append(train_frames, observations, axis=0) train_labels = np.append(train_labels, labels_, axis=0) elif model_num in test_idx: if test_frames is None: test_frames = observations test_labels = labels_ else: test_frames = np.append(test_frames, observations, axis=0) test_labels = np.append(test_labels, labels_, axis=0) else: idx = np.arange(num_models) np.random.shuffle(idx) train_idx, test_idx = idx[:-1], idx[-1:] frames, labels = None, None for algo in algos_2: for model_num in range(num_models): rollout = np.load(rollout_path_template.format(algo, env_name, model_num + 1)) observations = rollout['observations'][:, :, :, :n_last_frames] labels_ = np.empty(observations.shape[0]) labels_.fill(algos_2.index(algo)) if model_num in train_idx: if frames is None: frames = observations labels = labels_ else: frames = np.append(frames, observations, axis=0) labels = np.append(labels, labels_, axis=0) indices = np.random.permutation(frames.shape[0]) split_threshold = int(frames.shape[0] * 0.8) train_idx, test_idx = indices[:split_threshold], indices[split_threshold:] train_frames, train_labels = frames[train_idx, :], labels[train_idx] test_frames, test_labels = frames[test_idx, :], labels[test_idx] print('train shape', train_frames.shape, train_labels.shape) print('test shape', test_frames.shape, test_labels.shape) frame_size = train_frames.shape[1] kernel_size = 3 model = keras.Sequential([ keras.layers.Conv2D(16, kernel_size, activation=tf.nn.relu, input_shape=(frame_size, frame_size, n_last_frames)), keras.layers.Conv2D(32, kernel_size, activation=tf.nn.relu), keras.layers.Flatten(), keras.layers.Dense(128, activation=tf.nn.relu), keras.layers.Dense(len(algos_2), activation=tf.nn.softmax) ]) model.compile(optimizer=tf.train.AdamOptimizer(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_frames, train_labels, epochs=1, callbacks=[keras.callbacks.EarlyStopping()], validation_split=0.1) # eval test_loss, test_acc = model.evaluate(test_frames, test_labels) print('Overall test accuracy:', test_acc) pred_labels = model.predict_classes(test_frames) cnf_matrix = confusion_matrix(test_labels, pred_labels) print('confusion matrix') print(cnf_matrix) print(classification_report(test_labels, pred_labels, target_names=algos_2)) ================================================ FILE: examples/demo.py ================================================ # Copyright (c) 2018 Uber Technologies, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys sys.path.append("..") import atari_zoo from atari_zoo import MakeAtariModel from pylab import * algo = "a2c" env = "ZaxxonNoFrameskip-v4" run_id = 1 m = MakeAtariModel(algo,env,run_id)() # get observations, frames, and ram state from a representative rollout obs = m.get_observations() frames = m.get_frames() ram = m.get_ram() # visualize first layer of convolutional weights session = atari_zoo.utils.get_session() m.load_graphdef() m.import_graph() conv_weights = m.get_weights(session,0) atari_zoo.utils.visualize_conv_w(conv_weights) show() ================================================ FILE: notebooks/Basic visualization.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/joel.lehman/code/rl_base/env/lib/python3.5/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", " from ._conv import register_converters as _register_converters\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "pygame 1.9.4\n", "Hello from the pygame community. https://www.pygame.org/contribute.html\n" ] } ], "source": [ "import sys\n", "sys.path.append(\"..\")\n", "\n", "import tensorflow as tf\n", "import lucid\n", "import atari_zoo\n", "from atari_zoo import MakeAtariModel\n", "\n", "from lucid.misc.io import show\n", "import lucid.optvis.objectives as objectives\n", "import lucid.optvis.param as param\n", "import lucid.optvis.transform as transform\n", "import lucid.optvis.render as render\n", "\n", "from atari_zoo import synthetic_inputs" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#tf.get_default_session().close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## High-level interface to optimize inputs to maximize activation of particular channels / FC neurons" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import atari_zoo.synthetic_inputs\n", "from atari_zoo.synthetic_inputs import make_regularization,visualize_neuron,cppn_default_f\n", "from lucid.misc.io.showing import images" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example: lane features in Rainbow Freeway network" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "algorithm = 'rainbow'\n", "env='FreewayNoFrameskip-v4'\n", "run_id = 1\n", "tag='final'\n", "\n", "out = visualize_neuron(algo=algorithm,env=env,run_id=run_id,tag=tag,layer_no=3,neuron=1,step_n=1024,regularization=make_regularization(L1=1e-8,TV=1e-8))\n", "\n", "\n", "images(out[0].transpose((2,0,1)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Same neuron, visualized through a CPPN (ala \"Differentiable Image Parameterizations\" on distill.pub)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: gs://download-dopamine-rl/lucid/rainbow/Freeway/1/graph_def.pb\n" ] } ], "source": [ "out = visualize_neuron(algo=algorithm,env=env,run_id=run_id,tag=tag,layer_no=3,neuron=1,step_n=1024,param_f=cppn_default_f,lr=0.001)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " 0
\n", " \n", "
\n", " 1
\n", " \n", "
\n", " 2
\n", " \n", "
\n", " 3
\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "images(out[0].transpose((2,0,1)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## More manual approach to integrating with Lucid (more flexibility but more verbose code)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: gs://download-dopamine-rl/lucid/rainbow/Freeway/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/FreewayNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/FreewayNoFrameskip-v4_1\n" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import gym\n", "import pylab\n", "from lucid.optvis.objectives import wrap_objective, Objective\n", "import matplotlib\n", "\n", "env = \"FreewayNoFrameskip-v4\"\n", "algo = 'rainbow'\n", "run_id=1\n", "\n", "#alternative parameterization that only optimizes the \"now\" frame\n", "def only_current_frame(shape):\n", " shape_1 = shape[:-1]+[1,]\n", " \n", " shape_2 = shape[:]\n", " shape_2[-1] -= 1\n", " \n", " print(shape_1,shape_2)\n", " \n", " current_frame = lucid.optvis.param.spatial.naive(shape_1)\n", " zero_frames = tf.zeros(shape_2)\n", " \n", " processed_current = tf.nn.sigmoid(current_frame)\n", " processed_frames = tf.concat([zero_frames,processed_current],-1)\n", " return processed_frames\n", "\n", "#param = lambda: only_current_frame([1,84,84,4])\n", "param = lambda: synthetic_inputs.image([1,84,84,4])\n", "\n", "\n", "tf.reset_default_graph()\n", "m = MakeAtariModel(algo,env,run_id,local=False)()\n", "m.load_graphdef()\n", "\n", "transforms = [\n", " transform.jitter(2),\n", "]\n", "\n", "pylab.gray()\n", "\n", "regularize = 1e-9*objectives.L2()-1e-9*objectives.L1()-1e-8*objectives.total_variation()\n", "\n", "font = {'family' : 'normal',\n", " 'weight' : 'bold',\n", " 'size' : 18}\n", "\n", "matplotlib.rc('font', **font)\n", "\n", "#loop through all available actions in the game\n", "for neuron in range(0,3): #len(action_semantics)):\n", " obj = objectives.channel(m.layers[-3]['name'],neuron)\n", "\n", " #call out to lucid\n", " out = render.render_vis(m, obj+regularize,\n", " param_f = param,\n", " transforms=transforms,verbose=False,thresholds=(512,))\n", " \n", " #now let's visualize the results...\n", " frames = len(out)\n", " fig = pylab.figure(figsize=(12,3))\n", " \n", " if neuron==0:\n", " fig.suptitle(algo) #action_semantics[action],fontsize=16)\n", " else:\n", " fig.suptitle(\"\")\n", "\n", " for y in range(frames):\n", " \n", "\n", " for x in range(4):\n", " num = (y*4+x)+1\n", " ax=pylab.subplot(frames,4,num)\n", " fig = pylab.imshow(out[y][0,:,:,x])\n", " fig.axes.get_yaxis().set_visible(False)\n", " ax.set_xticks([], [])\n", " \n", " if x<3:\n", " title=\"T-%d\" % (3-x)\n", " else:\n", " title=\"Now\"\n", " \n", " size = fig.get_size() # get fig size in pixels\n", " ax.set_xlabel(title)\n", " im = out[y][0,:,:,x]\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Feature inversions / caricatures\n", "\n", "In the spirit of https://distill.pub/2018/building-blocks/" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/SeaquestNoFrameskip-v4_2\n" ] } ], "source": [ "import atari_zoo\n", "import pylab\n", "\n", "algo = 'a2c'\n", "env = 'SeaquestNoFrameskip-v4'\n", "run_id = 2\n", "\n", "#do simple output neuron visualization (Q-value of action X)\n", "tf.reset_default_graph()\n", "\n", "session = atari_zoo.utils.get_session()\n", "\n", "m = MakeAtariModel(algo,env,run_id,local=False)()\n", "#load in model\n", "m.load_graphdef()\n", "m.import_graph()\n", "\n", "#print(session.graph.get_operations())" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "observations = m.get_observations()\n", "frames = m.get_frames()\n", "frames_float = frames / 255." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "transforms = [\n", " transform.jitter(2),\n", " #transform.random_scale([n/100. for n in range(80, 120)]),\n", " #transform.random_rotate([n/1. for n in range(-5,5)]) # + range(-5,5) + 10*range(-2,2)),\n", "]\n", "\n", "pylab.gray()\n", "\n", "#feature inversion objective\n", "@objectives.wrap_objective\n", "def dot_compare(layer, batch=1, cossim_pow=0):\n", " def inner(T):\n", " dot = tf.reduce_sum(T(layer)[batch] * T(layer)[0])\n", " mag = tf.sqrt(tf.reduce_sum(T(layer)[0]**2))\n", " cossim = dot / (1e-6 + mag)\n", " cossim = tf.maximum(0.1, cossim)\n", " return dot * cossim ** cossim_pow\n", " return inner" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "frames\n" ] }, { "data": { "text/html": [ "
\n", " 0
\n", " \n", "
\n", " 1
\n", " \n", "
\n", " 2
\n", " \n", "
\n", " 3
\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "pre-processed frames\n" ] }, { "data": { "text/html": [ "
\n", " 0
\n", " \n", "
\n", " 1
\n", " \n", "
\n", " 2
\n", " \n", "
\n", " 3
\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "a2c/conv1/Relu\n" ] }, { "data": { "text/html": [ "
\n", " 0
\n", " \n", "
\n", " 1
\n", " \n", "
\n", " 2
\n", " \n", "
\n", " 3
\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "a2c/conv2/Relu\n" ] }, { "data": { "text/html": [ "
\n", " 0
\n", " \n", "
\n", " 1
\n", " \n", "
\n", " 2
\n", " \n", "
\n", " 3
\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "a2c/conv3/Relu\n" ] }, { "data": { "text/html": [ "
\n", " 0
\n", " \n", "
\n", " 1
\n", " \n", "
\n", " 2
\n", " \n", "
\n", " 3
\n", " \n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "timestep = 500\n", "import numpy as np\n", "from lucid.misc.io import load, save, show\n", "from lucid.misc.io.showing import images\n", "# show original frames\n", "print(\"frames\")\n", "show(frames_float[timestep-4:timestep])\n", "\n", "# show observations\n", "print(\"pre-processed frames\")\n", "img = observations[timestep]\n", "images(np.transpose(img, (2,0,1)))\n", "\n", "# show caricatures\n", "for layer in m.layers[:-2]:\n", " layer_name = layer['name']\n", " print(layer_name)\n", " \n", " with tf.Graph().as_default(), tf.Session() as sess:\n", "\n", " objective = dot_compare(layer_name, cossim_pow=1.0)\n", "\n", " t_input = tf.placeholder(tf.float32, img.shape)\n", " param_f = synthetic_inputs.image([1,84,84,4])\n", " param_f = tf.stack([param_f[0], t_input])\n", "\n", " transforms = [\n", " transform.pad(2, mode='constant', constant_value=.5),\n", " transform.jitter(2),\n", " #transform.jitter(0),\n", " ]\n", "\n", " T = render.make_vis_T(m, objective, param_f, transforms=transforms)\n", " loss, vis_op, t_image = T(\"loss\"), T(\"vis_op\"), T(\"input\")\n", "\n", " tf.global_variables_initializer().run()\n", " for i in range(512): _ = sess.run([vis_op], {t_input: img})\n", "\n", " result = t_image.eval(feed_dict={t_input: img})[0]\n", " images(np.transpose(result, (2,0,1)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This gives a sense of what information DNNs are preserving as networks get deeper" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Look at particular neuron" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SeaquestNoFrameskip-v4_2\n" ] } ], "source": [ "import tensorflow as tf\n", "import gym\n", "import pylab\n", "import lucid\n", "import atari_zoo\n", "from atari_zoo import MakeAtariModel\n", "\n", "def dope_image(shape, add_noise=False):\n", " if add_noise:\n", " raw_frames = lucid.optvis.param.spatial.naive(shape, sd=0.5)\n", " else:\n", " raw_frames = lucid.optvis.param.spatial.naive(shape)\n", " processed_frames = tf.nn.sigmoid(raw_frames)\n", " return processed_frames\n", "\n", "#do simple output neuron visualization (Q-value of action X)\n", "tf.reset_default_graph()\n", "algo = 'apex'\n", "env = 'SeaquestNoFrameskip-v4'\n", "run_id = 2\n", "m = MakeAtariModel(algo,env,run_id,local=False)()\n", "#load in model\n", "m.load_graphdef()\n", "#m.import_graph()\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "deepq/q_func/convnet/Conv_2/Relu\n", "1024 [0.00784419]\n", "01: Direction_Cossim [..., ..., NHWC]: 0.01\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "0.00583659 0.11390039\n", "0.005510316 0.4873783\n", "0.0033509536 0.9695292\n", "0.0023913395 0.94546115\n" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from lucid.optvis.objectives import wrap_objective, Objective\n", "import numpy as np\n", "\n", "#create a lucid objective corresponding to advantage\n", "\n", "@wrap_objective\n", "def channel(layer, n_channel, ordering=\"NHWC\"):\n", " \"\"\"Tensor-order aware version of channel lucid objective\"\"\"\n", " if ordering=='NCHW':\n", " return lambda T: tf.reduce_mean(tf.transpose(T(layer),perm=[0,2,3,1])[...,n_channel])\n", " else:\n", " return lambda T: tf.reduce_mean(T(layer)[..., n_channel])\n", "\n", "@wrap_objective\n", "def L2c(layer=\"input\", constant=0, epsilon=1e-6, batch=None,channel=0):\n", " \"\"\"L2 norm of layer. Generally used as penalty.\"\"\"\n", " if batch is None:\n", " return lambda T: tf.sqrt(epsilon + tf.reduce_sum((T(layer)[...,channel] - constant) ** 2))\n", " else:\n", " return lambda T: tf.sqrt(epsilon + tf.reduce_sum((T(layer)[batch,...,channel] - constant) ** 2))\n", "\n", "@wrap_objective\n", "def direction_cossim(layer, vec, ordering=\"NHWC\"):\n", " \"\"\"Visualize a direction (cossine similarity)\"\"\"\n", " def inner(T):\n", " if ordering=='NCHW':\n", " _layer = T(layer)\n", " else:\n", " _layer = tf.transpose(T(layer),perm=[0,2,3,1])\n", " \n", " act_mags = tf.sqrt(tf.reduce_sum(_layer**2, -1, keepdims=True))\n", " vec_mag = tf.sqrt(tf.reduce_sum(vec**2))\n", " \n", " mags = act_mags * vec_mag\n", " return tf.reduce_mean(_layer * vec.reshape([1, 1, 1, -1]) / mags)\n", " \n", " return inner\n", "\n", "@wrap_objective\n", "def direction_neuroncossim(layer, vec, ordering=\"NHWC\"):\n", " \"\"\"Visualize a direction (cossine similarity)\"\"\"\n", " def inner(T):\n", " if ordering=='NCHW':\n", " _layer = T(layer)\n", " else:\n", " _layer = tf.transpose(T(layer),perm=[0,2,3,1])\n", " \n", " act_mags = tf.sqrt(tf.reduce_sum(_layer[:,5:6,5:6,:]**2, -1, keepdims=True))\n", " vec_mag = tf.sqrt(tf.reduce_sum(vec**2))\n", " \n", " mags = act_mags * vec_mag\n", " return tf.reduce_mean(_layer[:,5:6,5:6,:] * vec.reshape([1, 1, 1, -1]) / mags)\n", " \n", " return inner\n", "\n", "\n", "transforms = [\n", " transform.jitter(10),\n", " #transform.random_scale([n/100. for n in range(80, 120)]),\n", " #transform.random_rotate([n/1. for n in range(-5,5)]) # + range(-5,5) + 10*range(-2,2)),\n", "]\n", "\n", "pylab.gray()\n", "\n", "layer_idx = -3\n", "layer_name = m.layers[layer_idx]['name']\n", "\n", "print(layer_name)\n", "\n", "obj = channel(layer_name,60,m.channel_order)\n", "regularize =-0.0005*objectives.L1()-0.0002*objectives.total_variation()\n", "\n", "vec = np.zeros(64,dtype=np.float32)\n", "vec[60]=1.0\n", "#obj = direction_cossim(layer_name,vec)\n", "regularize =-0.000001*objectives.L1()-0.0000001*objectives.total_variation()\n", "\n", "obj = direction_cossim(layer_name,vec)\n", "regularize = -1e-6*objectives.total_variation()-1e-9*objectives.L2()-5e-7*objectives.L1()\n", "\n", "#regularize=0\n", "\n", "#regularize = -0.0003*objectives.L2()-0.125*L2c(channel=2)-0.0005*objectives.L1()-0.0005*objectives.total_variation()\n", "\n", "#param = lambda: only_current_frame([1,84,84,4])\n", "param = lambda: dope_image([1,84,84,4])\n", "\n", "out = render.render_vis(m, regularize + obj,\n", " param_f = param,\n", " transforms=transforms,verbose=True,thresholds=(1024,),\n", " print_objectives=[obj])\n", " \n", "#now let's visualize the results...\n", "fig = pylab.figure(figsize=(12,3))\n", "frames = len(out)\n", "y=0\n", "for x in range(4):\n", " num = (y*4+x)+1\n", " pylab.subplot(frames,4,num)\n", " val = out[y][0,:,:,x]\n", " print(val.min(),val.max())\n", " pylab.imshow(out[y][0,:,:,x],vmin=0.0,vmax=1.0)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pylab.figure()\n", "pylab.matshow(out[y][0,:,:,3])\n", "from lucid.misc.io import show, save, load\n", "save(out[0],\"output.npy\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Validating that optimized image has desired effect (i.e. does actually activate a particular feature map)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SeaquestNoFrameskip-v4_2\n" ] } ], "source": [ "import atari_zoo.utils\n", "import numpy as np\n", "out_img = np.load(\"output.npy\")\n", "\n", "algo = 'apex'\n", "m = MakeAtariModel(algo,env,run_id,local=False)()\n", "m.load_graphdef()\n", "#import importlib\n", "#importlib.reload(atari_zoo.utils)\n", "from atari_zoo.utils import conv_activations_to_canvas\n", "from atari_zoo.utils import fc_activations_to_canvas\n", "\n", "from lucid.optvis.render import import_model\n", "\n", "#get a tf session\n", "session = atari_zoo.utils.get_session()\n", "\n", "#create a placeholder input to the network\n", "X_t = tf.placeholder(tf.float32, [None] + m.image_shape)\n", "\n", "#now get access to a dictionary that grabs output layers from the model\n", "T = import_model(m,X_t,X_t)\n", "\n", "#print(session.graph.get_operations())\n", "\n", "import pylab \n", "\n", "rep_layer = m.layers[-3]['name'] #second-to-last-layer (representation layer)\n", "rep_layer_T = T(rep_layer)\n", "\n", "rep = session.run(rep_layer_T,{X_t:out_img})\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "rep_scaled = np.clip(rep,0,3)\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAD8CAYAAABXXhlaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJztnXm0FNW18H87KhrFCDgLKDgLiBhxwCGK+HxCfGriHJMPzWBWks84xBenZL0viTEmy2hi3suAiUZfTHDCYJxQGYxGRUFQEBAnFAiDCjjFAeR8f/TZVaf7Vtetnuve3r+1WPStqq59qrqr9z777EGccxiG0V58otUDMAyj+diDbxhtiD34htGG2INvGG2IPfiG0YbYg28YbYg9+IbRhtT04IvIMSLyvIi8KCIX12tQhmE0Fqk2gEdENgAWAv8GLAGeAk53zs2r3/AMw2gEG9bw3gOAF51zLwOIyHjgeKDsg7+ViBtQg0DDMNJZBLzhnHR2XC0Pfl9gcfD3EuDA0oNE5GzgbIAdgRk1CDQMI53hGY+r5cHPhHNuHDAOYLiIA0j6OerZsycA/fv3B2D+/PkADBkyJDpm5cqVAHz00UcArFmzBoBPfvKTHc73r/ffp5yswYMHF475178AePPNNwF4++23o2N22223on2rVq0qf43+/05/ZoHtttsOgE022STatmjRok7fJ1I4+3o/NVNZvXv3jo7p27cvAHPnzi1674EHxr/Hc+bMAWDTTTcF4usLp3wbbLABAOs+/hiAXltsAcBbb71Vdnw77LADAP/85z877OvRo0fR+N73nw3AJz5RcDMt9e/Lcg9rpZLPqyvKykItzr2lQP/g735+m2EYOacW596GFJx7oyg88E8BX3DOPVfuPcNF3AzSf/0+9alPAcXatxq626+6WkTvvPtuw2Up9boutXKWL1/ecFlZUFmD9toLiK3LRspq1nUNB2Y0co7vnFsnIv8XmARsAFyf9tAbhpEfaprjO+fuBe6t01gMw2gSDXfuVUqpia/OH4D169fXRcZGG20EwNq1a+tyvmbwrjfxlSxTos033xyAd955p9Pz61QiSVatpJn4rSSLU7UVqCMX4Ic//CEA3//+9+sqw0J2DaMNqdq5Vw1ZnHtZ2HDDgqGybt26DvtUE77lNWFenWC9evWKXu++++4APPnkk0C6RdIoZ9HQoUOj188++2xDZYU0+vPS5WGAxYsLYSeVXNfRRx8NwAMPPNBh38YbbwzAhx9+WPb9eXXumcY3jDYktxq/kvlpEt1tOW/bbbcFYPmKFQ2XpXS3e1gq69xvfxuAhQsXRvvuv//+hsiq9rqOO+44AO69t+BDT7JyQ1mm8Q3DKEvuvPpKtZq+XqT5EWohaf6u4bsffPBB2fet8Jq+UWiYLsTzblavbqjMVjNvXiGf7KGHHmq4rF133RUoDmnWkPE07rnnHgA+9uHT9cI0vmG0IfbgG0YbkjvnnmaNZTGD0uhKjinNXtOsw2pl7b333kCcgVcrzbiHGse/zAf5dIXPK8+yzLlnGEZZcqfx60W9f2l1OS10ymmOfjN+1dUB+L53AHbFe2iyGi/LNL5hGGXJ7XJeJWjoZNHrGvP5S9HlNF3mAxg4cGDhxSuvdPr+nXbaCYBXX321wz5NkNHkmKTgpbSlPsOoFNP4htGGdAuNHyZJpCVM1IMwoOeVDJpeSdL0SmkarGr6ww8/PNoWpbY+/3xmmdWy5ZZbFl74enyNpBKryagfpvENow2xB98w2hBbzquBrlwAM6+yxoweDcB9991Xl/MmVRaq5LqGDRsGwOuvvx5tW7q0uJi0BmBttdVW0TaNyVdZl//oR0BxzP2kSZMAePzxxzOMpHNsOc8wjFRaovENw2gMpvENwyhLS5bzhvgWVs89F5fhryY5Z4uE1k5alfdjX5G3u86Fq5WlNei0/lwjZVVCO8vq06cPkNymbbPNNgPiFmXaRk6/82ErtvcrCPIyjW8YbUjuvfpqCUBl1oBe1UXf/S4AV111VbSvXvX5S2XlRYO0UpZ6wQFmz56deEzY5FQbaOb9ulotS+9Z2HAU4hUFgA8/+sjm+IZhlMcefMNoQ3Jj6ldShUbZfvvtgeI2Uttssw0AL/vY765kzpms2mWpE0wDaMJsSs2z6IrXlVWWmfqGYZQlNxq/3tTrl1bLTmuoZdjQUO9dFlmqeTTXXsstQ2zlaLlnrfazZMmSDufJi7bS6znooIMAePTRRwHo169fdEzS+CFeogJ47733OpVVb7qTrLAV2+o1a0zjG4ZRni6t8QcMGAAktztuxq+6JmW8/sYbDZeldCdtZbJqJ2yEsu7jj03jG4ZRnpZW4DnssMOi14888kjF71dNH84rowo5WrGmgdRS+19DiyGe87a6bZiRP7SFun5fNJBn1qxZQPWttUzjG0YbYg++YbQhnTr3RKQ/cBOwLQVfxTjn3C9FpA9wCzAAWASc4pxLba9aq3NPu7hqwI6W0k4qsKlXdebYsQBMnDgx2rdmzZoqR1BM7969AVjlu8p2B2dRq2VdfNFFAPz0pz9tuKzucA+jzsbAW2+/XVfn3jrgO865QcBBwLdEZBBwMTDZObcbMNn/bRhGF6Di5TwRmQj8t/93hHNumYhsD0xzzu2R9l7V+EeNGgXA5MmTo32l2rxWutOvOsQ522/6nO2ufF177bVX9FrLjr/nHaVd+boaKWvPPfcEYMGCBamyGrKcJyIDgH2B6cC2zrllftdyClOBpPecLSIzRGTG60kHGIbRdDJrfBHpCTwM/Ng5N0FE1jjnegX7Vzvneqedoxkhu3vsUTA6FvjGEypLQ0MBLrnkEgCuvfbausjsihqkFbLK5ZSHsk4/7TQAxo8fXyepHenK97AzWXXV+CKyEXAHcLNzboLfvMKb+Pj/V1Y3XMMwmk2nATxSyEr5AzDfOXd1sOsuYCxwpf9/YsLbExkxYgSQXE980KBBQJywEnots8z/ny/TYipMDLnggguyDjWVqEFng9t2dReSNH0pjdT0eUMTncK2bJWidScBCGpPdio7wzGHAF8C5oiI1lK6lMIDf6uIfAV4FTgls1TDMFpKpw++c+5Ryk9RRtV3OIZhNIMunZ2nhDH/mtv+xPTp0ABZYf5z3759AZjry4Q301n0ta9+FSjOcSg3zUlCg4+0YlGY4ajdcpf6Kja1Xpfep9LWUxCbu2u9udvIe6ilqLUMtTn3DMNoK6yFlmF0I0zjG4ZRltbk43srI6xfV47tttsuer3c59jrnP6FF14A4vkqwPz58wsi/N/Vzq10mUQr+SaFSur41+v1+O0777xzdMzLL79c9J6hQ4cC8Oyzz1Y1ru4WfJJl3p2WjKWM9clY99xzDwBv+KpIIbpU/JxfKh66994AzJkzp4qRZ0Pv4Vbeb7K3lwkwcOBAAGbOnAnAsmWFQNiwJbeiy9of+PukvqyNNtooOuajtWszj8s0vmG0Ia2Z41eg8atFr+qTXqN8kNJQUH811yb8Yqo1sXp1+YxjldW3pKZ7GtVWH+puGr+ZskprJO7sNe4rvgdDIzCvvmEYucEefMNoQ1pq6k+YMCHad+KJJ2Y+jwaYvPnmm2WPqcbESmq3lIVWmMRb1Ll+QZqsVpj6SU03vvGNbwBxHYeFCxdWJKPR5dCj3A1iR6Re12a+6/OOO+4YHfOzn/0MgF/84hcA9OzZE4Cnn346OkarRb377rtFsjSQLKwmZaa+YRiptFTjFw3EO/pG+eo8b/lMo1Dzluu3nrTkV6u2Kq0IlOYALJW1zz77RPueeeaZKkeQTHdzuNUiK8kqqETWCN/+64knnqhAamWYc88wjNzQUo1/zDHHRPsmTZpUdGxpu+Nwm87FN/XzpjC4RhNClviEkLxqKx07VNaYI+9aOM+y1DJc5q3CesnSGoIaPBZiGt8wjNzQ0hZagwcPjl6XavykIJjSbaeeeioQhzpCcupnNajPoVEWUS3tt4yOaKsp9XKvXNmxEtzykrZqJ510EgC33357TbKTNH0W1DOvLeBefPFFoNjzr9ej7dU1lDz0/FeDaXzDaEPswTeMNiT3sfrbbhuX69cltq233hqAxx57DICzzjorOubRRx8FYKHP3Dty5EgApk6dWtvgUyh14KRl59VbViMxWdn47Gc/C8SZgY2UpajJ/1ZQYNOce4ZhpJK7AJ5qCEMlNb97jf8l7IoaRNGe6ADr169vqKwkuqIsDXvVEFetfwBxGK02Wzn/vPOAOGS2EZQ2ClErFeLgsDPOOAOIHZShc+/MM88s2pZWO8A0vmEYqXQLjZ+ESujpwzorCemsVlbSFVxzzTUAnH/++ZnPd+SRRwIwZcqUimTVm+4u61e+hZp+RlBZbr4GYemyXGihLVmypEiWBfAYhtFycqPxowHVSfPX+5c2rRJPV9KMWVKa6yWrEuota4MNNgBgp512irbtt99+ANx6220ALPLaXesqQuwjqhel19W/f/9o38cffwzEgWmaNjxkyJDomGnTpgGw//77A/DUU08BsbURppK/9fbbpvENwyiPPfiG0YbkztS/zZthGosc5tqrmbTbbrsBcWfV6667LjpGSxO30kw9/vjjo33a1krHrj3ie/ToER2jy5E333xz0Xl33XXX6LWaoHPmzi2SlYQ6B9U8XLx4cbRvwIABAEycWGhurEtId955Z6fX1Qia2dZK7+cLPib+Py+8EIAvfelL0TE33ngjAFdffTVZSarVoFONdd6c1+vSYB9IDviplHCa8s9ly8zUNwyjPNZCyzC6EabxDcMoS0vy8fXnSCvqQLYmFJW0n8rbUpQuB2qYps4BIZ7/v/TSS3WRVQ2hP0HHuMLntJ/gfRbqF6gVTbYKZdV6XeoriEK2g+qzpeTtu1EJffr0AeLkHF0CBFi+YkXm85jGN4w2pKUVeLJo+ZBqG03Wgq4qqMc2LfBFLRINzIC4EqxW3NEAIG2YCB2bQarHXxsjpnHTTTdFr3/0ox8BcOCBBwIwffp0oFj7jR49GogDQTT5Ryu8QFB1yGv8xx9/vKz8apqANqIXgLZIS2uVlgfCz11DfPU7sWrVqg7Hq0bXJqClxyQ12MyCaXzDaEMyP/gisoGIzBKRu/3fA0Vkuoi8KCK3iEiPzs5hGEY+yLycJyIXUFgt+JRz7lgRuRWY4JwbLyK/BZ5xzv0m7Ry6nNcVnSqVyEpzWmphxbByyjvvvAPEgUmaSZg0FWrGdWm+xHr/3dinCnO+Urqywy0J/Sy1ElSXzM4TkX7AZ4Hf+78FOBLQ8qQ3AidUM1jDMJpPVufeL4DvAuoB2hJY45zT/lZLgL51HluX49JLLwXg0EMPjbaNGTMGiJdhtF5g2ARxl112AeAFrx2SiJb/AsdhOcaOHQvE4achGjL8/vvvl31/qRWojU9a4VwFOPnkk4E4nFsz0/Jcorz0s8xy35tJpxpfRI4FVjrnZlYjQETOFpEZIjKjOv+jYRj1JovGPwQ4TkTGAJsAnwJ+CfQSkQ291u8HJHaycM6NA8ZBYY5fl1HnlCuuuKLsPs0LnzVrVod9uvyWFsDzcQZNr2hdttDXoKj2vv7664u2f/7zn49eR40+/XjqFbhTLaotNSFFG6iEQVAauKP+kbT6Ca0gL5pe6VTjO+cucc71c84NAE4DpjjnzgCmAif5w8YCrf12GIaRmYqSdETkCOBC79XfGRgP9AFmAV90zn2Y9v56efVLf/mTaIWX+Cjf4nvy5MkdjikNytFUToirqKhWSKqZXiqr3tel6boQtyZf7OvGnVynVlNKI6sHl1bZTaIZ3w2tdPSGD/jKm1e/osg959w0YJp//TJwQOXDMwyj1VjknmG0IS3Jx+8uQRrlZH3605+O9tXa1VQpDapRWSNGjIiO0Zh8zX7T7rBhgUfNHZg3bx4Qx3qHMe7aAuwl3/5r32HDABjlpzIAP//5z2u9pCJK7+GgQYOifboU+txzzxWNNZwuafy/Tpt0upJFViNJk6VTHp3uVIJWbQqbyVixTcMwUsmdxtcacAsXLuywb5jXPLNnz+5Ull7VEYcfDsDDDz9cyVA7oEtHSctqedEg9UK17XPeKugu19UOskzjG4ZRltxp/ErQFtorEiqPdOdf9VDWN7/5zWifBgdp/vzh3toJ20Ide+yxAPz6178G4Ac/+AFQHI6rrca1oovKUosLslldldAun1elaBCWJmylLVeaxjcMI5UurfHT0Ks62Hu9wyoy6iGv17U3Q4Oo7+N57/topKyRI0cCMGXq1IbLUrqSFs6zLNP4hmGUxR58w2hDWlpsM+Tggw8G4NVXXwVih11aIEYW1JkVmvqNmt4ktVJStId6WtnnNJKWN6E47l2DeTTnX2P/Q5larFEz3jRvPMwem+pN/EpQmZoVF4759NNPB+KAomrO32xq/bzyjml8w2hDrIWWYXQjzLlnGEZZWtpCq5G0YslmF5/cEiZdLFq0CIiTR4YMGQLEc2yIfQ5agSetSULadek8WxM3lvh8+hBt6BAG9UBcxw5iX8UaXw+gmffwuP/4DwCmTZsW7dMqxJpgpFV20khL1snrcp62MXvRt/GuVlYWTOMbRhvS7QN4kmRpEoquHGhbLA0BDvdVI0vTSKFjyyOtzJLUiiuteqxq85XeGhh5xBFAsWasN63UjBpuDHGCla4YqOYPU1LV+673VWvwJbXUSrsurZCsKxBJ2nf48OEAzJhR3mOlqy0fe+vPAngMw2g59uAbRhvSlqZ+JZQWvtQ4/xCtitPft8dKcqrVi1aa31owFGDw4MFAnBF41llnAfDXv/41Oka7AJdOXcKgI802e8tX0HnPZ51dfvnl0TFXXnllLZfRgbw69+ohy0x9wzDKkpuQ3UaRVNFHnUKlfemTKC1xnWYh7bjjjkCsxSB2JE6YMKHo2LCctS75KWnltRuFhqhC4Jz0Nfc+85nPAPH1AUyaNKno/TfccENmWeFyp9bKU8J7Vw3q+NP/V65cWdP5uium8Q2jDen2Gj8puaWcpk9ahitdFtJWWBAnFCk6tw+XAvX9pZRq+ZBmanolTEYpTUzR6raXXXZZtK1RiTZqUd1///3RttGjRwPpdQ81IEqDe7IE+aSh1s1rr73WYV+5IKhWEPpLqKBar2l8w2hD2tKrf8IJJwDFHuh6yPriGWcA0M979yHWlnfffTcAe+yxB1A8l9WwUq2Hr0EoWvseYm23zmu7Su7h5ptvHr3W8FcND91qq60AeOKJJ8peV70+r7322guA+fPnl5X1/IIFAOy5556dni/0Oeh1lPYxSLLQupJXv7T1WmeyzKtvGEZZ7ME3jDakLU39akhbAlRZ2/lY/zC7TjPdtMOvxoCHMeSaSab/J8WXl8r6o18+08CZelLaQkunMA8++GB0zN577w0kdwauBr2uHv5+fetb34r2aQDQn/70p6K/Q0qdcTrdCpfz1FzO8t1QZ6FWJgoDtyp5ZiyAxzCM3GAav0myhg4dCsTLe2HWlwaxaOCONktIsy528BbEsmXLqhx1ebbbbrvCub110qvOAUUaXAPxspte12q/jBrW7lNtW6qF1UEJ8RLkG2+80an8vH03akGzNqGQuWka3zCMsnT7AJ40dElNl46S8qtL545hnvjixYsLL/xcOA2tIqxLWaH2jCreeK2lv+JhEIouwylPPvkkAF/4wheibY888kin48iC+iGUegcUpQXX6JLmmWee2WFfWAkYknPlNURa/SxhAFX0eVWAWhnhHF+DZtQyU99MuAQ5d+7cimVVQ1q1pjRM4xtGG2Jz/CbJKp2fpqFVekLvvnqkP/I1+1/33urvfe970THjxo3LOuSItF4AjbqH++23X/RaA5ze12tN+D7ec889AFx//fUAzJw5E4jvE8T+EdXqGgS1evXqDufL23ejnrJsjm8YRlkyPfgi0ktEbheRBSIyX0RGiEgfEXlQRF7w//fu/EyGYeSBTKa+iNwIPOKc+72I9AA2BS4FVjnnrhSRi4HezrmL0s6TV1Nfs/JKC2NC7LBZ4GPI1fkEsXNwqe9dnibrpJNOKhy7dCkQm9gQZ/W9nMFJqNd1/HHHAXDXXXd1+p5qKb2HYX5BUn/2rISlvDUYR2XVq4pRvcpra92E8NrVQatZghdeeCEAV111VU2yKmG33XYD4kAqgDsmTKifqS8iWwCfAf4A4Jz7yDm3BjgeuNEfdiNwQoVjNwyjRXSq8UVkGDAOmAfsA8wEzgWWOud6+WMEWK1/l8NaaBlGY6mnc29D4NPAb5xz+wLvAReHB7jCr0fiL4iInC0iM0RkRnUrjoZh1JssATxLgCXOuen+79spPPgrRGR759wyEdkeSCxu5pwbR8FiYLiIg/zN8ZWwmsn6kmommtMezk+10k4lsvQ8pQE5WenOS1FdRda+++4LxBWGGylL0SQvDX5SH4vWIQBYUUF9wU41vnNuObBYRPbwm0ZRMPvvAsb6bWOBiZmlGobRUrJ69YcBvwd6AC8DZ1H40bgV2BF4FTjFOdfRLR6QV69+JWglHIhrr73gQ0cbeV19+/YFYIlfFahE1tixY6PX2o5KA16eeeaZsu/rSlq4GlnnnXsuEAcGQRzINHLkSADmzJkDFK8yaAKRJlcl1QDUY1b5AKK8BfBkitV3zs325yxlVGVDMwwjD1jknmG0IW0Tq3/aaadF+zSIRh0jGpwxcWLspthll12AuNjhP32QThhrr7nf3d0kbrWsbbbZBujYHCNsAqLOrqSAnUpkKaVNTUInWrmc/zB3QHMFLFbfMIzc0O01/sEjRgDwwgsvRPuyVGkpRZfhwpBdzZ9/1y+xtFozmqx0NDdfMwFHHXkkAFOmTImO0aU6zRrMUtZa0TBhiB1+2lC1XteldQH0uQ3rBKx3zjS+YRjl6fYVeB5//HEgbvwIcTKOVkkZPrywYBFW4DnxxBMBuOOOO4A44CYMvNHlPJrQSkmTMggsF6MySqsXhxpayRKUU9oY5MgEy6FRlFro1VrspvENow3p9nN8laUBMBB79StBK8+GNd01gKMZ81P1LbzlZXaXeXcrZZ3h6xX++c9/7vQ9WerqH3vssdFrbZlmXn3DMHKDPfiG0Ya0jakfNl9IKsuclWHDhkWv1Un4qi+93V1N4u4iq3Q5L0nWkCFDCsf4QK2XXnqpKllaXPVf2oKrqrNUhpn6hmGk0u2X8xQNva2V2bNnR6/DvvNGPgkbaqQ1I1Xq1QgjSxn1VmIa3zDakG6v8XfffXcgDsGEOKe+tMpOFsKqppqrnRduvvlmAM7wba27CwcccAAQtw2rhCxaPkSX5DTZR5NtwiaeWsNAq+GoDG0vDrBw4cKKx9pMTOMbRhvSNl79n/zkJ9E+DbwJt1WD1t97zwf1NPO65nprQ73QEIcc77///mXfr1pJa/iPGTMGgHnz5kXHaGJKln4B9aJRXn1tegpx49PutloRyjKvvmEYZbEH3zDakG7n3ItKZJc47qJMOuCcc87p9DxZymBr6y2C+P16Epby1io0LFoEwMknnwzAl7/85egYDVK69NJLi94f1h/QTrVaPFIz1ML2YVFeg89MrISwXoFOqTbbbLOiY8Lrqra/e1bUvK8UnUKd6wtyXnbZZdG+iy4qdIr7zne+A8BZZ50FwA033FD1OJuNaXzDaENa4twzDKMxmHPPMIyytGSOrz9HlYZTZiFL3vqBBx4IxJVzFy9e3OGYQYMGAcXLXKVoldfVvvbefya0S/7xj38MxKG+t912GwCHHXZYdIy2zNYgEZUZ1g3QYKN3fDXZ3l621v2rlaR889K6hWH9Oa0+q9Vtly9fXpP87rDEltSCrRXXlQXT+IbRhrRNAI/Jql7WaaeeCsAtt9zScFlp19W/f38gtoTCkGute5+lgnKaLA34UWtUrcGtt946Okat09I6/+FqhVZqsgAewzBygz34htGG5D6AZ4899ohea069ZtpVk12XxMYbbwzAhx9+WNH7IuekN/3OPPNMAP74xz/WZVx54Qu+KOX48eOjbUcddRQAkydPBuKAInVeAuy5554ALFiwoC7jSHLCKto/Xk390sYT4TZSprflAn6yBALp9QI8/fTTnR7fSkzjG0Yb0hLn3p5eiz///PN1l6Ghtm/7UNs0L4cu/WloaYiW09YlNm2eEKLhrmt97nYlDpyvf/3r0esJEyYA2cJX9dPq6cNgNSe8EaisRb5hyLXXXhvtu+aaaxoiq5FOMP1Ml/mlxz7+s13te9iHHHPMMQDcf//9Zc/Xq2RJVc8P8fKmOfcMw8gNtpxXIeoPCPnA+wb++1e/ArIlAVVLK5bzTvctxg866KBo33nnnQd0bGEdVqHRKjZZ5seVXFdpC+tKqUTWZhksKw3cCX1OtViD1WIa3zCMVHLv1c+C1tCDuD1xo0jz/I8bN67sPtUAqgW18g3AvffeC8T1/HTOqamzrUY1fZLmLg1i0co+tZL2mVar6SNrrYLVmyw+FNX0UWNTituy1xO9L7V+z03jG0YbkunBF5HzReQ5EZkrIn8RkU1EZKCITBeRF0XkFhGpT+F6wzAaTqfOPRHpCzwKDHLOvS8itwL3AmOACc658SLyW+AZ59xv0s7VDOdeM50qpcU2dykpZNkIuntegMraaaedon2vvvpqQ2UloRV4dCoTPic63dPPPy0zsasv520IfFJENgQ2BZYBRwK3+/03AidUPlTDMFpBp84959xSEbkKeA14H3gAmAmscc6t84ctAfqWOUXdyJKBpc6zLGgAj2ZbhfnmGoyhv/hbbrklAD179oyOiQI/vMavRNOH+fiPPPIIEIcna2DTCJ8HD/D4449nPne90eWzz33uc9E2XcK6/vrri44dOnRo9PrZZ5+tWma9tXylZGmlVRr4pTX4AH7ll3YJvlN5olONLyK9geOBgcAOwGbAMVkFiMjZIjJDRGY0tqyiYRhZyTLHPxk4xjn3Ff/3/wFGACcD2znn1onICOD/Oef+Pe1ceQ3g0ZbG1TY6bJd5dzNlJTXCqJV6+X+0YpImBun4klqxd+U5/mvAQSKyqRTSm0YB84CpwEn+mLHAxOqGaxhGs8kUsisiPwBOBdYBs4CvUpjTjwf6+G1fdM6lRkbkTeOXhn6GVVY0YUaLNgboAAAJ6klEQVQDbbSiShjAM2vWLADe9z6CvFxXo2SF35Xhw4cDsZ9EfR9h2KoGsWgDSdWIqg3TZDWSesvSwCC1HCFO3Mmrxs8Uueec+y/gv0o2vwwcUPHoDMNoORa5ZxhtiGXndRFZO+ywA9CaDra9/JTokEMOifapuV5JH/i0OPO0e5hWN6ESSsuh1+seamWocDlYl3/fePPNuspKw7LzDMNIxVpoGUY3wjS+YRhlaWkLrSQ0OSIpZFIru2ooaGkueIjaMVpX7ZRTTon2aXtrDZXVllVhRV8997bbbgvE89M5c+ZEx5Qu2fTv1w8orlSj89IHHnig7FizoPLX+flxI+eMpfPTHj5g5ZlnnomOefjhh4veo/clTK7RgCgNQV7kW3yH91lrDjz40ENAc30XQ339A71eiL9/Wsl56tSpQHEF3UqqBlsLLcMwckNL5viD9toLSK5cWy/0qk7x9d61Wi7AX/7yFyAONkmqsqJWgYZnatJOqPUqqehbL1qhQV70gThhSKqiAU1XX301UFxpVoN6brrpJiBufbXPPvtEx6xYsQKAe++7D6j/dYWNWTXE9mVfNbg7fl42xzcMoyz24BtGG9IS514WE1/NRO2/HqLBLNrfPo3HHnsMgK997WvRNs1zV4eZ5sbffffd0TFaNvoh73TSeGwNJoHi2PWsaL56Uq66OgVnzCgseoa1BSK5NQaxZKG0KOWjjz4KFJv693nTXBtP6P393e9+Fx0zbNgwAEaNGgXAtGnTgOI6A7fffjuNRGstALziTXxFHZE6nYM4MEmvVQto6vUCjBw5EohrBuiUcdmyZdExpUVZ99tvPwBmzpxZ7aXUFdP4htGGtMS5d58vJz169Ohon2r2K6+8EoiXfsJfbM171uU3dcppnjXEDRDW+Iy7//WOpcsvvzw6RsNMdalOHUy77LJLdMxLL70EdGyWoBl9odxmhGWqc3KVr/rTTMfUSn9/1AoKUatE72m43Dl79mwgrk2nDTa1zz3Ey6aT/HJnd3S4NVOWOfcMwyhLbpJ0dBlIK5YmtTmuhFp/abM0LtA54iI/16tEVli7T62d0qYbSbRCWyVZaDrv1/ukwTrqnwA4++yzAbj55puBuM21+mggXh79g6/d1xW0sPpidL6+du3ahsmqBNP4hmGkkpsWWqrpVYvq3FrnhxCHUR544IFF76m2Iqv6AzTII5T1jg/KUS2sGjq0QPSYakharUjT9JHnOUW71AsNXmLVKqA43VTRFN0LLrgAgIEDBwJxJWSIW0yXtgSLzk/17bBayRNPPNHqIdSMaXzDaEPswTeMNiQ3pr6SxWyfPn162X1RWWa/9KfFMsNlQX2/Lgfq/2/6Zbkk1KwPg09KM9QuvPBCAK666qqy59l3332BuFBniC6X6RQkDDjRTro8/XTZc9eLVd7EV2677TYADj744GibFia94oorgNhkD6cwej0aaKVNQXQaB+n3vKsRdsuNgnkSpnR5wDS+YbQhudP4ijqPwh7xag1omKhmew0ePDg65h//+EfReVT7hiWdNbBEj93ZN7vcf//9o2NuvPFGAI477jggDi3V3HKIHVr41llRqGsKSZpeSasv8HQTNH05NHAqLD+uaObd4YcfDhRbQQMGDABiDa/ZjKGW11BWfDhvXgmzO9VZqY5MvR4tJ56EWmxhgFMrMY1vGG1IbgJ4zjnnHADuuOMOIFsCThrRVSVcny5BXXPNNWXfrxVXtNpKaXhvkqzf/PrXQHFDzGhunoJWf9VgGJ1L/+1vf4uOUfnLvXy9h0lhxrUyaNAgAJ7zodFJ91BR30mY966oRaZLkWphhe2xNI//5j//GegaATx5lmUBPIZhlCU3Gr8U1X5hUox6m7Ok5aZpfNXiqm107qkBQRDPxY4++mgA/v73vwPFQTs65/27r903xoe0/va3v42OCWvQ1YNWaKtH/fUdeuihHY7R5CetVRdaOKXhztpGPGwnrisGU/0cvytp4bT6kJXIOvbYYwGYNGkSkB4CnIZpfMMwUrEH3zDakJYs52k543BZR5d87rzzTiAupa0ZXQATJxY6cWtW1K233trh3DpFwJuZGt8fLgtqYMl1113X6VhLl180uAbiDEJFq7SES2+XXnopEAe6pKEx7KUBNK1G8+hDU1+demqWTpkyBYg/P4gzLnWZU69Lp1bQtQN40kz83XffvfAiQ4sxrfyU5kBW56ned/0ehlNhKnCIm8Y3jDbEWmgZRjfCnHuGYZSlqRpfRF4H3gPeaJrQ+rAVNuZG09XGC/kc807OuY6x1SU09cEHEJEZzrnhTRVaIzbmxtPVxgtdc8yKmfqG0YbYg28YbUgrHvxxLZBZKzbmxtPVxgtdc8xAC+b4hmG0HjP1DaMNadqDLyLHiMjzIvKiiFzcLLmVICL9RWSqiMwTkedE5Fy/vY+IPCgiL/j/e3d2rmYjIhuIyCwRudv/PVBEpvv7fYuI9Gj1GENEpJeI3C4iC0RkvoiMyPt9FpHz/fdiroj8RUQ2yft9LkdTHnwR2QD4H2A0MAg4XUQGNUN2hawDvuOcGwQcBHzLj/NiYLJzbjdgsv87b5wLhG2Ifwpc45zbFVgNfKUloyrPL4H7nXN7AvtQGHtu77OI9AW+DQx3zg0BNgBOI//3ORnnXMP/ASOAScHflwCXNEN2jeOeCPwb8Dywvd+2PfB8q8dWMs5+FB6UI4G7KaR/vwFsmHT/W/0P2AJ4Be9jCrbn9j4DfYHFQB8KyW13A/+e5/uc9q9Zpr7eNGWJ35ZbRGQAsC8wHdjWOafNz5cD27ZoWOX4BfBdYL3/e0tgjXNOW/Pk7X4PBF4HbvDTk9+LyGbk+D4755YCVwGvAcuAt4CZ5Ps+l8WcewmISE/gDuA859zb4T5X+GnPzVKIiBwLrHTOzWz1WCpgQ+DTwG+cc/tSCOMuMutzeJ97A8dT+NHaAdgMOKalg6qBZj34S4H+wd/9/LbcISIbUXjob3bOTfCbV4jI9n7/9kD5OtjN5xDgOBFZBIynYO7/EuglIlpvIW/3ewmwxDmnnVFup/BDkOf7fBTwinPudefcWmAChXuf5/tclmY9+E8Bu3kPaA8KTpG7miQ7M1KorPEHYL5z7upg113AWP96LIW5fy5wzl3inOvnnBtA4b5Occ6dAUwFTvKH5W3My4HFIrKH3zQKmEeO7zMFE/8gEdnUf090zLm9z6k00TkyBlgIvARc1mrnRpkxHkrBvHwWmO3/jaEwZ54MvAA8BPRp9VjLjP8I4G7/emfgSeBF4DZg41aPr2Ssw4AZ/l7/Feid9/sM/ABYAMwF/hfYOO/3udw/i9wzjDbEnHuG0YbYg28YbYg9+IbRhtiDbxhtiD34htGG2INvGG2IPfiG0YbYg28Ybcj/B4KuXrRojo4TAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "canvas = conv_activations_to_canvas(m,rep_scaled,padding=1)\n", "pylab.imshow(canvas)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.8514978" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Check particular feature map we were maximizing (in this case 60)\n", "\n", "rep[0,60,5,5].mean()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 64, 11, 11)\n" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Visualize that feature map\n", "\n", "pylab.gray()\n", "pylab.matshow(rep[0,60],vmin=0,vmax=3)\n", "print(rep.shape)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: notebooks/Filter Analysis.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tf2onnx not installed, you will not be able to export to onnx\n" ] } ], "source": [ "import sys\n", "sys.path.append(\"..\")\n", "\n", "import tensorflow as tf\n", "import lucid\n", "import atari_zoo\n", "from atari_zoo import MakeAtariModel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## First convolutional layer filter analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook demonstrates an analysis of the first convolutional layer filter weights across different deep reinforcement learning algorithms and games." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "#the six algorithms currently included in the zoo\n", "algos = ['a2c','es','ga','apex','rainbow','dqn']\n", "\n", "#Let's have better titles\n", "title_dict = {'a2c':'A2C','apex':'Ape-X','ga':'GA','rainbow':'Rainbow','dqn':'DQN','es':'ES'}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from atari_zoo import game_list\n", "from atari_zoo import analysis_subset_games" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AsterixNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asterix/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asterix/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asterix/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asterix/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asterix/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asterix/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_3\n" ] } ], "source": [ "#Load in models and weights for the game Venture\n", "\n", "game_idx = 2 #11\n", "run_id = 1\n", "env = analysis_subset_games[game_idx]\n", "\n", "print(env)\n", "\n", "weight_dict = {}\n", "for algo in algos:\n", " for run_id in [1,2,3]:\n", " tf.reset_default_graph()\n", " session = atari_zoo.utils.get_session()\n", "\n", " #make atari model for algo + environment+ run combo\n", " local=False\n", " m = MakeAtariModel(algo,env,run_id,local=local)()\n", " \n", " #load in model\n", " m.load_graphdef()\n", " m.import_graph()\n", "\n", " #cache weights in this dictionary for future analysis\n", " weight_dict[(algo,run_id,)]=m.get_weights(session,0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Plotting a selection of Conv filters" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-0.7050736 0.4499853\n", "-0.19968036 0.21985775\n", "-0.2828679 0.26300716\n", "-0.66079605 0.32920772\n", "-0.7577713 0.80321676\n", "-2.2774427 1.8774911\n" ] }, { "data": { "image/png": "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xmPdzOxBM/vSzGprMS/yRIVgvdlmdmQh9oPPqWFm88xsdoyxXgjhSEt8MkNjjPsu5nXXtyRJPlgS1LpgOX2E3KMFjZkVes08Z2ZTY4w7FHlePUtaInxsZltYEoDUwczetSQZOI0hMUZ3xwetD9433/pgR0u+AhgtaX0wZek+lRDLnxJbH/z/HAghfGlmG5jZFDObZMnJfQMza2FJLPzPZnZUjPHB5TZoIZYDhW/J9jWziyyxc0y231ofbGiJOXgPM6tmZnfHGI8JIYyyxKpwaFqbnAqvfYclJvrUlgkiQQsaMwsh3GtmR5rZ6THGGzKe+4yZ7WlJgvB1lvR7KsbxMcaBKa+zriW3EA80s+0s+cred2b2jiV3fW5dVNYSYmWlwoKmGP8/B0IIu5nZPpacxLcws1qWLGI+MLPRlnxte+piXkeIlZ6QNDM+2cw6WrKIWcfMvrbkH74vWLKYeTmE0MiSdOFPzGzzGONP6a9oVvDPjDWzV2OMzZbvJ8gvWtAIIYQQIvfoW05CCCGEyD1a0AghhBAi92hBI4QQQojcowWNEEIIIXKPFjRCCCGEyD1LlBRc4lc0hVgiSg1lWxnRnBDLA80JITylzAndoRFCCCFE7tGCRgghhBC5p0rNKe+++26nf/rJBx1+8803Tr/99ttOt2vXzulNN93U6c8//7yoPuGEEyqN6d577y0yYrP58+c7/fLLLzu91157Ob3xxhs7vdFGGzk9Z84cpw877DCnb775ZqerVavmdM2aNZ2++uqrnT7rLN+4e/XV/S5bYw3fjf7jjz92+uijjzby4IM+Vb5FixZOr7feek737t3b6cMPP9zpDh06OP311187PXv2bKc7depUaUzlwnnnnec099dqq/l/Q8ycOdPpl156yem+ffs6PW3aNKc//fRTp//9739XGtOECROcvuce36WDx/C++/qWMuPG+ZY0DOPcbLPNnOY8ve2225z++9//XnQ8DRo0cJpz8ttvv3W6bt26Tj/99NNO//rrr07zvGVmdvnllzs9adIkp7t06eI0590zzzzj9EknneQ0X//YY491umfPnpXGVC787W9/c5rnh7feesvp+vXrO83997vf/c7prbfe2mnOib/+tXIP4I4dOzrdsGFDp3fbbTenhw8f7vQBBxzg9IgRI5zmdeDZZ591mnOA5w1uozp16ji94447Os3j8dVXX3V6wQLf/olz+rnnnjNy4YUXOs15P2PGDKcPOeQQp2+99Vanmzdv7jQ/Ex9fmuuE7tAIIYQQIvdoQSOEEEKI3KMFjRBCCCFyT5U8NJ988onTrHWuv/76Tm+44YZOsxbO2vs666zj9Pfff585plmzZjnN2uK6665bVH/55ZdOs17LOiI/I3n33Xedbtq0qdO//PKL02uttZbTX3zxhdP0txBu4zTeeOMNp+lZoKeC3ibWqH/44Qen6QNZlbjzzjudpn9gwIABTrN237VrV6fpsWFtnds+jdNOO83pv/zlL06PHz/eac6zH3/80elWrVo5/fvf/95perLooalVq5bTPXr0cPq7775z+tFHH3X61FNPdXry5MlOb7PNNk5PnZrdvJvzuH379k6fccYZTvfr18/pNm3aOP3OO+843bJlS6fp3Stn6Fukf4U+s/fff9/p2rVrO01PGI83ejXToG+HPi16XugrGzlypNN//OMfnR46dKjTvJaRjz76yGn6fm655RaneV7gnN1kk02c5vHYunVrp9M8NM2a+abe9KfymJ8yZYrTvXr1Kvo4r4304i0NukMjhBBCiNyjBY0QQgghco8WNEIIIYTIPVXy0LAuyDog/Sus49FPQv/IV1995XQpfoG1117badZn+ZrMSGH+AHND6GnJ8vXQI7P55ps7TU9EjRo1nGb9mH4GZv9wvGmwvtqoUSOnmWHA/cJtSt8RPRLc5uUM68rXXXed03369HGafgHmS8ybN8/pzz77zGlmNzDTxczsggsuKDpG+no4h+iZoUfh559/dnqDDTaoNIaKPP/8805vueWWRV8v63hiBsz555/v9CuvvFJ0PGaVtzP9gPvss4/T9A3RH8DzAucYX7+coa+P+4NeSu7vY445pujrMXuLx2sazEihL5AZKU899ZTTO+ywg9Nz5851mte2N998s+h4jjzySKd5njjllFOc5hw66KCDnKbvjNcV5uqk8dhjjzl94oknOn3//fc7zWsbt+kWW2zhNPc7x7w06A6NEEIIIXKPFjRCCCGEyD1a0AghhBAi91TJQ0N/CP0crDOzD9KHH37oNGvj7NFCv0kaHAP9HqzP0pPC57P2yDFzGxDmxvDv+XhWrg39Ceztw8+TBvt60DNDrxLryQsXLiw6pokTJzqdlcFQTjBzo3Hjxk4ze4EZKtWrV3ea25a1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rdjRCCGEWFFU6OW0iB8t+UfAbEt8W49YEuz4a5HXqG5mfSwx6m9tSWDqIq4wsytijAtT/m6WJd/4WyOiz1Ph8XH2W2zIKt3LaVX62rYQQgixxMSUb6AuxWt8bknrmkUNLi2EcHFBb21JSSrt7+plvG6bqo6tXNCCRgghhFgBxBgvCyE0tORbeD+EEI6PKpssNVrQCCGEECuOXmb2hiWBek0t+QKJWArkoRFCCCFE7llVgvWEEEIIUcYsUckpxektRJVZFoa7FYXmhFgeaE4I4SllTugOjRBCCCFyjxY0QgghhMg9VfqW02OPPeb0F1984fQmm2ziNA3I3333ndOzZs1yerPNNnN63XXXdbpr166ZY5o/f77TO+64o9Offvqp07/73e+cHjFihNMtWrRw+scff3S6R48eTj/yyCNOr7WW7wzP91uwYEFR/e677zq90047Ob3RRhs5veeeexoZOHCg03Xq1HH69ddfd7phw4ZOc7+efPLJTl922WWV3rMiBx54YNHH88yZZ/r+j2uv7Rtcr7aa/zcE9+8aa6zh9M8/+2iKhQt97lb16r7h+lVXXVVpTKeccorTm27qG1b/9NNPTv/www9Or7POOk6/8cYbRV9vu+22c/qPf/yj07169XK6Rg3fW2+DDTZwmp+R541q1ao5zTnJ8w73kZnZhRde6PT666/v9DfffOP0559/7jS3Aef56qv7U+17773n9A033FBpTOXC9ddf7/Qvv/xS9Pnff/+905xDPD55XQjBVyb69OlT6T2uueYap3/91efhcX/xmOLxwDFyznAe//nPf3b673//u9PcRhtu6Ptachust956TvP45BznnDnnnHOMcL9xu3799ddOcz/wPbmN+PccU9o8zUJ3aIQQQgiRe7SgEUIIIUTu0YJGCCGEELmnSh4a1ulYd6QfgB4b1pnpzeDzWaNL46uvvnKatdGPPvrIadYi6WlhHZC1VNbaybx585xec801nabnhePZeuutnZ4+fbrT9DN06NCh6HjMKvuGatas6XTt2rWd/vDDD4s+3r59e6c//vhjpzfeeOPMMZULPIa5P3k8UtM3xro1/QV8/TR4DNEX1rlzZ6dfeeUVpxs1alR0TPT10OdFWrVq5fTTTz/tNOc9zyOcg/Qb7LDDDk7XqlWr6HjMKvts6HXieYDbgPV/7ifO+1WJLE8Tjx9C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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from pylab import *\n", "idx = 0\n", "\n", "\n", "\n", "figure(figsize=(10,9))\n", "\n", "#loop across algortihms\n", "for algo in algos:\n", " subplot(231+idx)\n", " \n", " #turn off ticks\n", " plt.tick_params(\n", " axis='x', # changes apply to the x-axis\n", " which='both', # both major and minor ticks are affected\n", " bottom=False, # ticks along the bottom edge are off\n", " top=False, # ticks along the top edge are off\n", " labelbottom=False,\n", " left=False) # labels along the bottom edge are off\n", " \n", " plt.tick_params(\n", " axis='y', # changes apply to the x-axis\n", " which='both', # both major and minor ticks are affected\n", " bottom=False, # ticks along the bottom edge are off\n", " top=False, # ticks along the top edge are off\n", " labelleft=False,\n", " left=False) # labels along the bottom edge are off\n", " \n", " #plot conv weights\n", " atari_zoo.utils.visualize_conv_w(weight_dict[(algo,1)],title=title_dict[algo],subsample=6)\n", " \n", " idx+=1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Do networks pay more attention to the present than past?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Can we quantify how much different networks are paying attention to different input frames by looking at weight magnitudes of input-channel filters?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import collections\n", "import numpy as np\n", "\n", "\"\"\"\n", "This function looks at how the magnitude of filter weights is distributed across the temporal axis \n", "of the weights (i.e. the four input channels in Atari are frames nearer and nearer to the present).\n", "\"\"\"\n", "def calculate_temporal_lean(w):\n", " intensity = (w**2).mean(axis=(0,1,-1))\n", " return intensity" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AmidarNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AmidarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AmidarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AmidarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AmidarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AmidarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AmidarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AmidarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AmidarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AmidarNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AmidarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AmidarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AmidarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AmidarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AmidarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AmidarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AmidarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AmidarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AmidarNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AmidarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AmidarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AmidarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AmidarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AmidarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AmidarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AmidarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AmidarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AmidarNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AmidarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AmidarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AmidarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AmidarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AmidarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AmidarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AmidarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AmidarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AmidarNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Amidar/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AmidarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AmidarNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Amidar/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AmidarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AmidarNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Amidar/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AmidarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AmidarNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Amidar/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AmidarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AmidarNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Amidar/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AmidarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AmidarNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Amidar/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AmidarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AmidarNoFrameskip-v4_3\n", "AssaultNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AssaultNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AssaultNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AssaultNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AssaultNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AssaultNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AssaultNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AssaultNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AssaultNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AssaultNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AssaultNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AssaultNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AssaultNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AssaultNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AssaultNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AssaultNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AssaultNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AssaultNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AssaultNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AssaultNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AssaultNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AssaultNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AssaultNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AssaultNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AssaultNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AssaultNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AssaultNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AssaultNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AssaultNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AssaultNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AssaultNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AssaultNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AssaultNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AssaultNoFrameskip-v4_2\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AssaultNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AssaultNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AssaultNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Assault/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AssaultNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AssaultNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Assault/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AssaultNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AssaultNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Assault/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AssaultNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AssaultNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Assault/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AssaultNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AssaultNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Assault/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AssaultNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AssaultNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Assault/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AssaultNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AssaultNoFrameskip-v4_3\n", "AsterixNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asterix/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asterix/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asterix/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asterix/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asterix/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asterix/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsterixNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsterixNoFrameskip-v4_3\n", "AsteroidsNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsteroidsNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsteroidsNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsteroidsNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsteroidsNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsteroidsNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsteroidsNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsteroidsNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AsteroidsNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AsteroidsNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsteroidsNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsteroidsNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsteroidsNoFrameskip-v4_1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsteroidsNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsteroidsNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsteroidsNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsteroidsNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AsteroidsNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AsteroidsNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsteroidsNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsteroidsNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsteroidsNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsteroidsNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsteroidsNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsteroidsNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsteroidsNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AsteroidsNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AsteroidsNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsteroidsNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsteroidsNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsteroidsNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsteroidsNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsteroidsNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsteroidsNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsteroidsNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AsteroidsNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AsteroidsNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asteroids/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsteroidsNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsteroidsNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asteroids/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsteroidsNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsteroidsNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Asteroids/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsteroidsNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsteroidsNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asteroids/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsteroidsNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsteroidsNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asteroids/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsteroidsNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsteroidsNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Asteroids/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AsteroidsNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AsteroidsNoFrameskip-v4_3\n", "AtlantisNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AtlantisNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AtlantisNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AtlantisNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AtlantisNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AtlantisNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AtlantisNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AtlantisNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/AtlantisNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/AtlantisNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AtlantisNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AtlantisNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AtlantisNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AtlantisNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AtlantisNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AtlantisNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AtlantisNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/AtlantisNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/AtlantisNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AtlantisNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AtlantisNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AtlantisNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AtlantisNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AtlantisNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AtlantisNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AtlantisNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/AtlantisNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/AtlantisNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AtlantisNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AtlantisNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AtlantisNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AtlantisNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AtlantisNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AtlantisNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AtlantisNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/AtlantisNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/AtlantisNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Atlantis/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AtlantisNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AtlantisNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Atlantis/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AtlantisNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AtlantisNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Atlantis/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AtlantisNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AtlantisNoFrameskip-v4_3\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: gs://download-dopamine-rl/lucid/dqn/Atlantis/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AtlantisNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AtlantisNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Atlantis/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AtlantisNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AtlantisNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Atlantis/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/AtlantisNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/AtlantisNoFrameskip-v4_3\n", "EnduroNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/EnduroNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/EnduroNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/EnduroNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/EnduroNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/EnduroNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/EnduroNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/EnduroNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/EnduroNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/EnduroNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/EnduroNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/EnduroNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/EnduroNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/EnduroNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/EnduroNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/EnduroNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/EnduroNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/EnduroNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/EnduroNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/EnduroNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/EnduroNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/EnduroNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/EnduroNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/EnduroNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/EnduroNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/EnduroNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/EnduroNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/EnduroNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/EnduroNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/EnduroNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/EnduroNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/EnduroNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/EnduroNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/EnduroNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/EnduroNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/EnduroNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/EnduroNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Enduro/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/EnduroNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/EnduroNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Enduro/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/EnduroNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/EnduroNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Enduro/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/EnduroNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/EnduroNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Enduro/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/EnduroNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/EnduroNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Enduro/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/EnduroNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/EnduroNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Enduro/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/EnduroNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/EnduroNoFrameskip-v4_3\n", "FrostbiteNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/FrostbiteNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/FrostbiteNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/FrostbiteNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/FrostbiteNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/FrostbiteNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/FrostbiteNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/FrostbiteNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/FrostbiteNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/FrostbiteNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/FrostbiteNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/FrostbiteNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/FrostbiteNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/FrostbiteNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/FrostbiteNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/FrostbiteNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/FrostbiteNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/FrostbiteNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/FrostbiteNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/FrostbiteNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/FrostbiteNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/FrostbiteNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/FrostbiteNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/FrostbiteNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/FrostbiteNoFrameskip-v4_2\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/FrostbiteNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/FrostbiteNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/FrostbiteNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/FrostbiteNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/FrostbiteNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/FrostbiteNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/FrostbiteNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/FrostbiteNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/FrostbiteNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/FrostbiteNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/FrostbiteNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/FrostbiteNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Frostbite/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/FrostbiteNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/FrostbiteNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Frostbite/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/FrostbiteNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/FrostbiteNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Frostbite/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/FrostbiteNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/FrostbiteNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Frostbite/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/FrostbiteNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/FrostbiteNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Frostbite/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/FrostbiteNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/FrostbiteNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Frostbite/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/FrostbiteNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/FrostbiteNoFrameskip-v4_3\n", "GravitarNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/GravitarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/GravitarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/GravitarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/GravitarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/GravitarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/GravitarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/GravitarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/GravitarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/GravitarNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/GravitarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/GravitarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/GravitarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/GravitarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/GravitarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/GravitarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/GravitarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/GravitarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/GravitarNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/GravitarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/GravitarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/GravitarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/GravitarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/GravitarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/GravitarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/GravitarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/GravitarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/GravitarNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/GravitarNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/GravitarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/GravitarNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/GravitarNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/GravitarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/GravitarNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/GravitarNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/GravitarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/GravitarNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Gravitar/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/GravitarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/GravitarNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Gravitar/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/GravitarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/GravitarNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Gravitar/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/GravitarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/GravitarNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Gravitar/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/GravitarNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/GravitarNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Gravitar/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/GravitarNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/GravitarNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Gravitar/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/GravitarNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/GravitarNoFrameskip-v4_3\n", "KangarooNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/KangarooNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/KangarooNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/KangarooNoFrameskip-v4_1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/KangarooNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/KangarooNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/KangarooNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/KangarooNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/KangarooNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/KangarooNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/KangarooNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/KangarooNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/KangarooNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/KangarooNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/KangarooNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/KangarooNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/KangarooNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/KangarooNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/KangarooNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/KangarooNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/KangarooNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/KangarooNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/KangarooNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/KangarooNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/KangarooNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/KangarooNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/KangarooNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/KangarooNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/KangarooNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/KangarooNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/KangarooNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/KangarooNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/KangarooNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/KangarooNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/KangarooNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/KangarooNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/KangarooNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Kangaroo/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/KangarooNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/KangarooNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Kangaroo/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/KangarooNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/KangarooNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Kangaroo/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/KangarooNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/KangarooNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Kangaroo/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/KangarooNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/KangarooNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Kangaroo/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/KangarooNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/KangarooNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Kangaroo/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/KangarooNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/KangarooNoFrameskip-v4_3\n", "SeaquestNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/SeaquestNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/SeaquestNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SeaquestNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/SeaquestNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SeaquestNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SeaquestNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/SeaquestNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/SeaquestNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SeaquestNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SeaquestNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/SeaquestNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SeaquestNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SeaquestNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/SeaquestNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/SeaquestNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SeaquestNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SeaquestNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/SeaquestNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SeaquestNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SeaquestNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SeaquestNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SeaquestNoFrameskip-v4_3\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: gs://download-dopamine-rl/lucid/rainbow/Seaquest/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SeaquestNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SeaquestNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Seaquest/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SeaquestNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Seaquest/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SeaquestNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SeaquestNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Seaquest/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SeaquestNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SeaquestNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Seaquest/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SeaquestNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SeaquestNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Seaquest/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SeaquestNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SeaquestNoFrameskip-v4_3\n", "SkiingNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SkiingNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SkiingNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/SkiingNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SkiingNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SkiingNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/SkiingNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SkiingNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/SkiingNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/SkiingNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SkiingNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SkiingNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/SkiingNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SkiingNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SkiingNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/SkiingNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SkiingNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/SkiingNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/SkiingNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SkiingNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SkiingNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/SkiingNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SkiingNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SkiingNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/SkiingNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SkiingNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/SkiingNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/SkiingNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SkiingNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SkiingNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SkiingNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SkiingNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SkiingNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SkiingNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SkiingNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/SkiingNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/SkiingNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Skiing/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SkiingNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SkiingNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Skiing/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SkiingNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SkiingNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Skiing/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SkiingNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SkiingNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Skiing/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SkiingNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SkiingNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Skiing/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SkiingNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SkiingNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Skiing/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/SkiingNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/SkiingNoFrameskip-v4_3\n", "VentureNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/VentureNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/VentureNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/VentureNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/VentureNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/VentureNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/VentureNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/VentureNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/VentureNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/VentureNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/VentureNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/VentureNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/VentureNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/VentureNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/VentureNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/VentureNoFrameskip-v4_2\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/VentureNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/VentureNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/VentureNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/VentureNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/VentureNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/VentureNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/VentureNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/VentureNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/VentureNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/VentureNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/VentureNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/VentureNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/VentureNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/VentureNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/VentureNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/VentureNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/VentureNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/VentureNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/VentureNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/VentureNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/VentureNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Venture/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/VentureNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/VentureNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Venture/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/VentureNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/VentureNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Venture/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/VentureNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/VentureNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Venture/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/VentureNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/VentureNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Venture/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/VentureNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/VentureNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Venture/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/VentureNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/VentureNoFrameskip-v4_3\n", "ZaxxonNoFrameskip-v4\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/ZaxxonNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/ZaxxonNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/ZaxxonNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/ZaxxonNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/ZaxxonNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/ZaxxonNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/ZaxxonNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/ZaxxonNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/a2c/checkpoints/ZaxxonNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/ZaxxonNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/ZaxxonNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/ZaxxonNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/ZaxxonNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/ZaxxonNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/ZaxxonNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/ZaxxonNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/ZaxxonNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/es/checkpoints/ZaxxonNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/ZaxxonNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/ZaxxonNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/ZaxxonNoFrameskip-v4_3\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/ZaxxonNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/ZaxxonNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/ZaxxonNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/ZaxxonNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/ZaxxonNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/ZaxxonNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/ZaxxonNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/ZaxxonNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/apex/checkpoints/ZaxxonNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Zaxxon/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/ZaxxonNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/ZaxxonNoFrameskip-v4_1\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Zaxxon/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/ZaxxonNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/ZaxxonNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/rainbow/Zaxxon/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/ZaxxonNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/ZaxxonNoFrameskip-v4_3\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Zaxxon/1/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/ZaxxonNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/ZaxxonNoFrameskip-v4_1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model path: gs://download-dopamine-rl/lucid/dqn/Zaxxon/2/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/ZaxxonNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/ZaxxonNoFrameskip-v4_2\n", "Model path: gs://download-dopamine-rl/lucid/dqn/Zaxxon/3/graph_def.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/ZaxxonNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/rainbow/checkpoints/ZaxxonNoFrameskip-v4_3\n" ] } ], "source": [ "#first gather / calculate results\n", "algo_sum = collections.defaultdict(list)\n", "result = {}\n", "\n", "#loop across games\n", "for env in analysis_subset_games:\n", " \n", " print(env)\n", " \n", " #loop across algos\n", " weight_dict = {}\n", " for algo in algos:\n", " \n", " #loop across runs\n", " for run_id in [1,2,3]:\n", " \n", " tf.reset_default_graph()\n", " session = atari_zoo.utils.get_session()\n", "\n", " try:\n", " #make atari model for algo + environment+ run combo\n", " m = MakeAtariModel(algo,env,run_id,local=False)()\n", " \n", " #load in model\n", " m.load_graphdef()\n", " m.import_graph()\n", "\n", " #load in weights\n", " weight_dict[(algo,run_id,)]=m.get_weights(session,0)\n", " \n", " #store analysis result\n", " algo_sum[(env,algo)].append(calculate_temporal_lean(weight_dict[(algo,run_id)])) \n", " except:\n", " print((algo,env,run_id),\" failed\")\n", " \n", " #average over runs for one algorithm\n", " result[(env,algo)] = np.vstack(algo_sum[(env,algo)]).mean(axis=0)\n", " \n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from pylab import *\n", "#now, plot for each algorithm create a bar chart summarizing the results\n", "r_norm = {}\n", "\n", "#normalize by the last frame (e.g. let last frame have \"1.0\" as reference point)\n", "for key in result:\n", " r_norm[key] = result[key]/result[key][-1]\n", " \n", "import matplotlib.pyplot as plt\n", "\n", "#now average over all the games for each algorithm\n", "avg_intensity = {}\n", "for algo in ['apex','rainbow','dqn','a2c','es','ga']:\n", " arr = []\n", " for env in analysis_subset_games:\n", " intensities = r_norm[(env,algo)]\n", " arr.append(intensities)\n", " avg_intensity[algo] = np.vstack(arr).mean(axis=0)\n", " \n", " \n", "#make the bar charts\n", "fig = figure(figsize=(12,5))\n", "idx=0\n", "for algo in ['apex','rainbow','dqn','a2c','es','ga']:\n", " ax=subplot(231+idx)\n", " ax.bar(x=range(4),height=avg_intensity[algo])\n", " ax.set_xticks([0,1,2,3])\n", " ax.set_yticks([0,0.25,0.5,0.75,1.0])\n", " ax.set_yticklabels([0,0.25,0.5,0.75,1.0],fontsize=15)\n", " ax.set_xticklabels(('T -3', 'T -2', 'T -1', 'Now'),fontsize=15)\n", " ax.set_title(title_dict[algo],fontsize=20)\n", " idx+=1\n", " \n", "fig.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The gradient based algorithms in general seem to favor the present over the past; interestingly the trend is not present in the evolutionary algorithms." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making videos of rollouts" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import moviepy.editor as mpy\n", "from moviepy.video.io.ffmpeg_writer import FFMPEG_VideoWriter\n", "from IPython.display import clear_output, Image, display, HTML\n", "from lucid.misc.io.serialize_array import _normalize_array\n", "import numpy as np\n", "from atari_zoo import MakeAtariModel\n", "from atari_zoo.utils import MakeVideo" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: /space/rlzoo/a2c/MontezumaRevengeNoFrameskip-v4/model1_final.pb\n", "MontezumaRevengeNoFrameskip-v4 a2c 1\n", "Model path: /space/rlzoo/a2c/MontezumaRevengeNoFrameskip-v4/model2_final.pb\n", "MontezumaRevengeNoFrameskip-v4 a2c 2\n", "Model path: /space/rlzoo/a2c/MontezumaRevengeNoFrameskip-v4/model3_final.pb\n", "MontezumaRevengeNoFrameskip-v4 a2c 3\n", "Model path: /space/rlzoo/es/MontezumaRevengeNoFrameskip-v4/model1_final.pb\n", "MontezumaRevengeNoFrameskip-v4 es 1\n", "Model path: /space/rlzoo/es/MontezumaRevengeNoFrameskip-v4/model2_final.pb\n", "MontezumaRevengeNoFrameskip-v4 es 2\n", "Model path: /space/rlzoo/es/MontezumaRevengeNoFrameskip-v4/model3_final.pb\n", "MontezumaRevengeNoFrameskip-v4 es 3\n", "Model path: /space/rlzoo/ga/MontezumaRevengeNoFrameskip-v4/model1_final.pb\n", "MontezumaRevengeNoFrameskip-v4 ga 1\n", "Model path: /space/rlzoo/ga/MontezumaRevengeNoFrameskip-v4/model2_final.pb\n", "MontezumaRevengeNoFrameskip-v4 ga 2\n", "Model path: /space/rlzoo/ga/MontezumaRevengeNoFrameskip-v4/model3_final.pb\n", "MontezumaRevengeNoFrameskip-v4 ga 3\n", "Model path: /space/rlzoo/apex/MontezumaRevengeNoFrameskip-v4/model1_final.pb\n", "MontezumaRevengeNoFrameskip-v4 apex 1\n", "Model path: /space/rlzoo/apex/MontezumaRevengeNoFrameskip-v4/model2_final.pb\n", "MontezumaRevengeNoFrameskip-v4 apex 2\n", "Model path: /space/rlzoo/apex/MontezumaRevengeNoFrameskip-v4/model3_final.pb\n", "MontezumaRevengeNoFrameskip-v4 apex 3\n", "Model path: /space/rlzoo/rainbow/MontezumaRevengeNoFrameskip-v4/model1_final.pb\n", "MontezumaRevengeNoFrameskip-v4 rainbow 1\n", "Model path: /space/rlzoo/rainbow/MontezumaRevengeNoFrameskip-v4/model2_final.pb\n", "MontezumaRevengeNoFrameskip-v4 rainbow 2\n", "Model path: /space/rlzoo/rainbow/MontezumaRevengeNoFrameskip-v4/model3_final.pb\n", "MontezumaRevengeNoFrameskip-v4 rainbow 3\n", "Model path: /space/rlzoo/dqn/MontezumaRevengeNoFrameskip-v4/model1_final.pb\n", "MontezumaRevengeNoFrameskip-v4 dqn 1\n", "Model path: /space/rlzoo/dqn/MontezumaRevengeNoFrameskip-v4/model2_final.pb\n", "MontezumaRevengeNoFrameskip-v4 dqn 2\n", "Model path: /space/rlzoo/dqn/MontezumaRevengeNoFrameskip-v4/model3_final.pb\n", "MontezumaRevengeNoFrameskip-v4 dqn 3\n" ] } ], "source": [ "env = \"MontezumaRevengeNoFrameskip-v4\"\n", "\n", "for algo in algos:\n", " for run_id in [1,2,3]:\n", " tf.reset_default_graph()\n", " session = atari_zoo.utils.get_session()\n", "\n", " #make atari model for algo + environment+ run combo\n", " m = MakeAtariModel(algo,env,run_id,local=True)()\n", " video_fn = \"%s-%s-%d.mp4\" % (algo,env,run_id)\n", " MakeVideo(m,video_fn=video_fn)\n", " \n", " print(env,algo,run_id)\n", "\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "clear_output()\n", "display(mpy.ipython_display(video_fn, height=400))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making grids of videos" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['rainbow-SeaquestNoFrameskip-v4-3.mp4', 'apex-SeaquestNoFrameskip-v4-1.mp4', 'ga-PitfallNoFrameskip-v4-3.mp4', 'dqn-SeaquestNoFrameskip-v4-2.mp4', 'dqn-SeaquestNoFrameskip-v4-3.mp4', 'a2c-PitfallNoFrameskip-v4-2.mp4', 'apex-PitfallNoFrameskip-v4-3.mp4', 'rainbow-MontezumaRevengeNoFrameskip-v4-1.mp4', 'rollout_video.mp4', 'a2c-MontezumaRevengeNoFrameskip-v4-3.mp4', 'a2c-SeaquestNoFrameskip-v4-2.mp4', 'a2c-MontezumaRevengeNoFrameskip-v4-1.mp4', 'xy2rgb2.mp4', 'xy2rgb.mp4', 'es-MontezumaRevengeNoFrameskip-v4-2.mp4', 'rainbow-PitfallNoFrameskip-v4-1.mp4', 'dqn-PitfallNoFrameskip-v4-1.mp4', 'es-SeaquestNoFrameskip-v4-1.mp4', 'rainbow-PitfallNoFrameskip-v4-3.mp4', 'a2c-MontezumaRevengeNoFrameskip-v4-2.mp4', 'es-PitfallNoFrameskip-v4-1.mp4', 'apex-SeaquestNoFrameskip-v4-3.mp4', 'dqn-PitfallNoFrameskip-v4-2.mp4', 'rainbow-PitfallNoFrameskip-v4-2.mp4', 'apex-PitfallNoFrameskip-v4-1.mp4', 'a2c-SeaquestNoFrameskip-v4-1.mp4', 'es-MontezumaRevengeNoFrameskip-v4-3.mp4', 'apex-MontezumaRevengeNoFrameskip-v4-2.mp4', 'ga-MontezumaRevengeNoFrameskip-v4-2.mp4', 'es-MontezumaRevengeNoFrameskip-v4-1.mp4', 'a2c-PitfallNoFrameskip-v4-3.mp4', 'rainbow-SeaquestNoFrameskip-v4-2.mp4', '__temp__.mp4', 'dqn-MontezumaRevengeNoFrameskip-v4-3.mp4', 'ga-PitfallNoFrameskip-v4-1.mp4', 'ga-MontezumaRevengeNoFrameskip-v4-3.mp4', 'rainbow-MontezumaRevengeNoFrameskip-v4-3.mp4', 'ga-SeaquestNoFrameskip-v4-1.mp4', 'rainbow-MontezumaRevengeNoFrameskip-v4-2.mp4', 'ga-SeaquestNoFrameskip-v4-2.mp4', 'ga-MontezumaRevengeNoFrameskip-v4-1.mp4', 'es-PitfallNoFrameskip-v4-2.mp4', 'dqn-MontezumaRevengeNoFrameskip-v4-2.mp4', 'rollout_video_pitfall.mp4', 'apex-SeaquestNoFrameskip-v4-2.mp4', 'a2c-PitfallNoFrameskip-v4-1.mp4', 'dqn-PitfallNoFrameskip-v4-3.mp4', 'apex-MontezumaRevengeNoFrameskip-v4-1.mp4', 'ga-PitfallNoFrameskip-v4-2.mp4', 'apex-PitfallNoFrameskip-v4-2.mp4', 'rainbow-SeaquestNoFrameskip-v4-1.mp4', 'a2c-SeaquestNoFrameskip-v4-3.mp4', 'dqn-SeaquestNoFrameskip-v4-1.mp4', 'dqn-MontezumaRevengeNoFrameskip-v4-1.mp4', 'es-PitfallNoFrameskip-v4-3.mp4', 'ga-SeaquestNoFrameskip-v4-3.mp4', 'apex-MontezumaRevengeNoFrameskip-v4-3.mp4', 'es-SeaquestNoFrameskip-v4-2.mp4', 'es-SeaquestNoFrameskip-v4-3.mp4']\n" ] } ], "source": [ "import glob\n", "print (glob.glob(\"*.mp4\"))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "MontezumaRevengeNoFrameskip-v4 a2c 1\n", "MontezumaRevengeNoFrameskip-v4 a2c 2\n", "MontezumaRevengeNoFrameskip-v4 a2c 3\n", "MontezumaRevengeNoFrameskip-v4 es 1\n", "MontezumaRevengeNoFrameskip-v4 es 2\n", "MontezumaRevengeNoFrameskip-v4 es 3\n", "MontezumaRevengeNoFrameskip-v4 ga 1\n", "MontezumaRevengeNoFrameskip-v4 ga 2\n", "MontezumaRevengeNoFrameskip-v4 ga 3\n", "MontezumaRevengeNoFrameskip-v4 apex 1\n", "MontezumaRevengeNoFrameskip-v4 apex 2\n", "MontezumaRevengeNoFrameskip-v4 apex 3\n", "MontezumaRevengeNoFrameskip-v4 rainbow 1\n", "MontezumaRevengeNoFrameskip-v4 rainbow 2\n", "MontezumaRevengeNoFrameskip-v4 rainbow 3\n", "MontezumaRevengeNoFrameskip-v4 dqn 1\n", "MontezumaRevengeNoFrameskip-v4 dqn 2\n", "MontezumaRevengeNoFrameskip-v4 dqn 3\n", "[MoviePy] >>>> Building video composite.mp4\n", "[MoviePy] Writing video composite.mp4\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2501/2501 [01:13<00:00, 33.83it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[MoviePy] Done.\n", "[MoviePy] >>>> Video ready: composite.mp4 \n", "\n" ] } ], "source": [ "importlib.reload(atari_zoo.utils)\n", "from atari_zoo.utils import rollout_grid\n", "\n", "clip, clip_dict = rollout_grid(env=env,algos=algos,run_ids=[1,2,3],clip_resize=1.0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "clear_output()\n", "display(mpy.ipython_display(\"composite.mp4\", height=800))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: notebooks/Training log visualization.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "%load_ext autoreload\n", "%autoreload 2\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sample code for visualizing log files" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/joel.lehman/code/rl_base/env/lib/python3.5/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", " from ._conv import register_converters as _register_converters\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "pygame 1.9.4\n", "Hello from the pygame community. https://www.pygame.org/contribute.html\n" ] } ], "source": [ "import sys\n", "sys.path.append(\"../\")\n", "import atari_zoo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gathering logs across runs of Algo/Game pairs" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [], "source": [ "game = 'ZaxxonNoFrameskip-v4'\n", "algo = 'ga'\n", "\n", "from atari_zoo.log import gather_logs_across_runs, gather_logs_across_algos" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model1_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model1_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/ZaxxonNoFrameskip-v4_1\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model2_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model2_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/ZaxxonNoFrameskip-v4_2\n", "Model path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model3_final.pb\n", "Data path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/ZaxxonNoFrameskip-v4/model3_final_rollout.npz\n", "Log path: https://dgqeqexrlnkvd.cloudfront.net/zoo/ga/checkpoints/ZaxxonNoFrameskip-v4_3\n" ] } ], "source": [ "df = gather_logs_across_runs(algo,game,range(1,4),local=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plotting with seaborn" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.lineplot(x=\"frames\", y=\"score\",\n", " style=\"run\", hue='algo',\n", " data=df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gathering logs across Algo/Game pairs" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model path: /space/rlzoo/a2c/RoadRunnerNoFrameskip-v4/model1_final.pb\n", "Model path: /space/rlzoo/a2c/RoadRunnerNoFrameskip-v4/model2_final.pb\n", "Model path: /space/rlzoo/a2c/RoadRunnerNoFrameskip-v4/model3_final.pb\n", "Model path: /space/rlzoo/es/RoadRunnerNoFrameskip-v4/model1_final.pb\n", "Model path: /space/rlzoo/es/RoadRunnerNoFrameskip-v4/model2_final.pb\n", "Model path: /space/rlzoo/es/RoadRunnerNoFrameskip-v4/model3_final.pb\n", "Model path: /space/rlzoo/apex/RoadRunnerNoFrameskip-v4/model1_final.pb\n", "Model path: /space/rlzoo/apex/RoadRunnerNoFrameskip-v4/model2_final.pb\n", "Model path: /space/rlzoo/apex/RoadRunnerNoFrameskip-v4/model3_final.pb\n", "Model path: /space/rlzoo/apex/RoadRunnerNoFrameskip-v4/model4_final.pb\n", "Model path: /space/rlzoo/apex/RoadRunnerNoFrameskip-v4/model5_final.pb\n" ] } ], "source": [ "df = gather_logs_across_algos(['a2c','es','apex'],game,local=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plotting with seaborn" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df1 = df\n", "sns.lineplot(x=\"frames\", y=\"score\",\n", " style=\"run\", hue='algo',\n", " data=df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Listing checkpoints available for a given run of an algorithm" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "import atari_zoo\n", "import atari_zoo.model_maker\n", "import atari_zoo.log\n", "from atari_zoo import model_maker\n", "from atari_zoo.log import parse_checkpoint_info,load_checkpoint_info\n", "from atari_zoo.utils import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Print available tagged checkpoints" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['400M', 'initial', '2HR', 'Human', '10HR', '1B', 'final', '1HR', '6HR', '4HR'])\n" ] } ], "source": [ "tagged_checkpoints = model_maker.GetAvailableTaggedCheckpoints('a2c','SeaquestNoFrameskip-v4',3)\n", "\n", "print(tagged_checkpoints.keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get more detail on checkpoint at 1 hour" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'fname': '/space/rlzoo_raw/a2c_initial/SeaquestNoFrameskip-v4/initial_run_3/epoch_6000000.h5', 'initial': 0, 'frames': 24000000.0, 'time': 3524.2188017368317, 'final': 0, 'score': 715.4, 'policy_entropy': 2.269831657409668}\n" ] } ], "source": [ "print(tagged_checkpoints['1HR'])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: notebooks/Walkthrough.ipynb ================================================ [File too large to display: 25.6 MB] ================================================ FILE: requirements.txt ================================================ tensorflow-gpu matplotlib moviepy gym lucid pandas ================================================ FILE: setup.py ================================================ from distutils.core import setup setup( name='AtariZoo', version='0.1dev', packages=['atari_zoo',], license='Apache 2', long_description=open('README.md').read(), )